訂票程式


前年在板橋工作的時候(現在搬回大甲了),因為每個禮拜都要往返於板橋於大甲之間,交通公具又是火車,常常因買不到火車座位而苦惱,後來想了個辦法,試了幾次效果還不錯,提供大家參考。
一開始的想法是這樣的,如果我能寫個程式,讓電腦幫我去按訂票的那個鈕的話,是不是可以省下我不少時間呢?嗯,想要偷懶一直是人類之所以會進步的原因。剛好我學過一點點Delphi,Delphi有個元件叫WebBrowser,可以讓你載入網頁,如果我能將網頁載入,然後將滑鼠移到按鈕上,讓他每60秒幫我按一次,那應該會幫我訂到票吧?於是我寫了一些程式碼,類似這樣

按某按鍵後載入訂票網站
WebBrowser1.Navigate(WideString('http://railway.hinet.net/'));

按某鍵後開始按網頁上的「開始訂票」
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
當然上面那二行必須要設timer讓他每隔60秒就去執行

就這樣,很簡單就完成了幫忙按訂票的程式了,試過以後當然缺點很多啦,例如
一、使用時會獨佔一台機器,無法再做其他事。因為他是要按螢幕上的某個地方,所以我們不能再操作這台電腦,只能放著讓他自己執行。
二、效率不彰,有時瀏覽器還會當掉。上面的程式很陽春,沒有去判所當我們按下按鈕後是否有執行成功(回應200),執行成功是否有訂到票,這些都是可以再改進的地方。

改用按鍵精靈


哎,自己寫程式沒啥天份,總是比不上別人現成寫好的啊。相信很多玩過線遊的人都會有打怪打到煩的時候,如果這時候有人可以換手來幫忙打的話該多好,於是有人就搞出了自動練功程式,自動撿寶,自動補血,自動砍別的玩家,反正什麼都自動,你只要把電腦開了就沒事了,打線上遊戲打到這種地步,那還叫遊戲嗎,哈,不過每個人想法不同啦,有人只是想打寶賺錢咩,我也曾用過這類的程式,例如現在要說的按鍵精靈,以前我玩「奇蹟MU」的時候就用過他,只要把錄好的巨集一直重複的播就行了,還會自動撿寶物耶,想起來還真是不錯,那麼這個和網路訂票有什麼關係呢?其實這再清楚也不過了,人家都跟你說是「按鍵精靈」了,那當然你想按那個地方只要設定一下他就會幫你去按囉。按鍵精靈的設定、教學網路上相關資料很多,只要gOOGLE一下,一定滿意的啦。不過用按鍵精靈還是有我說過的上面那兩個問題,即獨佔電腦、效率不彰,不過我是很滿意了啦,畢竟電腦放著人去看電視讓他跑,我們也可以休息一下咩。

再精進


上面都是從使用者的操作來思考訂票的問題,如果換個角度,從網路的溝通方式來思考這個問題的話,嗯,或許我們可以模仿瀏覽器送資料給訂票伺服器的方式來送資料吧?於是我們想辦法看看瀏覽器是送了什麼資料給伺服器了。下面這一串就是瀏覽器送給伺服器的資料了,以GET的方式傳送。
http://railway.hinet.net/trw_/order_nof1.jsp?personId=身份証號碼&fromStation=車站&toStation=車站&getinDate=日期&orderQty=張數&trainNo=次車&returnTicket=0
於是我們只寫一個能反覆這樣送資料的程式就行了,我用perl來做這個工作,因為還蠻容易用的
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$ua->agent("$0/0.1 " . $ua->agent);
my $url= '上面那一串東東';
$req = HTTP::Request->new(GET => $url);
$req->header(.......);
$res = $ua->request($req);
if ($res->is_success){...}
header上要加上一些東西,如Referer, Host等
雛形大致是這樣,當然可加個迴圈讓他一直跑,不過這個方法可能研重影響伺服器的作業,使用時最好設個sleep休息,不一直重覆的送。優點是上面提的那兩個問題都解決了,so far so good.

美好的過去


好景不常,現在台鐵的訂票多了一道看門手序,就是要輸入驗証碼,就像我們在blog上回文一樣,多了一個圖示來讓我們輸入圖中的文字,這是一個防止機器人隨意post文的好方法,台鐵也是從善如流,將這個程序用到其網路訂票系統上,現在用上面那些方法都沒得搞了,只好再找其他方法了,是否大家有什麼好方法呢?不防也提出來大家討論討論囉。

總結


現在寫這些東西的原因是因為現在他可能沒法用了(那你還寫個屁啊,哈),要是以前寫不知道會不會犯法,總覺得網路訂票這種事很難有公平的,厲害的人早晚會寫出應對的程式(那當然不是我,我只會學別人),再來就是數立落差的問題,很多老人家根本不會電腦,語音訂票對他們也太煩繁,常常看到一些老灰仔到售票口買票時,售票員跟他們說他要的班次沒票了,他們回答說:「還那麼多天就賣完了」,一付難以置信的樣子,其實那些老人家哪知道票早就在網路上被訂光了啊,網路的便利確實為許多人帶來便利,從另一個方面看,他也給一些人帶人不便,覺得政府應該考慮給老人家多一些保障,很多地方他們都是相對的弱勢,哎,怎麼會寫到這呢,由感而發吧。
arrow
arrow
    全站熱搜

    jck11 發表在 痞客邦 留言(6) 人氣()