微軟MVP搶到一張硬座,什么水平?
真是很慚愧??吹骄W(wǎng)上那多哥們?nèi)绾稳绾斡米约簩?xiě)的工具、腳本,買(mǎi)到了回家的車(chē)票至少還是都是臥鋪的。但是我水平不行,只買(mǎi)到了硬座的(已完成支付,收到了12306的短信通知但未換紙質(zhì)車(chē)票)。既然只買(mǎi)到硬座的而以還有啥好說(shuō)的呢?更何況這是博客園首頁(yè)??!其實(shí)我只想說(shuō)我其實(shí)也做了不少工作,可能算是技術(shù)不行、也可能是繞了很多彎路、還有可能就是12306或95105105雖然很爛但其實(shí)他們也是在不斷的改進(jìn)的,今天找到的方法說(shuō)不定明天效果就不好。
首先講講做了哪些工作:
12306.cn
第一次訪問(wèn)了該網(wǎng)站之后我就想應(yīng)該可以寫(xiě)一個(gè)自動(dòng)化的工具,可以自動(dòng)幫我去進(jìn)行查票、訂票。最開(kāi)始的時(shí)候想的前面幾步都是手工實(shí)現(xiàn)的,然后通過(guò)構(gòu)造發(fā)送最終的訂票數(shù)據(jù)。來(lái)模擬提交。但不是很理想,雖然把本地所有的cookie信息都模擬提交了但還是返回不了正確的訂票信息。
于是就想寫(xiě)WinForm之類的工具,遇到了驗(yàn)證碼??紤]過(guò)用人工的方式但還是想著如果能夠破解圖形驗(yàn)證碼的話效果應(yīng)該更好。無(wú)奈花了一、兩天的時(shí)間來(lái)搞驗(yàn)證碼,做一過(guò)比如把圖片信息變?yōu)?和1分布的矩陣,通過(guò)查找相對(duì)位置的辦法來(lái)識(shí)別,但是識(shí)別效果并不好,因此放棄。
最近這兩天在網(wǎng)站方面已經(jīng)不考慮再寫(xiě)什么工具了,注冊(cè)了三個(gè)賬戶,把要買(mǎi)的人員全部加為聯(lián)系人,在查票的時(shí)候掛上如下簡(jiǎn)單的腳本,進(jìn)行自動(dòng)刷新而以。
setInterval(" this.document.getElementById('main').contentWindow.document.getElementById('submitQuery').click();",10000)
95105105
雖然電話訂票的渠道知道的時(shí)間要比網(wǎng)上稍晚點(diǎn),但網(wǎng)上看了一些文章好像用電話訂票的成功率要高點(diǎn)似的。剛開(kāi)始想的也是自動(dòng)來(lái)實(shí)現(xiàn)的,但是訂票環(huán)節(jié)中加了個(gè)驗(yàn)證碼,全流程的自動(dòng)化暫時(shí)是行不通了。但是由于之前接觸過(guò)Skype相關(guān)的API,因此還是寫(xiě)了一個(gè)簡(jiǎn)單的外掛,進(jìn)行自動(dòng)化重?fù)芎蜕矸葑C輸入等功能。寫(xiě)這個(gè)外掛過(guò)程中我還特決購(gòu)買(mǎi)了800多分鐘的skype套餐(還有一半未使用完)。
Skype通話錄音與盡快重?fù)艽a(需要安裝Skype4COM)
- /// <summary> /// 忙重?fù)?
- /// </summary> /// <param name="phoneNum">電話號(hào)碼,例如:01095105105</param>
- public void ReDial(string phoneNum)
- {
- try
- {
- objSkpe = new Skype();
- objSkpe.Attach(7, true);
- objCall = objSkpe.PlaceCall(phoneNum);
- //設(shè)置聲音文件輸出目錄
- string outPutFolder = System.Environment.CurrentDirectory + "\audio\"
- if (!Directory.Exists(outPutFolder))
- {
- Directory.CreateDirectory(outPutFolder);
- }
- string waveFile = outPutFolder + phoneNum + "_" + DateTime.Now.ToString("yyyyMMdd_hhmmss") + ".wav"
- //錄音
- objCall.set_OutputDevice(TCallIoDeviceType.callIoDeviceTypeFile, waveFile);
- //WriteLog("撥號(hào)中...");
- TimeSpan startTime = new TimeSpan(DateTime.Now.Ticks);
- //循環(huán)直到通話中
- while (objCall.Status != TCallStatus.clsInProgress)
- {
- //判斷撥號(hào)超時(shí)
- if (objCall.Status == TCallStatus.clsRouting)
- {
- Thread.Sleep(1000);
- TimeSpan stopTime = new TimeSpan(DateTime.Now.Ticks);
- TimeSpan val = stopTime.Subtract(startTime).Duration();
- if (val.TotalSeconds > 30)
- {
- objCall.Finish();
- }
- continue
- }
- //忙或關(guān)閉等各種狀態(tài)重播
- if (objCall.Status == TCallStatus.clsBusy
- || objCall.Status == TCallStatus.clsFailed
- || objCall.Status == SKYPE4COMLib.TCallStatus.clsFinished
- || objCall.Status == SKYPE4COMLib.TCallStatus.clsCancelled
- || objCall.Status == SKYPE4COMLib.TCallStatus.clsEarlyMedia
- || objCall.Status == SKYPE4COMLib.TCallStatus.clsRinging
- )
- {
- //如果是忙音,則需要先掛斷再重?fù)?
- if (objCall.Status == SKYPE4COMLib.TCallStatus.clsEarlyMedia || objCall.Status == SKYPE4COMLib.TCallStatus.clsRinging)
- {
- objCall.Finish();
- }
- //WriteLog("忙重?fù)?..");
- Thread.Sleep(1000);
- ReDial(phoneNum);
- }
- }
- // WriteLog("通話中...");
- }
- catch (Exception exp)
- {
- //WriteLog("Error:" + exp.Message);
- }
- }
雖然流程自動(dòng)化系統(tǒng)比較難實(shí)現(xiàn),但其實(shí)我也在這方面做了一些努力,比如動(dòng)用了微軟的SpeechSDK來(lái)參與我的搶票工作,以下是調(diào)用SppechSDK識(shí)別聲音到文本的結(jié)果展示。
但是由于目前還未找到直接將Skype的流轉(zhuǎn)為SpeechSDK可以識(shí)別的流,因此該方案目前暫無(wú)進(jìn)展。
效果:
12306.cn 本文標(biāo)題所指的硬座其實(shí)寫(xiě)的工具都沒(méi)有派上用場(chǎng),最后還是通過(guò)“人工”的方法來(lái)訂到的,可惜提交了不少于50次的臥鋪訂單但還是無(wú)法成功訂到。
95105105 開(kāi)發(fā)了不少功能,但是最實(shí)是實(shí)用的還是自動(dòng)重播那一項(xiàng),該渠道于昨天(1月18日)幫一朋友買(mǎi)到了臨客的臥鋪,也還算是聊以慰籍。本來(lái)今天還想給我自己訂的無(wú)奈很不給力兩個(gè)Skype從7:58開(kāi)始撥到8:30才撥通不說(shuō),好幾次都確認(rèn)訂票信息了,系統(tǒng)直接給我提示“系統(tǒng)繁忙,訂票請(qǐng)按1”,崩潰了。。。。(不更早一點(diǎn)撥號(hào)是因?yàn)橹鞍l(fā)現(xiàn)7點(diǎn)多撥的號(hào)到8點(diǎn)以后還是訂不了最新預(yù)售期內(nèi)的票,網(wǎng)站好像也有這個(gè)問(wèn)題。他是根據(jù)登錄時(shí)間來(lái)定的而不是當(dāng)前時(shí)間,所以早撥也沒(méi)用。)
總結(jié)一下:
網(wǎng)站和電話其實(shí)這兩個(gè)方向我都了相應(yīng)的探索但基本都屬于無(wú)功而返,反思這次做為一個(gè)程序員的的搶票行動(dòng),我覺(jué)得有以下幾點(diǎn)是需要考慮的:
1. 開(kāi)發(fā)工作脫離目標(biāo)
目標(biāo)雖然很清晰,但是在實(shí)際開(kāi)發(fā)過(guò)程中很容易進(jìn)了死胡同里,特別是感覺(jué)如果解決了很有成就感的技術(shù)問(wèn)題。當(dāng)然還有可能是由于技術(shù)水平有限,應(yīng)該有高手早就解決了我遇到的這些問(wèn)題了。
2.少即是多,準(zhǔn)備的東西太多,搶票時(shí)手忙腳亂的??纯次业墓ぷ髋_(tái)快照
無(wú)論怎樣。我覺(jué)得此次搶票行動(dòng)比起在車(chē)站排除買(mǎi)票,還是意思的多的。最后,祝大家都能買(mǎi)到中意的車(chē)票平安回家,新年快樂(lè)!
原文鏈接:http://www.cnblogs.com/wuhuacong/archive/2011/11/22/2259128.html
【編輯推薦】