Python requests.Session() 携带验证码登录失败提示验证码错误

未闻佳音 · April 06, 2022 · Last by 未闻佳音 replied at April 07, 2022 · 2855 hits

s = requests.Session()
我先用 s.get() 请求获取的验证码
再用 s.post() 携带验证码登录
登录失败了,提示我验证码错误
请问大佬们该怎么解决呢?

最佳回复
code = get_code()[0]
uuid = get_code()[1]

这里调用了两次获取图片验证码信息的接口,有确认这个接口在一定时间内多次请求,会返回一样的结果么?如果不确定,这里改写成只获取一次吧。

共收到 8 条回复 时间 点赞
1Floor has deleted

源码如下:

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 怎么跟别人的不一样😂 😂 😂

jackeyhate 回复

就是取值有问题 楼下大佬说的那样 已经解决了 谢谢😀

未闻佳音 回复

客气啦。

PS:建议你用下 python 的语法糖,用

code, udid = get_code()

这样的写法,会更清晰简洁。

陈恒捷 回复

嗯嗯 学到了

未闻佳音 关闭了讨论 05 May 11:49
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up