12306验证码(手动确认)

  关于12306点触验证。  小编能力有限,暂时无法自动识别 图像。

  每一次requests.get,都相当于重新打开了一个浏览器,服务器每次都会返回不同得cookies来标识不同得浏览器,当然每个cookies标识得浏览器页面出现得 验证码土拍你也是不相同得,后面就需要cookies来加以区别。

  同时,时间戳只是用来对请求的排序,就好比(在浏览器network中查看到的一样):

  这里的 Request URL中的参数 ‘_’就是根据时间戳的顺序。包括callback。

  在浏览器手动操作后验证成功后,会出现captcha-check?新的结果,标识着 点触验证提交的结果:

  注意到 请求参数有:

  1. callback:
    jQuery19109743135746186791_1581393529288
  2. answer:
    182,39,37,105
  3. rand:
    sjrand
  4. login_site:
    E
  5. _:
    1581393529297

  callback应该就是标识着对应的图片,后台将用这个做匹配,callback参数对应的不必是最新的时间戳,之前得也可以,毕竟只是用来标识。

对另一个网址请求成功后,会出现上述字样。

  下面附上代码;

第二种应用了session会话,可以保留cookies

def func1():
    # session = requests.Session()

    url = 'https://kyfw.12306.cn/otn/resources/login.html'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
        'Referer': 'https://www.12306.cn/index/'
    }
    # session.headers.update(headers)
    response = requests.get(url, headers=headers)
    # print(response.cookies)   拿到cookies
    # 下载验证图片
    cookies = response.cookies
    capt_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&1581391652446&callback=jQuery191033658314235363185_1581391130646&_=1581391130648'
    capt_response = requests.get(capt_url, headers=headers, cookies=cookies)
    # print(capt_response.text)
    # 提取信息

    img_data = re.findall(b'"image":"(.*?)"', capt_response.content)[0]
    # print(img_data)
    data = base64.b64decode(img_data)
    with open('img.jpg', 'wb') as f:
        f.write(data)

    check_url = 'https://kyfw.12306.cn/passport/captcha/captcha-check?'

    def get_index(indexs):
        # 选择图片坐标
        map = {
            '1': '40,43',
            '2': '18,43',
            '3': '180,43',
            '4': '258,43',
            '5': '37,117',
            '6': '103,117',
            '7': '178117',
            '8': '250,117',
        }
        index = indexs.split(',')
        res = []
        for i in index:
            try:
                res.append(map[i])
            except:
                pass
        print(','.join(res))
        return ','.join(res)
    data = {
        'callback': 'jQuery191033658314235363185_1581391130646',
        'answer': get_index(input('请输入正确的图片:')),
        'rand': 'sjrand',
        'login_site': 'E',
        '_': '1581391130648'
    }
    check_res = requests.get(check_url, headers=headers, cookies=cookies, params=data)
    print(check_res.text)

下面得为应用session

def func2():
    session = requests.Session()

    url = 'https://kyfw.12306.cn/otn/resources/login.html'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
        'Referer': 'https://www.12306.cn/index/'
    }
    session.headers.update(headers)
    response = session.get(url)
    # print(response.cookies)   拿到cookies
    # 下载验证图片
    cookies = response.cookies
    capt_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&1581394497441&callback=jQuery19109743135746186791_1581393529288&_=1581393529294'
    capt_response = session.get(capt_url)
    # print(capt_response.text)
    # 提取信息

    img_data = re.findall(b'"image":"(.*?)"', capt_response.content)[0]
    # print(img_data)
    data = base64.b64decode(img_data)
    with open('img.jpg', 'wb') as f:
        f.write(data)

    check_url = 'https://kyfw.12306.cn/passport/captcha/captcha-check?'

    def get_index(indexs):
        # 选择图片坐标
        map = {
            '1': '40,43',
            '2': '18,43',
            '3': '180,43',
            '4': '258,43',
            '5': '37,117',
            '6': '103,117',
            '7': '178117',
            '8': '250,117',
        }
        index = indexs.split(',')
        res = []
        for i in index:
            try:
                res.append(map[i])
            except:
                pass
        print(','.join(res))
        return ','.join(res)

    data = {
        'callback': 'jQuery19109743135746186791_1581393529288',
        'answer': get_index(input('请输入正确的图片:')),
        'rand': 'sjrand',
        'login_site': 'E',
        '_': '1581393529295'
        # 这里一定是相对应得,比请求获取验证码的‘_’多一,其他数都不成功
    }
    check_res = session.get(check_url, params=data)
    print(check_res.text)

  小编理解得请求参数中得'_' 和callback中后面的时间戳起标识作用,类似于文件名。小编每次运行一次程序,都将重新打开浏览器,自然不会出现时间戳重复得情况。

猜你喜欢

转载自www.cnblogs.com/a-runner/p/12294996.html