模拟12306登录
模擬12306登錄思路
1.獲取驗證碼url保存到本地,在尋找時遇到了一些困難,因為之前網頁上圖片都是http://www.xxx.png這類格式的,直接常規操作就ok了,開始以為這樣所以就一直研究紅色箭頭的部分,還是沒有突破。然后放棄再找,點開黃色箭頭是生成驗證碼的url,不過驗證碼是以base64編碼的,終于找到了。接下來可以用base64.b64decode()轉化成二進制保存圖片。驗證碼獲取到此為止。好像再早一些可以直接獲取驗證碼的url。。。
?
2.驗證,這就比較簡單了,直接傳參就ok。
3.模擬登錄,傳參POST請求就ok了。
4.最終的效果圖。
PS:這里的圖片位置是從八張圖片的第一張左上角開始計算的,這里不太方便,需要通過截圖工具測量手動填入,并且要注意逗號是英文的!不要填錯!還有在請求時各種參數請詳見代碼注釋。
?5.code已優化用戶輸入
import requests import base64 import json import re from PIL import Image s = requests.Session()#創建一個s對象,實現自動會話處理 pic_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image64'#生成驗證碼的url check_url = 'https://kyfw.12306.cn/passport/captcha/captcha-check'#檢查驗證碼的url login_url = 'https://kyfw.12306.cn/passport/web/login'#登陸的url headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6824.400 QQBrowser/10.3.3127.400' } params = {'login_site':'E','module':'login','rand':'sjrand','1548225897803':'','callback':'jQuery191022828784922393353_1548223378930',#每次都是定值,但是如果兩次是關閉網頁重新打開是不一樣的,'_':'1548223378936'#似乎與時間有關系,時間戳 }#測試之后發現只保留callback參數就可以 response = s.get(pic_url,params = params,headers = headers) html = response.text jsondata = re.findall('\/\*\*\/.*?\((.*?)\).*?',html)[0]#注意轉義\* \( \) dic = json.loads(jsondata) img = base64.b64decode(dic['image']) with open('pic.jpg','wb') as f:f.write(img) img = Image.open('pic.jpg') img.show()nums = input('請輸入正確的圖片編號1~8,示例("1,2")') params = {'callback':'jQuery191022828784922393353_1548223378930','rand':'sjrand','login_site':'E','_':'1548223378941'#兩次請求此參數無關緊要 }pic_position = {'1': '40,40','2': '110,40','3': '180,40','4': '260,40','5': '40,120','6': '110,120','7': '180,120','8': '260,120' } num_list = nums.split(',') new_list = [pic_position[i] for i in num_list] answer = ','.join(new_list)#轉字符串params['answer'] = answer verify_result = s.get(url = check_url,params = params,headers = headers).text print(verify_result)username = input('請輸入用戶名') password = input('請輸入密碼') data = {'username':username,'password':password,'appid':'otn','answer':answer } login_result = s.post(url = login_url,data = data,headers = headers).text print(login_result)PS:彈出exe框后將其關閉然后在進行輸入。?
總結
- 上一篇: Microsoft ADO Data C
- 下一篇: (3)verilog与Systemver