1. 程式人生 > >python帶驗證碼登入

python帶驗證碼登入

本次登入的是中國石油大學ACM的OJ(管理員不要打我),原型是hustoj,選擇的原因是驗證碼比較簡單,純數字。

實際上利用了驗證碼頁面和登入頁面cookie的一致。

但是在順序上我們需要先開啟驗證碼頁面,有興趣可以簡單測試一下:

1.開啟登入頁面(不要關閉)(http://acm.cup.edu.cn/loginpage.php)

2.找到驗證碼圖片的地址開啟(http://acm.cup.edu.cn/vcode.php)

3.重新整理圖片地址,一般來說驗證碼會變

4.用那個變了的驗證碼去登入,變了的驗證碼肯定和登入頁面的不一致

5.你發現成功登陸了

ps:登入頁面和post頁面要區分開

from http.cookiejar import CookieJar
from urllib.request import build_opener, HTTPCookieProcessor, Request
from urllib.parse import urlencode
from PIL import Image
import pytesseract

#請求
login = "http://acm.cup.edu.cn/login.php"
header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}

vcode = "http://acm.cup.edu.cn/vcode.php"

cj = CookieJar()
opener = build_opener(HTTPCookieProcessor(cj))

#開啟圖片並寫入
imgb = opener.open(vcode)
local = open('vv.jpg','wb')
local.write(imgb.read())
local.close()

#vcode
image = Image.open('vv.jpg')
vv = pytesseract.image_to_string(image)#成功機率20%左右吧

data = urlencode({
'user_id':'python',
'password':'python',
'vcode':''+vv,
'submit':'Submit'
}).encode('utf-8')
req = Request(login,data,header)
opener.open(req)

link = "http://acm.cup.edu.cn/modifypage.php"

print(opener.open(link).read().decode('utf-8'))
print(vv)#一般來說驗證碼對基本沒問題,成功的話可以在html頁面中找到兩個自己的使用者名稱