今天是春運的第一天,大家都搶到票了嗎?有多少打工人是定時搶票,不停地重新整理網頁,最後仍然不得不花大價錢買「搶票加速包」才買到票的?
這兩天關於「12306 已申請防止自動搶票專利」的新聞沖上熱搜,引發廣大網友的關註。
那麽,為什麽有了軟件加持,就真的能買到緊缺的車票呢?如何才能防止自動搶票呢?今天從技術的角度來聊聊。
圖片來源:網絡截圖
網上購票時,到底發生了什麽?
在 12306 上買火車票,和在淘寶、京東這些電商網站上買東西,基本的流程是相似的,大概可以分成登入、查詢、選擇、確認、支付這樣幾個步驟。
登入是購票的前提,它會驗證使用者的身份是否是自己聲稱的身份,涉及個人資訊的確認。
其原理也很簡單:使用者輸入自己的使用者名稱和登入密碼,購票系統在自己的使用者數據庫中查詢,看看使用者名稱和密碼是否正確。如果正確的話,就認為使用者身份可信。
圖片來源:網絡截圖
在這一階段,風險在於使用者身份可能被仿冒。仿冒者可能會大量嘗試不同的密碼,或者使用其他網站泄露的密碼,來仿冒真正的使用者身份。
而通用的解決方案是雙管齊下:當使用者連續幾次輸錯密碼,就在一段時間內禁止登入;以及在使用者輸入密碼後,再經過一個驗證步驟,來讓使用者拖拽拼圖,或者在一系列圖片中找到符合要求的圖片。
過去的 12306 曾因為驗證難度過高而為人詬病——在早期,12306 的第一次驗證透過比例只有可憐的 8%。當然,在經過多年持續改進後,這一問題已經被解決得差不多了。
確認了使用者身份後,接下來就是一路坦途。使用者先根據自己的出發地和到達地查詢余票情況,然後選擇自己想要的車次;然後選擇乘車人和座位資訊,確認選擇正確後,支付票款。
這個過程,其實和使用者把身份證遞給火車站售票處的工作人員、由工作人員代為選票的過程是一樣的,只不過實作了完全自助而已。
有余票時,這個過程當然沒有問題,大家按照先來後到的順序逐一購票就好。但若是余票不足,而大家又都想買到票,那麽就不免有人想要上一些技術手段了。
為什麽技術手段可能可以搶到票?
購票時的技術手段,就是自動化搶票。自動化搶票的基本思路,是讓電腦模擬人的行為。
個人使用:若是開發一個僅僅自己使用的自動化搶票程式,還是比較簡單的。先用自己的個人資訊登入,人工透過身份驗證,然後以較高的頻率持續查詢想要的車次,當查詢返回的數據表示有余票時,馬上下訂單。
此時的關鍵,在於分析返回的查詢結果。而這也不難,畢竟查詢結果是返回的一串文字,從中提取資訊比較容易。這就像是站在售票處視窗,過兩分鐘就問一次有沒有票一樣,反正 12306 的伺服器是機器而不是售票處工作人員,只要計算能力允許就能做到有問必答,不會覺得這樣問來問去很煩。
多人使用 :而若是要為許多人搶票,就會麻煩一些。幫助使用者登入和透過驗證比較麻煩,畢竟讓電腦像人那樣辨識圖形、透過驗證過程還是有些難度的——驗證碼發明出來,就是為了讓電腦難以冒充人。
圖片來源:網絡截圖
不過既然是技術問題,那往往也就會有技術解決方案。隨著電腦視覺技術的發展,攻破圖形驗證碼並不是難以做到的事情,只是拉高了技術門檻而已。
所以自動化搶票的過程,就像是一群人堵在售票處視窗,過幾秒鐘就有人過來問一遍有沒有票,直到買到票或者過了售票時間才罷休。
圖庫版權圖片,轉載使用可能引發版權糾紛
自動化搶票會帶來幾個後果:對那些規規矩矩排隊買票的使用者不公平;浪費了 12306 伺服器的計算資源,可能降低 12306 使用者的購票體驗;以及降低了所有使用者的幸福感——沒有買到票的使用者自然不高興,而加了錢搶到票的使用者也未必開心。
所以當然,為了防止自動化搶票,也該有相應的技術手段才是。
如何防止自動化搶票?
有幾個基本思路可以提高自動化搶票的技術難度。
1.辨識來自自動化搶票軟件的行為,找到那些自動化搶票的機器黃牛。
具體而言,可以透過分析伺服器的存取情況,篩選出那些短時間內頻繁查詢車票資訊的機器,禁止它們存取;而自動化搶票軟件為了對應這一方案,則往往會采取頻繁更換 IP 地址的方式。所以這種思路,只能作為基礎。
2.讓自動化搶票軟件無法獲得有效的余票資訊。
如前所述,我們向 12306 上發起的每次余票查詢,都會向使用者的瀏覽器返回一串文字,而搶票軟件會分析這串文字,獲取余票資訊。如果返回的不是文字,搶票軟件要處理起來就會麻煩得多。畢竟電腦視覺和人類視覺很不一樣,人能一眼看出來的東西,電腦辨識起來並不容易。
圖片來源:網絡截圖
2021 年 11 月,中國鐵道科學研究院電子計算技術研究所申請了一項名叫【一種防止自動搶票方法及系統、器材和儲存介質】的專利,采用的就是這種思路。在這項專利中,研究者把查詢後的余票資訊轉換成了可伸縮向量影像 (SVG,Scalable Vector Graph),再發送回使用者的瀏覽器上。
SVG 是一種很有意思的影像格式。它是影像,但卻用文字來描述影像中的位置、顏色、線條寬度等等資訊;它使用相對點來保存數據,因此可以縮放到任意大小而不會失真。這兩個特征,讓它既可以容易地透過程式繪制,也適合出現在任意大小的顯視器上。
在放自動化搶票上,它的這兩個特征就很有用了:查詢返回的是圖片,傳統的自動化搶票軟件無法從中提取出和車票資訊相關的文字,自然也就無法搶票。而手動購票的使用者,能辨識出這些圖片中的車票資訊,依然只需點選想要的車次資訊,就可以繼續購票。
在上文所述專利中,也提出了一種巧妙的驗證方式:使用文字組合,實作基於文字推理的行為驗證。就是讓使用者在購票前再透過一次行為驗證。
具體而言,大概像是這樣:首先,隨機選擇幾個漢字,把它們轉成 SVG 影像,再分成上下兩部份。然後,展示這些漢字的上半部份,和其中一個字的下半部份。最後,讓使用者找到正確的拼合方式,只有組成正確的漢字,才算透過驗證。
只有圖5才是正確的。圖片來源:上述專利說明書
自動化搶票軟件要透過這種驗證,則需要「認字」才行,也就是說需要擁有一個字庫,以及能夠對照字庫尋找正確的拼合方法,這無疑會增加自動化搶票的難度。
總而言之,要防自動化搶票,就要為購票系統設計一些障礙,這些障礙對於人來說不難,而對於電腦來說暫時還很難。
畢竟需求就是動力,電腦的能力也會提升。技術會逐步升級,自動化搶票和反自動化搶票會是一場持續的拉鋸戰。
策劃制作
本文為科普中國-星空計劃作品
出品|中國科協科普部
監制|中國科學技術出版社有限公司、北京中科星河文化傳媒有限公司
作者|猛獁 哈爾濱理工大學
稽核|於旸 騰訊玄武實驗室負責人