吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5263|回复: 19
收起左侧

[Python 转载] python requets登录12306并保存cookie

[复制链接]
17788210295 发表于 2019-12-15 10:19
本帖最后由 17788210295 于 2019-12-15 10:26 编辑

经过倒腾12306的登录,还是实现了,请求头很重要...各位感兴趣的可以继续写下去.....
[Python] 纯文本查看 复制代码
import sysimport time
import requests
from PIL import Image
import json
import os

import Headers
import SessionUtil
import UrlUtils


class Ticket(object):
    def __init__(self):
        self.answer = {
            "1": "40,40",
            "2": "110,40",
            "3": "180,40",
            "4": "260,40",
            "5": "40,120",
            "6": "110,120",
            "7": "180,120",
            "8": "260,120",
        }
        self.answer_code=''
        self.tk = ''

    def getDEVICEID(self):
        r = requests.get(UrlUtils.DEVICE_url, headers=Headers.BaseHead).text
        try:
            dic = json.loads(r[18:-2].replace(" ", ""))
        except Exception:
            return ""
        return dic

    # 初始化  获取设备id 设置为cookie 必须
    def initialize(self):
        dic = self.getDEVICEID()
        if dic == "":
            print("网络获取指纹失败!使用默认id")
            RAIL_EXPIRATION = "1576651914389"
            RAIL_DEVICEID = "lBJStCNl0YGo_HVkGtwOo2LWziXcwzpIk5gc2vAILNYdRfaeZ04nJtZ1JZwgQIssMDksn10rAz6Hz-bekeufhAusaKJId8f2BCg05ocgrzc8-chv8h4IB-lQ9H04XjLXr2fbnHw-SLZga3PewEfgPz2s-mhp7NAz"
        else:
            print("网络获取指纹成功!")
            RAIL_EXPIRATION = dic["exp"]
            RAIL_DEVICEID = dic['dfp']
        SessionUtil.setCookie("RAIL_EXPIRATION", RAIL_EXPIRATION)
        SessionUtil.setCookie("RAIL_DEVICEID", RAIL_DEVICEID)

    def conf(self):
        res = SessionUtil.session.post(url=UrlUtils.Conf_url, data=None, headers=Headers.ConFHeader)

    def uamtkstatic(self):
        data = {
            'appid': 'otn'
        }
        SessionUtil.session.post(url=UrlUtils.UamtkStatic_url, data=data, headers=Headers.UamtkStaticHead)

    def get_img_code(self):
        try:
            img = SessionUtil.session.get(url=UrlUtils.Down_mg_url, headers=Headers.BaseHead).content
            with open('code.jpg', 'wb') as f:
                f.write(img)
        except Exception:
            print("下载图片错误! 等待重试~~")
            time.sleep(1)
            self.get_img_code()

    def check_img(self):
        try:
            Image.open('code.jpg').show()
        except Exception:
            time.sleep(2)
            Image.open('code.jpg').show()
        print("+---1-------+----------+----------+----------+")
        print("|    1     |    2     |    3     |    4     |")
        print("|----------|----------|----------|----------|")
        print("|    5     |    6     |    7     |    8     |")
        print("+----------+----------+----------+----------+")
        input_code = input("请在1—8中选择输入验证图片编号,以半角','隔开。(例如:1,3,5):")
        answer_code = ''
        try:
            for i in input_code.split(','):
                answer_code += ',' + self.answer[i] if (i is not input_code[0]) else self.answer[i]
        except Exception as e:
            print('输入错误请重新输入!')
            self.check_img()
        data = {
            'answer': answer_code,
            'rand': 'sjrand',
            'login_site': 'E',
        }
        response = SessionUtil.session.get(url=UrlUtils.Check_img_url, params=data, headers=Headers.BaseHead, )
        check_result = json.loads(response.text)
        print(check_result)
        try:
            if check_result['result_code'] == '4':
                print('*' * 20 + '验证码正确' + '*' * 20)
                self.answer_code=answer_code
            else:
                self.get_img_code()
                self.check_img()
        except Exception:
            self.get_img_code()
            self.check_img()

    # 校验密码正确
    def login(self, answer_code):
        user = ''
        password = ''
        try:
            with open("user.conf", "r", encoding="utf-8") as  f:
                user = f.readline().strip().replace("[", '').replace("]", '').replace("name=", '')
                password = f.readline().strip().replace("[", '').replace("]", '').replace("pwd=", '')
                if user == "" or password == "":
                    raise Exception
        except Exception:
            user = input("账号____:")
            password = input("密码____:")

        formdata = {
            'username': user,
            'password': password,
            'appid': 'otn',
            'answer': answer_code
        }
        login_result = SessionUtil.session.post(url=UrlUtils.Login_url, data=formdata, headers=Headers.BaseHead)
        login_result.encoding = 'utf-8'
        login_result = login_result.json()
        print(login_result)
        if login_result["result_code"] != 0:  #{'result_message': '登录名不存在。', 'result_code': 1}
            sys.exit(0)

    # 二次校验
    def userLogin(self):
        # 获取一系列的cookie值才能真正的登录成功
        response = SessionUtil.session.get(url=UrlUtils.UserLogin_url, headers=Headers.UserLoginHead)
        # 更新JSESSIONID  route
        response = SessionUtil.session.get(url=UrlUtils.Redirect_UserLogin_Url, headers=Headers.RedirectHead)

    def uamtk(self):
        # 获取 tk 下一个请求需要提交 tk 值
        data = {'appid': 'otn'}
        uamtk_page = SessionUtil.session.post(url=UrlUtils.Uamtk_url, data=data, headers=Headers.UamtkHeader)
        uamtk_page.encoding = 'utf-8'
        try:
            result = uamtk_page.json()
            print(result)
            if result['result_code'] != 0:
                raise Exception(result['result_message'])
            tk = result['newapptk']
            self.tk = tk
        except Exception:
            print("获取tk失败!")
            print("重试")
            self.run()

    def Uamauthclient(self):
        data = {'tk': self.tk}
        response = SessionUtil.session.post(url=UrlUtils.Uamauthclient_url, data=data,
                                            headers=Headers.UamauthclientHeader)
        res = response.text
        try:
            dic = json.loads(res)
            print(dic)
            print(dic["username"] + ",欢迎登录!")
        except:
            print("登录失败!")
            self.run()
        # '{"result_code":0,"result_message":"验证通过","username":"XXX","apptk":"36yslXHez3_68-LtHvhI61mZkranjdw6kT9j4UMwEqrw1w0"}'

    def saveCookie(self):
        SessionUtil.save_cookies("12306cookies.txt")

    def getInfo(self):

        try:
            re = SessionUtil.session.post("https://kyfw.12306.cn/otn/modifyUser/initQueryUserInfoApi",
                                          headers=Headers.UserInfoHead)
            print(re.text)
        except:
            print("获取失败")

    def run(self):
        self.initialize()
        self.conf()
        self.uamtkstatic()
        self.get_img_code()
        self.check_img()
        self.login(self.answer_code)
        self.userLogin()
        self.uamtk()
        self.Uamauthclient()
        self.saveCookie()
        self.conf()
        self.getInfo()


if __name__ == '__main__':
    t = Ticket()
    result = "":
    try:
         with open("12306cookies.txt", "r", encoding="utf-8") as fr:
            result = fr.read()
     except Exception:
         pass
    if result != "":
        SessionUtil.load_cookies("12306cookies.txt")
        t.initialize()
        t.conf()
        t.uamtkstatic()
        t.userLogin()
        t.uamtk()
        t.Uamauthclient()
        t.getInfo()
    else:
        t.run()

Headers:
[Python] 纯文本查看 复制代码
BaseHead = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",
    "Host": "kyfw.12306.cn",
    "Referer": "https://kyfw.12306.cn/otn/resources/login.html"
}

UserLoginHead = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",
    'Content-Type': 'application/x-www-form-urlencoded',
    'Referer': 'https://kyfw.12306.cn/otn/resources/login.html',
    'Upgrade-Insecure-Requests': '1',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
}
RedirectHead = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",
    'Referer': 'https://kyfw.12306.cn/otn/resources/login.html',
    'Upgrade-Insecure-Requests': '1',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',

}

UamtkHeader = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Referer': 'https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept': r'application/json, text/javascript, */*; q=0.01',
    'Origin': 'https://kyfw.12306.cn'
}

UamauthclientHeader = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",
    "Host": "kyfw.12306.cn",
    'Referer': r'https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin',
}
ConFHeader = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",
    "Host": "kyfw.12306.cn",
    "Referer": "https://kyfw.12306.cn/otn/resources/login.html"
}

UamtkStaticHead = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Referer': 'https://kyfw.12306.cn/otn/resources/login.html',
}

UserInfoHead = {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
    "Cache-Control": "no-cache",
    "Connection": "keep-alive",
    "Content-Length": "0",
    "Host": "kyfw.12306.cn",
    "Origin": "https://kyfw.12306.cn",
    "Pragma": "no-cache",
    "Referer": "https://kyfw.12306.cn/otn/view/information.html",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-origin",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest",
}

SessionUtils
[Python] 纯文本查看 复制代码
import requests
import urllib3
from http import cookiejar
urllib3.disable_warnings()
session = requests.Session()
session.verify = False  # 取消验证 SSL

def setCookie(key,value):
    session.cookies.set(key,value)


def removeCookies(key=None):
    session.cookies.set(key, None) if key else session.cookies.clear()


def load_cookies(cookie_path="12306cookies.txt"):
    load_cookiejar = cookiejar.LWPCookieJar()
    load_cookiejar.load(cookie_path, ignore_discard=True, ignore_expires=True)
    load_cookies = requests.utils.dict_from_cookiejar(load_cookiejar)
    session.cookies = requests.utils.cookiejar_from_dict(load_cookies)

def save_cookies(cookie_path="12306cookies.txt"):
    new_cookie_jar = cookiejar.LWPCookieJar(cookie_path)
    requests.utils.cookiejar_from_dict({c.name: c.value for c in session.cookies}, new_cookie_jar)
    new_cookie_jar.save(cookie_path, ignore_discard=True, ignore_expires=True)


UrlUtils:
[Python] 纯文本查看 复制代码
import time


DEVICE_url= 'https://kyfw.12306.cn/otn/HttpZF/logdevice?algID=cS6Aw4inWV&hashCode=lZGX9bmwQGHuZPviiiBCrtoNPyHZ4pBG3jvF2dybZ6o&FMQw=0&q4f3=zh-CN&VySQ=FGGxHVb3AzlSM-oikvoZfGsTbD48DQud&VPIf=1&custID=133&VEek=unknown&dzuS=32.0 r0&yD16=0&EOQP=38437f3289ca7a613bb292a3de0dba2b&jp76=df7f80581243b062f0c64efc90666cd0&hAqN=Win32&platform=WEB&ks0Q=7523081fcf2454464b148398defb390a&TeRS=864x1536&tOHY=24xx864x1536&Fvje=i1l1o1s1&q5aJ=-8&wNLf=99115dfb07133750ba677d055874de87&0aew=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36&E3gR=7a13398746be6f51fe069c8a25001f12×tamp=' + str(round(time.time() * 1000))

#验证码下载地址
Down_mg_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&{}'.format(int(time.time() * 1000))

#验证码 验证地址
Check_img_url = 'https://kyfw.12306.cn/passport/captcha/captcha-check'
#登录地址 校验账号密码
Login_url = 'https://kyfw.12306.cn/passport/web/login'

#二次校验
UserLogin_url = 'https://kyfw.12306.cn/otn/login/userLogin'

#重定向二次校验
Redirect_UserLogin_Url = 'https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin'

#获取 tk关键 url
Uamtk_url = 'https://kyfw.12306.cn/passport/web/auth/uamtk'

# 使用tk 校验
Uamauthclient_url = 'https://kyfw.12306.cn/otn/uamauthclient'

#使用cookie直接 请求这个就可以访问 api
Conf_url = 'https://kyfw.12306.cn/otn/login/conf'


UamtkStatic_url = 'https://kyfw.12306.cn/passport/web/auth/uamtk-static'

initMy12306Api_url="https://kyfw.12306.cn/otn/index/initMy12306Api"



免责声明:仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

免费评分

参与人数 3吾爱币 +5 热心值 +3 收起 理由
wushaominkk + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yuzhidao + 1 + 1 用心讨论,共获提升!
继续欣赏你的拽 + 1 + 1 好东西 ,收藏了

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

hellx 发表于 2019-12-16 13:38
hellx 发表于 2019-12-16 13:23
我获取验证码get_img_code的时候 Session.get 返回的内容总是不正确 ,返回的是个HTML内容     哪位大哥知 ...

返回的错误信息是     “网络可能存在问题,请您重试一下!”
吾名阿茶 发表于 2020-4-7 13:43
hellx 发表于 2019-12-16 13:23
我获取验证码get_img_code的时候 Session.get 返回的内容总是不正确 ,返回的错误信息是     “网络可能存 ...

我也一直返回这个,服务器还可以响应 <response:200>,已经刚了好几天了
飞的低一点 发表于 2019-12-15 11:00
疯语 发表于 2019-12-15 11:10
感谢分享
54264 发表于 2019-12-15 14:11
感谢大佬分享
Ashervim 发表于 2019-12-15 14:14
感谢分享
小男° 发表于 2019-12-15 21:37
正在学习python,谢谢了
ceiven 发表于 2019-12-16 09:54
本帖最后由 ceiven 于 2019-12-16 11:08 编辑

获取验证码的url不是改成base64了吗
hbycdy 发表于 2019-12-16 10:04
厉害厉害!11
hellx 发表于 2019-12-16 13:23
本帖最后由 hellx 于 2019-12-16 13:40 编辑

我获取验证码get_img_code的时候 Session.get 返回的内容总是不正确 ,返回的错误信息是     “网络可能存在问题,请您重试一下!”
kexiao1987 发表于 2019-12-16 13:28
好东西 ,收藏了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 04:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表