python实现12306登录并保存cookie的方法示例
经过倒腾12306的登录,还是实现了,请求头很重要...各位感兴趣的可以继续写下去.....
importsys importtime importrequests fromPILimportImage importjson importos importHeaders importSessionUtil importUrlUtils classTicket(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='' defgetDEVICEID(self): r=requests.get(UrlUtils.DEVICE_url,headers=Headers.BaseHead).text try: dic=json.loads(r[18:-2].replace("","")) exceptException: return"" returndic #初始化获取设备id设置为cookie必须 definitialize(self): dic=self.getDEVICEID() ifdic=="": 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) defconf(self): res=SessionUtil.session.post(url=UrlUtils.Conf_url,data=None,headers=Headers.ConFHeader) defuamtkstatic(self): data={ 'appid':'otn' } SessionUtil.session.post(url=UrlUtils.UamtkStatic_url,data=data,headers=Headers.UamtkStaticHead) defget_img_code(self): try: img=SessionUtil.session.get(url=UrlUtils.Down_mg_url,headers=Headers.BaseHead).content withopen('code.jpg','wb')asf: f.write(img) exceptException: print("下载图片错误!等待重试~~") time.sleep(1) self.get_img_code() defcheck_img(self): try: Image.open('code.jpg').show() exceptException: 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: foriininput_code.split(','): answer_code+=','+self.answer[i]if(iisnotinput_code[0])elseself.answer[i] exceptExceptionase: 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: ifcheck_result['result_code']=='4': print('*'*20+'验证码正确'+'*'*20) self.answer_code=answer_code else: self.get_img_code() self.check_img() exceptException: self.get_img_code() self.check_img() #校验密码正确 deflogin(self,answer_code): user='' password='' try: withopen("user.conf","r",encoding="utf-8")asf: user=f.readline().strip().replace("[",'').replace("]",'').replace("name=",'') password=f.readline().strip().replace("[",'').replace("]",'').replace("pwd=",'') ifuser==""orpassword=="": raiseException exceptException: 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) iflogin_result["result_code"]!=0:#{'result_message':'登录名不存在。','result_code':1} sys.exit(0) #二次校验 defuserLogin(self): #获取一系列的cookie值才能真正的登录成功 response=SessionUtil.session.get(url=UrlUtils.UserLogin_url,headers=Headers.UserLoginHead) #更新JSESSIONIDroute response=SessionUtil.session.get(url=UrlUtils.Redirect_UserLogin_Url,headers=Headers.RedirectHead) defuamtk(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) ifresult['result_code']!=0: raiseException(result['result_message']) tk=result['newapptk'] self.tk=tk exceptException: print("获取tk失败!") print("重试") self.run() defUamauthclient(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"}' defsaveCookie(self): SessionUtil.save_cookies("12306cookies.txt") defgetInfo(self): try: re=SessionUtil.session.post("https://kyfw.12306.cn/otn/modifyUser/initQueryUserInfoApi", headers=Headers.UserInfoHead) print(re.text) except: print("获取失败") defrun(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: withopen("12306cookies.txt","r",encoding="utf-8")asfr: result=fr.read() exceptException: pass ifresult!="": SessionUtil.load_cookies("12306cookies.txt") t.initialize() t.conf() t.uamtkstatic() t.userLogin() t.uamtk() t.Uamauthclient() t.getInfo() else: t.run()
Headers:
BaseHead={ "User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110Safari/537.36Edge/16.16299", "Host":"kyfw.12306.cn", "Referer":"https://kyfw.12306.cn/otn/resources/login.html" } UserLoginHead={ "User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110Safari/537.36Edge/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(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110Safari/537.36Edge/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(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110Safari/537.36Edge/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(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110Safari/537.36Edge/16.16299", "Host":"kyfw.12306.cn", 'Referer':r'https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin', } ConFHeader={ "User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110Safari/537.36Edge/16.16299", "Host":"kyfw.12306.cn", "Referer":"https://kyfw.12306.cn/otn/resources/login.html" } UamtkStaticHead={ "User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110Safari/537.36Edge/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(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3904.108Safari/537.36", "X-Requested-With":"XMLHttpRequest", }
SessionUtil
importrequests importurllib3 fromhttpimportcookiejar urllib3.disable_warnings() session=requests.Session() session.verify=False#取消验证SSL defsetCookie(key,value): session.cookies.set(key,value) defremoveCookies(key=None): session.cookies.set(key,None)ifkeyelsesession.cookies.clear() defload_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) defsave_cookies(cookie_path="12306cookies.txt"): new_cookie_jar=cookiejar.LWPCookieJar(cookie_path) requests.utils.cookiejar_from_dict({c.name:c.valueforcinsession.cookies},new_cookie_jar) new_cookie_jar.save(cookie_path,ignore_discard=True,ignore_expires=True)
UrlUtils
importtime 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.0r0&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(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3904.108Safari/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"[/mw_shl_code]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。