python带验证码登录

时间:2021-12-01 17:10:29

本次登录的是中国石油大学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页面中找到两个自己的用户名