不論是搶購火車票仍是電商網站上搶購商品,若是在節假日沒有搶購工具是很難靠手動搶到的,因此市面上的搶購工具也是層出不窮,但流程都是差很少的,大致上分爲2步:html
1.模擬用戶登陸 2.發送訂單請求
今天主要介紹一下第一步:模擬用戶登陸,做爲登陸我也把它拆分紅了這4步:java
1.準備登陸 2.驗證碼 3.執行登陸請求 4.驗證登陸是否成功
準備
1.chrome瀏覽器:由於須要藉助chrome強大的開發者工具
2.開源中國的在線工具:密碼的加密解密和一些格式化工具方便查看
3.eclipse:開發工具git
模擬登陸--如下僅供我的學習使用github
1.分析請求地址算法
主要分析驗證碼的請求,登陸的請求,以及爲登陸提供參數的請求,選定一個網站好比:開源中國,進入它的登陸界面:https://www.oschina.net/home/login,這時候打開開發者工具(ctrl+shift+i),如圖:chrome
咱們主要關心的是Network這個標籤頁瀏覽器
驗證碼的請求:
咱們發現有些網站沒有驗證碼好比:開源中國和京東,還有些直接須要驗證碼好比:華爲商城,其實這些沒有驗證碼的網站只是在正常登錄的狀況下沒有,當出現一些非正常狀況會出現驗證碼,好比連續屢次登錄失敗,全部咱們能夠經過這個方式讓驗證碼框出現,以下圖:eclipse
這時候咱們想獲取驗證碼的請求就很容易了,點擊:換另一張圖片,這時候看Network標籤:工具
咱們能夠開啓另一個瀏覽器標籤頁:https://www.oschina.net/action/user/captcha,每次刷新都產生一個新的驗證碼post
登陸的請求:
爲了方便查看登陸請求地址,咱們能夠寫一個錯誤的密碼,方式和上面同樣,以下圖所示:
是以post方式發送的請求,全部咱們須要找到Form Data,在Headers標籤的最下面就是Form Data數據:
email:******@126.com pwd:90ba8346f7f1a304a0e53abbf97ebc5051a3837d verifyCode: save_login:1
一共4個參數,分別是:用戶名,密碼,驗證碼和save_login,這個參數仍是比較少的,都是用戶本身輸入的參數,沒有須要咱們得到額外的參數;
關於pwd參數,有些網站是加過密的好比:開源中國,這裏具體用的什麼加密算法,其實咱們剛開始並不用去查看網頁的JavaScript腳本,找出裏面到底用的什麼算法,咱們能夠用窮舉法,由於經常使用的加密算法就那麼幾種:md5,base64,aes,des,sha1等,全部咱們徹底能夠先大體看一下,很幸運當前使用的加密算法是:sha1
爲登陸提供參數的請求:
這個請求是根據登陸的請求來的,若是咱們在Form Data中有一些其餘的參數,這時候就須要額外的請求來獲取Form Data中的參數,好比在模擬京東登陸的時候就有這個需求,通常狀況下須要請求的地址就是登陸頁面https://www.oschina.net/home/login,不少參數都在你進入登陸界面的時候發送過來了,但具體參數在什麼地方就不肯定了,有可能在html代碼裏面,也可能在腳本里面,也有多是其餘的某個請求,這個就須要根據實際狀況,本身作一些分析
2.整理思路寫代碼
總體思路就是剛剛上面提到的:
1.準備登陸 2.驗證碼 3.執行登陸請求 4.驗證登陸是否成功
代碼結構:
/** * 登錄 分紅4個步驟: 1.爲登陸準備必要的參數 2.獲取驗證碼 3.執行登陸 4.驗證登陸成功 */ public void login() { try { readyLogin(); getAuthCodeImage(); getInputAuthCode(); int result = executeLogin(); if (result == Constants.SUCCESS) { testLogin(); } } catch (Exception e) { logger.error("登錄異常", e); } } /** * 準備登陸 * * @throws Exception */ protected abstract void readyLogin() throws Exception; /** * 執行登錄 * * @return 登錄的結果 */ protected abstract int executeLogin() throws Exception; /** * 登錄成功,進行測試 * * @throws Exception */ protected abstract void testLogin() throws Exception; /** * 獲取驗證碼圖片 * * @throws Exception */ private void getAuthCodeImage() throws Exception {} /** * 獲取用戶輸入的驗證碼 * * @throws IOException */ private void getInputAuthCode() throws Exception {} /** * 獲取準備登陸地址 * * @return */ protected abstract String getReadyLoginUrl(); /** * 獲取驗證碼圖片地址 * * @return */ protected abstract String getAuthCodeImageUrl(); /** * 獲取登錄地址 * * @return */ protected abstract String getLoginUrl();
針對這個結構分佈模擬了:開源中國,京東,華爲商城 3個網站的登陸
詳細代碼:https://github.com/ksfzhaohui/simulation-login
總結
其實模擬登陸說白了就是看你對http協議是否瞭解,還有就是細心觀察,固然還有其餘一些網站可能就不那麼簡單了,好比淘寶,可能還須要其餘方面的知識,好比加密解密.
最後再說一遍:以上僅供我的學習使用