Python-模拟火车票12306网站登陆

Python-模拟火车票12306网站登陆

Python小七2018-11-12 11:41:0210750A+A-

大家都知道 12306网站是买火车票的! 特别是到了节假日的时候 一票难求 非常的难买, 所以小编写了个Python 模拟登陆12306的网站!

image.png

现在12306的网站 改版变化也挺大的! 不过都是美工的功劳  哈哈!  

后台其他的一些数据 变化基本不大! 


首先我们来分析下网站 , 12306网站难的地方 就是验证码那块    所以处理验证码的时候 需要下点功夫!

image.png


通过抓包分析出 验证码的地址是 :https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&1541686714134&callback=jQuery19109992892609908492_1541686371355&_=1541686371356


image.png

看来应该是用了base64编码了图片 我们只需要转码恢复成图片下载到本地 就好了! 用  import base64

效验验证码 我们通过坐标转化成数字 变成序号 方便我们选择  反正就8个图片 也就是8个序号了! 

image.png



好了 废话不多说了 直接上代码吧:

# -*- coding:utf-8 -*-
"""12306登陆"""
import requests
import base64
import re


def get_point(index):
    map = {
        '1': '37,46',
        '2': '110,46',
        '3': '181,46',
        '4': '253,46',
        '5': '37,116',
        '6': '110,116',
        '7': '181,116',
        '8': '253,116',
    }
    index = index.split(',')
    temp = []
    for item in index:
        temp.append(map[item])
    return ','.join(temp)


# 实例化一个Session
session = requests.Session()  # 自动的处理cookie
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
session.headers.update(headers)

# 伪装成浏览器
# 1. 访问 获取cookie
cookie_url = 'https://kyfw.12306.cn/otn/login/conf'
response = session.get(cookie_url)
# 2. 下载验证码
captcha_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&1541686714134&callback=jQuery19109992892609908492_1541686371355&_=1541686371356'
response = session.get(captcha_url)
data = response.text
img_base64 = re.findall(r'"image":"(.*?)"', data)[0]
# img_base64 = 'data:image/jpg;base64,' + img_base64
# 转换成二级制数据
img_bytes = base64.b64decode(img_base64)
# 写到文件
with open('captcha.jpg', 'wb') as f:
    f.write(img_bytes)

# 3校验验证码
check_captcha = 'https://kyfw.12306.cn/passport/captcha/captcha-check?callback=jQuery19109992892609908492_1541686371355&rand=sjrand&login_site=E&_=1541686371358'
response = session.get(check_captcha, params={'answer': get_point(
    input('请输入正确的序号>>>:'))})  # 验证码输入,请输入正确验证码的序号(不是坐标),序号之间以,号隔开,验证码在程序目录下
res = response.text
code = re.findall(r'"result_code":"(.*?)"', res)[0]
if code == '4':
    print('验证码校验成功')
    # 4 校验用户名密码
    login_url = 'https://kyfw.12306.cn/passport/web/login'
    form_data = {
        'username': '12306账号',  # 替换成自己的12306账号
        'password': '12306密码',  # 替换成自己的12306密码
        'appid': 'otn'
    }
    response = session.post(login_url, data=form_data)
    res = response.json()
    if res["result_code"] == 0:
        print('用户名密码校验成功!')
        # 5获取权限token
        uamtk_url = 'https://kyfw.12306.cn/passport/web/auth/uamtk'
        response = session.post(uamtk_url, data={'appid': 'otn'})
        res = response.json()
        if res["result_code"] == 0:
            print('获取token成功')
            # 6.校验 token
            check_token_url = 'https://kyfw.12306.cn/otn/uamauthclient'
            response = session.post(check_token_url, data={
                                    'tk': res['newapptk']})
            print(response.text)


点击这里复制本文地址 以上内容由小七资源网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

小七资源网 © All Rights Reserved.  Copyright 小七资源网
本站部分内容收集于互联网,如果有侵权内容、不妥之处,请联系我们删除。敬请谅解!email:[email protected]