2011年8月1日 星期一

PHP curl 查詢機票座位(機位)

前言...

因為在暑假的某一天,
"突然"想去韓國自由行玩個一個禮拜,
不過因為決定的有點突然,
只剩不到一個月左右,
機票便宜的都訂光了,
只剩下貴兩三倍的機票,
於是我們就去找旅行社幫忙,
結果旅行社只能幫我們查詢,
某天去的班機和某天回來的班機,而且還要某家航空公司
而不能"全部"查詢,只能要我們慢慢手動一個一個點...
...這...並非人力所及
幾十個航班,加上20天內都有空,只要玩個5~6天,在加上每天都會有機位新釋出
意思是說每天都要點個(保守估計)20航班 x 15天的去回=300up次 (一次可以查去回)
每次查詢還要十幾秒鐘的時間...

相信很多人都有此困擾 = =

因此最後決定動用"程式"的力量︿︿

(最一開始我是想說應該有人已經有寫出來了,
不過簡單google一下,也沒有發現,最後只好自己動手了)

由程式來解決問題...

最後的機票是找到比最便宜貴約1.3倍的價錢(手動的話...大概這次出國就要放棄了)
(不過結果證實,下次要出國還是要趁早決定)


==============================

==============================

進入正題

是使用php+curl的方法,在這裡只有把curl的方法列出來

至於文字拆解就不詳述(而curl的目標,就是某旅行公司...)

(實際上測試了3家旅行業者,找一個最簡單的列出來)

===============================

//第一步,取得所有適合的班機

$ch = curl_init();

$url = "http://www.eztravel.com.tw/ezec/freefit/ec_fit_main_query.jsp?city_from=TPE&city_to=SEL&ticket_type=R&service_type=4&ticket_class_section=2&international_cd=&searchBegDate=20110811&priceRange=0,12000&wt_search=fit2";
//這個url是先去他的網站查詢適合班機的結果,也可以自己改數值
//例如 priceRange=0,12000 就是0元到12000元


curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
//模擬由你的瀏覽器進入,在這個旅行網站好像不需要(有點忘了),不過另某家需要
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_REFERER, "http://www.eztravel.com.tw/");
//這行最重要,是這旅遊網站認證的地方,沒有的話會無法取得資料
$result = curl_exec($ch);



//第二步,查詢機位

//這邊是設定給網站查詢的設定值(最好都不要少)
//至於取得方法,可以看最後表單的輸出結果
//也可以用google chrome右鍵檢查元素也可以得到
//而value,基本上是從你剛剛取得所有適合的航班的頁面可以取得


$tmp = 'prod_no:'.$prod_no.'
beg_date:'.$beg_date.'
end_date:'.$end_date.'
tkt_type:'.$tkt_type.'
ticket_type:'.$ticket_type.'
arg:1
arg:'.$prod_no.'
arg:20040815
arg:1
arg:TPE
arg:TPE
arg:2
hOpenChk:
bookYn:'.$bookYn.'
goPeople:'.$buyNum.'
Choice1:'.$buyNum.'
kind:'.$prod_no.','.$beg_date.','.$end_date.',1
Choice1:0
kind:'.$prod_no.','.$beg_date.','.$end_date.',3
Choice:'.$buyNum.'
Choice:0
h_checkInDateT:
checkInDateT:'.$checkInDate.'
f_checkin_date2:
checkOutDateT:'.$checkOutDate;
//echo $tmp;
$tmp = str_replace(":","=",$tmp);
$tmp = str_replace('
',"&",$tmp);

$post_login = $tmp;


$ch = curl_init();
$url = "http://www.eztravel.com.tw/ezec/freefit/ec_fit_flypath_searching.jsp";

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
//如果跳頁,跟的跳,這網站好像不會用到
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_login);//給予參數設定值
curl_setopt($ch, CURLOPT_REFERER, "http://www.eztravel.com.tw/ezec/freefit/ec_fit_date_query.jsp");
//這行這網站會驗證
$result = curl_exec($ch);
return $result;



//result 就是結果摟!!就是這樣

===============程式碼 END==============

最後的執行結果是存在mysql裡面,方便查詢

最後的結果(候補沒顯示)