https://train.qunar.com/qunar/checiInfo.jspq:車次代碼(如 T110)ver:毫秒級時間戳(防快取)cityname:固定 123456format=json、callback=XQScript_5(JSONP 格式)GET https://train.qunar.com/qunar/checiInfo.jsp?ex_track=&q=T110&format=json&cityname=123456&ver=1373813217828&callback=XQScript_5
'',
'q' => $trainNo,
'format' => 'json',
'cityname' => '123456',
'ver' => floor(microtime(true) * 1000),
'callback' => 'XQScript_5'
];
$ch = curl_init($url . '?' . http_build_query($params));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
CURLOPT_REFERER => 'https://train.qunar.com/list_num.htm',
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => false,
]);
$response = curl_exec($ch);
curl_close($ch);
// 去除 JSONP 包裹
if (preg_match('/^XQScript_5\((.*)\)$/', trim($response), $m)) {
$json = $m[1];
return json_decode($json, true);
}
return null;
}
// 使用範例
$data = getTrainInfo('T110');
if ($data) {
print_r($data);
} else {
echo "查詢失敗或車次不存在";
}
接口回傳 JSON 陣列,每個元素包含:
station:站名arrive_time:到達時間depart_time:出發時間stop_time:停靠分鐘數distance:累計里程問題:回傳站點順序非按里程排序,導致顯示亂序。
修正:以
distance欄位為鍵進行usort排序:
usort($data, function($a, $b) {
return $a['distance'] <=> $b['distance'];
});
train:schedule:{trainNo}。wechat-train/ ├── src/ │ ├── Service/TrainQueryService.php │ └── Controller/WechatController.php ├── config/api.php └── tests/TrainQueryServiceTest.php