Python3 模拟登录一个网站 验证码为什么总是错误?

问题描述

Python3 模拟登录一个网站 验证码总是错误

问题出现的环境背景及自己尝试过哪些方法

先请求了获取验证码的接口,再POST提交登录表单,但是验证码一直错误,百度无果,如果有大神愿意指点一二非常感谢!

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

# -*- coding: utf-8 -*-
from urllib import parse

import requests

# python2 和 python3的兼容代码
try:
    # python2 中
    import cookielib
    print(f"user cookielib in python2.")
except:
    # python3 中
    import http.cookiejar as cookielib
    print(f"user cookielib in python3.")


# session代表某一次连接
mSession = requests.session()
# 因为原始的session.cookies 没有save()方法,所以需要用到cookielib中的方法LWPCookieJar,这个类实例化的cookie对象,就可以直接调用save方法。
mSession.cookies = cookielib.LWPCookieJar(filename = "mafengwoCookies.txt")


login_url='https://dianpos-agent.91dbq.com/agent/operatorLogin.action'


#登录后才能访问的网页
url = 'https://dianpos-agent.91dbq.com/agent/main.action'

randomCode="-0"

userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
header = {
    "origin": "https://dianpos-agent.91dbq.com",
    "Referer": "https://dianpos-agent.91dbq.com/agent/operatorLogout.action",
    'User-Agent': userAgent,
}

def login(account, password):
    # 模拟登录
    print ("开始模拟登录")

    print(mSession.cookies)
    codeurl = 'https://dianpos-agent.91dbq.com/agent/generateRandomCode.action'
    valcode = mSession.get(codeurl)
    print(mSession.cookies)
    f = open('valcode.png', 'wb')
    # 将response的二进制内容写入到文件中
    f.write(valcode.content)
    # 关闭文件流对象
    f.close()
    code = input('请输入验证码:')
    randomCode=str(code)
    postData = {
        "username": account,
        "password": password,
        "randomCode": randomCode
    }
    print(mSession.cookies)
    print(postData)
    postData=parse.urlencode(postData).encode('utf-8')
    # 使用session直接post请求
    responseRes = mSession.post(login_url, data=postData, headers=header)
    print(mSession.cookies)
    # 无论是否登录成功,状态码一般都是 statusCode = 200
    print(f"statusCode = {responseRes.status_code}")
    print(f"text = {responseRes.text}")
    # 登录成功之后,将cookie保存在本地文件中
    mSession.cookies.save()


if __name__ == '__main__':
    login("xxx", "xxx")

你期待的结果是什么?实际看到的错误信息又是什么?

希望能正确获取到验证码,提交并成功登录进去!

阅读 3.8k
1 个回答
import requests
from pyquery import PyQuery as Q

url = 'https://dianpos-agent.91dbq.com/agent/main.action'
login_url='https://dianpos-agent.91dbq.com/agent/operatorLogin.action'
code_url = 'https://dianpos-agent.91dbq.com/agent/generateRandomCode.action'

session = requests.session()
session.headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}

def login(account, password):
    valcode = session.get(code_url)
    with open('valcode.png', 'wb') as f:
        f.write(valcode.content)

    code = raw_input('input code:')

    data = {
        "username": account,
        "password": password,
        "randomCode": code
    }

    r = session.post(login_url, data=data)
    print Q(r.text).find('.errorMessage').text()


if __name__ == '__main__':
    login("xxx", "xxx")
推荐问题