開源Java Swing C/S版本12306訂票助手
Java Swing C/S版本12306訂票助手
- 特別說明: 整個程序除了速度和效率高一些外,和瀏覽器訂票請求沒有本質區別,因此如果12306服務器做了任何調整,程序隨時可能失效,請自行酌情使用。
- 強烈建議: “不要把所有雞蛋放到一個籃子”,可注冊多個賬號,一些用于瀏覽器插件或常規訂票,一些用此程序刷票,這樣相對更保險。
項目說明
基于HttpClient、Multiple Thread、File I/O等主要技術的Java Swing桌面應用,至于說用途就不多說了,你懂的; 雖然說功能上沒有辦法和目前類似主流的瀏覽器插件相提并論,但是由于采用直接的HTTP請求模式,我相信效率上一定會更高。 ** 天下武功,唯快不破 **
- 直接以HTTP GET/POST發起最小數量必須的訂票請求,相比瀏覽器插件方式更加快速高效;
- 基于多線程多賬號登錄并發刷票,更高的訂票成功率;
- 基于文件記錄最后輸入的訂票數據,提高交互友好體驗;
- 該程序只核心關注以最高效快速提交訂票請求,不支持諸如自動登錄、識別驗證碼、支付等其他高級功能!
整個程序參考了一個名為mygod-go-home的項目,其中還包括一些自動化識別驗證碼的嘗試,在此對于作者的開源共享表示感謝,但是不知道什 么原因目前已經很久沒有更新發布了。 原來程序可能是考慮太多太全整個代碼結構看起來比較費勁,把其中一些請求參數定義組裝和響應解析等體力代碼引用過來,然后加入自己的想法設計從而有了這個 程序工程。
題外話: 對于這樣每到逢年過節炒的火熱的訂票助手,各大瀏覽器的插件以及12306之間的恩怨糾葛、道德討論等我覺得已經夠多了,我只能說這就是一個在無聊以及無 奈的環境下的產物。 我們還是以技術的角度去看待它,自從有了12306.cn,作為標準程序員閑的沒事就有了新的樂趣練練手,既然擁有這樣的技術,并且能讓技能為我所用,何 樂而不為呢。說不定哪天就被XXX封殺潛規則了,誰知道呢,權當娛樂而已!
用法說明
- 程序下載獲取:
簡單方式是直接點擊頁面 (https://github.com/xautlx/12306-hunter) 右下方的“Download ZIP”,以zip壓縮文件方式下載整個項目工程,然后解壓縮到本地任何目錄即可。
當然如果你熟悉GitHub的使用或希望隨時update最新代碼或修改提交pull request,可通過GitHub支持的git、svn等多種方式check out整個工程代碼和執行文件。
程序采用Java語言編寫實現,因此需要安裝Java運行環境。理論上Java 5,6,7 版本皆可運行。
- 直接運行程序:
如果系統已安裝過Java運行環境,則直接執行startup.bat即可。
當然如果不懂Java也沒關系,請自行訪問Oracle下載安裝Java運行環境:
http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html
選擇“Accept License Agreement”,然后點擊相應系統版本下載安裝即可(可能需要重啟系統),之后執行startup.bat即可。
- 開發模式運行:
本項目本身是一個完整的Eclipse工程,基本Maven依賴管理,熟悉對應開發過程及有興趣開發調試程序的,可在導入開發工具,以Java應用程序方式執行TicketMainFrame即可。
Swing界面開發采用Eclipse WindowBuilder自動生成框架代碼,可自行安裝插件以可視化模式查看設計實現。
界面截圖
功能說明
如果有任何問題或建議反饋,請到 https://github.com/xautlx/12306-hunter/issues 提交Issue;
對于程序本身的不足或下面提到的優化點,歡迎有興趣的朋友本著交流學習為目的的代碼改進優化并直接提交Pull Request。
參考上述截圖,對于UI界面功能從上至下大致說明如下:
目前程序除了基于乘車起始站對車次做基本校驗外,其余基本沒有更仔細嚴格的校驗,使用時請自行按照官方網站給的有效數據格式填寫,也歡迎補充提交完善校驗邏輯代碼共同完善程序。
TODD:考慮加入配置文件概念,如可以定制化請求間隔時間(目前代碼層面固定的0.5秒)等
- 數據記住功能: 程序在關閉時自動記錄最后輸入的相關數據免去下次打開程序重復輸入,不包括數據:密碼、驗證碼、乘車日期(每次打開始終自動初始化為20天預售期)、 其他動態日志等信息
- 起站、到站: 請輸入精確的乘車站名稱,如北京西(TODO:支持中文或拼音輸入提示)
- 乘車日期: 每次打開始終自動初始化為20天預售期,可自行修改為預售期內的有效日期,請保持默認的日期格式(TODO:日歷組件輸入支持;校驗輸入日期在預售期內)
- 備選日期: 主要用于刷“退票”的時候,碰到他人退票自動快速下單,按照順序優先級填入逗號分隔的乘車 “日”字符串,程序自動換算日期屬于本月還是下月; 如當前是10號,填寫2,1,29,28則表示按照下月2號,1號,本月29號,28號的順序不斷循環嘗試訂票,直到其中任何一次成功
- 用戶及車次設置: 為了提高成功率,可以添加多個注冊的12306賬號(點擊每個行項前面的加減號),每個登錄賬號各啟動一個線程并發訂票,各登錄賬號可根據所需指定相同訂票車次或不同車次組合。
每 個登錄賬號可從【左至右優先級】設定5個【車次和席別】(一個車次可以以不同席別添加多次) , 程序訂票規原則是盡量先定優先級高的票,實在沒票了才委屈求全定后續優先級低的票; 簡單說就是程序不是按照優先級一個個順序循環嘗試訂票,而是始終先不斷嘗試訂優先級高的票,直到系統返回已經沒票了才會轉入下一車次席別。
因 此請合理設置各賬號車次席別順序和組合方式,因為各登錄賬號訂票線程互相獨立運行,各自都隨時有可能按照上述的訂票原則訂到指定優先級的車次和席別的票, 設定不合理就會導致優先搶到“不搶手”的票了,再想回頭想搶中意的票估計就來不及了。 當然也不用考慮太復雜,每個登錄賬號和車次席別自動發現有票時,會自動彈出下單驗證碼輸入對話框,如果感覺不是自己中意的票可以點擊取消即可從而自動再繼 續嘗試刷票,避免不必要的誤傷了。
- 賬號、密碼、驗證碼: 沒什么好說的,順序輸入即可,驗證碼會自動轉為大寫并且在滿4位后自動觸發點擊登 錄請求;只有登錄成功的用戶行項才會啟動刷票線程。驗證碼圖片看不清可以點擊刷新。下方是每個登錄用戶的Cookie數據,顯示參考不用太關注。 (TODO:考慮加一個登錄狀態的守護線程,防止由于登錄后長時間沒有發起請求導致登錄失效)
- 車次、席別: 一個登錄賬號可以分別輸入多個車次(包括字面前綴的完整車次)及對應席別,從左到右優先級,規則見上述說明 ;具體車次代碼和有效的席別請自行通過12306網站查詢。(TODO:可考慮加入車次對應席別有效性的校驗)
- 乘車人: 沒啥好說的,按照網站類似的填寫相關信息即可,可點擊加減號增減多個乘車人,左側有個勾選用以 確定本次訂票乘車人(用于方便保存維護多個乘車人供以后使用,但是只勾選本次必要的乘車人),建議從12036常用聯系人拷貝相關數據,避免手工輸入錯誤 (TODO:添加從12306獲取乘車人信息及有效性校驗)
- 開始自動刷票: 基于“已成功登錄的賬號”和“已勾選的乘車人”,及相關填寫信息啟動刷票線程,期間刷到 票后后自動彈出頂層窗口顯示相關車次信息和輸入驗證碼,確認是需要的票的趕快輸入驗證碼(輸入4位自動提交)提交下單,如果驗證碼錯誤會再次彈出窗口輸 入;如果不是想要的車票則點擊取消即可。 任何一個賬號線程提示訂票成功后會當前線程自動終止,但是其他賬號線程還會繼續,可以點擊“停止自動刷票”結束所有刷票線程。
- 停止自動刷票: 強制結束所有刷票線程。