我鄙視一切商業性質的搶票工具。這些公司取代了火車站門口兜售的個體,成爲了新時代的壟斷黃牛。
一道面試題:讓你實現一套自動搶票系統,你會怎麼設計?前端
大致來講,有這樣幾個功能須要實現:node
1. 模擬網絡請求。12306沒有提供過API,因此要能經過程序自動購票,只能去模擬(僞造)請求。請求的來源能夠是12306網頁版,也能夠從12306的APP裏抓包分析。面試
只是拿到請求地址,最多能夠查詢餘票,並不能成功購票,必須以帳號登陸才能得到購票權限。若是一次登陸就能夠,那解決途徑有不少,直接在手動登陸後把cookie取出給程序使用都行。編程
僅僅這種程度,幾乎全部會寫一些爬蟲的人都能解決。咱們爬蟲課程裏的實例都比這個要複雜。安全
但12306在高峯時常常會退出登陸狀態,須要不定時地從新登陸。這就遇到了自動購票最大的阻礙:服務器
2. 驗證碼。12306的驗證碼相信你們都體會過,正常人類都能被攔住,簡單的程序顯然是沒法搞定的。給三種解決思路:微信
a. 人工干預。程序遇到驗證碼後,由人去點擊正確的驗證碼,保證程序順利進行。這裏能夠用 selenium 實現,也能夠經過程序將驗證碼單獨取出供點擊。cookie
b. 打碼平臺。打碼平臺是一種神奇的存在,它會將你須要識別的驗證碼分配到一個個打碼人員的客戶端裏,他們幫你選擇正確的結果。固然這是要付費的,不過因爲高度規模化,這個成本被降到很低。網絡
這是上一種方法的增強版,只是不用你本身盯着程序運行,而是由其餘人幫你解決。機器學習
c. 圖像識別。12306的圖片驗證碼儘管奇葩,但也不是沒法識別,甚至一些機器學習的通用識別服務均可以達到必定的識別率。知乎上就有很多人給出過識別的參考方法和效果:
如何評價 12306 的圖片型驗證碼?而一些搶票工具更是把驗證碼識別功能做爲VIP功能來收費。
3. 定時刷新。解決了前兩個問題,購票的流程已經打通。只要在程序里加上定時功能就能夠自動購票了。這裏能夠選擇一直運行程序,定時發送請求,也能夠經過 Linux 的 cronjob、Windows 的計劃任務等實現定時運行。
不過到這一步爲止,只能說你實現了一個自動「購」票的腳本,離「搶」票還有很遠的距離。即便你把請求間隔調整得很低,在春運出票高峯也很難有效果。若是想要進一步提高效果,還得考慮:
4. 多帳號、分佈式請求。在你本身的電腦上用本身的帳號不停刷票,一來是速度是有瓶頸的,再快大約也須要幾秒鐘才能完成一次購票嘗試,二來這極可能致使你的帳號、IP被封禁。因此,你必須有足夠多的帳號和機器,能夠在極短期內發起大量的購票請求,才能把購票成功率提升到一個有競爭力的水平。從技術角度來講,這不算困難,各類隨開隨用的雲服務彈性計算就是知足你此類需求的。
以上幾點,基本就是一個搶票系統須要考慮的主要問題,接下來就是要在實踐中優化你的程序,提高性能和穩定性,考慮諸如時間間隔、服務器的選擇,以及購票條件的設定、通知發送等細節。
看到這裏也許有人要說了:
代碼在哪裏下載?怎麼用?
整這麼複雜幹嗎,XXX軟件早就實現實現了。
對此我要說的是,以上僅僅是對一個技術問題的分析討論,我沒有也無心開發一款實用的搶票軟件。因此今天這裏不會有任何代碼下載,也不會推薦任何軟件。
我鄙視一切商業性質的搶票工具。
咱們談論的技術自己不存在善惡。但使用技術的人/公司卻有立場,做爲大企業更應該承擔相應的社會責任。
當我在此文開頭設定那道「面試題」的時候,我想除了黃牛黨,真的會有公司這麼問嗎?通常正常公司也是問「若是你設計12306網站,如何防刷票?」吧。
可現現在,有多少體面的大公司,推出搶票工具或在本身的APP裏增長搶票功能,以此推廣或牟利。
在這裏,我我的建議不要使用這些工具。這並非僅僅是爲了立場而反對,而是這裏自己就有不少不安全因素。
1. 不少工具打着免費刷票的旗號,但等你真的用了就發現,不付費幾乎是買不到票的。甚至有時候你沒發現,就已經付了費,買了VIP/加速包。
2. 你覺得花了錢,就真的能夠買到票嗎?並非。即便按照他們明面上的說法,也只是給你分配更多的資源,提升你搶到的機率。但實際上怎樣,不得而知。反正搶不到最多退款唄。聽過「包生男孩」的偏方嗎:收你一萬,包生男孩,不靈退款。這些軟件即便什麼額外功能都不提供,僅僅是替你轉發購票請求,也能夠賺到錢。
已經有網友驗證過,某些工具裏顯示的「已搶票XXXX次」,其實只是前端頁面寫的代碼,並非後臺的真實數據,斷了網也會自動增長。固然咱們不能以此推斷說他必定沒有去刷,但客觀事實就是,他刷沒刷,刷的頻率如何,你並不知道。
就算真的沒有忽悠你,確實付了錢增長爲你搶票的資源,但你能夠想象一下:本來你們都是各自去搶,拼網速手速和運氣。後來有人付了錢,經過更好的渠道搶到了票。因而你們都開始付錢。付費渠道雖然更快,但資源也不是無限的,若是用戶增長到必定程度,必然要有個優先級。若是你是刷票公司,你會讓誰先買?想象一下銀行裏,你們都成了VIP客戶,VIP窗口和普通窗口,哪一個辦業務更快?你以爲刷票公司是會單純增長VIP資源,仍是會關掉絕大多數普通窗口,而後再開闢新的SVIP窗口、SSVIP……。
3. 使用搶票軟件,你必須提供帳號、密碼、身份證信息用於登陸和購票,有些還會要求你支付預付款。對於這些置社會公平於不顧的公司,你卻很信任他們的隱私保護?想一想我剛剛技術分析中提到的,提升搶票成功率須要大量的帳號,你以爲他們的帳號是從哪裏來的呢?
4. 一些更沒節操的黑產從業者也在這場搶票混戰中虎視眈眈,一不當心下載了帶木馬的搶票軟件,或者是被人用軟件合成的火車票騙了錢,這也都不是什麼新鮮事。
在現有鐵路運力沒法充分應對春運客流的客觀條件限制下,爲了能保證絕大多數人都有相對公平的機會,火車票價並不會像飛機票同樣隨市場需求水漲船高。可這些公司倒好,把這個空間做爲本身大撈一票的機會,頗有商業頭腦是吧。說到底,大家無非是取代上個時代的黃牛罷了。並且比起各地零散的黃牛,掌握着技術、渠道和大量用戶數據的大公司更強勢。久而久之地惡性循環,或許再過兩年的春節,不經過這些APP加價購票,就無法正常買到車票了。
好在12306也並無像你們覺得的那麼爛,這幾年的穩定性已經提高很多,今年聽說增長了應對刷票的「慢速排隊機制」:購票的時候,若是有用戶疑似使用機器或外掛搶票,將會被列入慢速排隊隊列,讓符合規定的用戶在正常速度中排隊。但願真的能有效果。
其實你們都很無奈,搶不到票回不了家,否則誰願意去給刷票軟件奉上金錢和隱私。這也是沒辦法的辦法。
一些前人總結的購票技巧,但願能增長買到票的機率:
1. 算好預售期,從出票就開始搶。
這個是最基本的了。不過今年的時間點已通過去。若是你沒遇上,或者搶了但沒搶到,也別放棄,還有機會。
2. 把握撿漏的時間點。火車票通常都不會在開票的時候所有放出,再加上不斷有人退票,因此即便如今顯示無票了,也仍是可能會有新票放出。幾個重要的時間點:
3. 曲線乘車。好比嘗試買到目的地的下一站/上一站(需補票),或者分段成兩個不一樣車次購買。
4. 電話購票,這個渠道常被人遺忘。當你們都在互聯網搶票的時候,也能夠嘗試下,或許有驚喜。購票電話:95105105。並且一個小技巧是,這個電話是區分鐵路局的,能夠加撥區號,去特定的鐵路局進行購票。
然而,這些也只能多增長一些買到票的可能性而已。黃牛、刷票軟件的存在,本質上是特定時間內的供求不平衡帶來的矛盾。若是這一點不能解決,即便防範了全部黃牛和刷票,也無法讓全部人都買到票。這場道高一尺魔高一丈的比拼還會不斷持續下去。
希望狀況在不久以後能夠逐步改善。此刻我也只能祝你們都能順利買到票,開開心心回家過個年。
PS:若是以爲路程太長,能夠看看咱們的教程,在微信裏也能夠直接寫Python哦 :-)
Crossin的編程教室 - 在線練習════
其餘文章及回答: