s = requests.Session()
我先用 s.get() 请求获取的验证码
再用 s.post() 携带验证码登录
登录失败了,提示我验证码错误
请问大佬们该怎么解决呢?
code = get_code()[0]
uuid = get_code()[1]
这里调用了两次获取图片验证码信息的接口,有确认这个接口在一定时间内多次请求,会返回一样的结果么?如果不确定,这里改写成只获取一次吧。
源码如下:
import requests
import ddddocr
import base64
import cv2
import time
s = requests.Session()
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36"
}
# 调接口获取验证码和uuid
def get_code():
res = s.get('http://host/m.api/captchaImage')
return res.json()["img"], res.json()["uuid"]
# 保存验证码图片
def save_images(img_str):
imgdata = base64.b64decode(img_str)
t = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
path = r'D:/test/img/' + t + '.jpg'
with open(path, 'wb') as fp:
fp.write(imgdata)
return path
# 识别验证码
def ocr(path):
ocr = ddddocr.DdddOcr()
with open(path, 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
return res
# openCV展示验证码图片
def show_code(img_path):
img = cv2.imread(img_path)
cv2.imshow('show', img)
cv2.waitKey()
def run():
code = get_code()[0]
uuid = get_code()[1]
pic_path = save_images(code)
vcode = ocr(pic_path)
return vcode, uuid, pic_path
if __name__ == '__main__':
data = run()
print(data)
login_data = {
"username": "guest",
"password": "123456",
"verifyCode": data[0],
"uuid": data[1]
}
response = s.post(
'http://host/m.api?_gp=admin&_mt=login',
data=login_data, headers=headers)
print(response.json())
show_code(data[2])
求大佬们解惑
用这个方法,比如 我强制让登录执行顺序为第一个。 然后再执行其余接口。这样跑的通,但是 token 就没被用到(后面接口参数里不需要传 token)。 这样的方案行得通吗?
code = get_code()[0]
uuid = get_code()[1]
这里调用了两次获取图片验证码信息的接口,有确认这个接口在一定时间内多次请求,会返回一样的结果么?如果不确定,这里改写成只获取一次吧。
嗯嗯 雀食如大佬所说 之前那种取值是相当于两个值分别调用了一次验证码接口 然后就匹配不到一起了
我改了一下就好了
def run():
get_data = get_code()
code = get_data[0]
uuid = get_data[1]
# code = get_code()[0]
# uuid = get_code()[1]
pic_path = save_images(code)
vcode = ocr(pic_path)
return vcode, uuid, pic_path
谢谢大佬 , 一眼看到问题所在. 哈哈 真是恍然大悟 我还纳闷我的 session 怎么跟别人的不一样
客气啦。
PS:建议你用下 python 的语法糖,用
code, udid = get_code()
这样的写法,会更清晰简洁。