python 12306登录_基于Python3的12306登录实现

#-*- coding: utf-8 -*-

importsys

sys.path.append("..")importrequests, jsonfrom common.base importBasefrom requests.packages.urllib3.exceptions importInsecureRequestWarning#禁用安全请求警告

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)__author__ = 'Rachel feng'PATH= 'https://kyfw.12306.cn'

__all__ = ['LoginTic']classLoginTic(Base):def __init__(self):

super(LoginTic, self).__init__()#验证结果

defcheckYanZheng(self,solution):## 分割用户输入的验证码位置

#225,83|181,31|35,67 => 225,83,181,31,35,67

yanStr = solution.replace('|',',')print('校验验证码......')

checkUrl= "https://kyfw.12306.cn/passport/captcha/captcha-check"data={'login_site':'E', #固定的

'rand':'sjrand', #固定的

'answer':yanStr #验证码对应的坐标,两个为一组,跟选择顺序有关,有几个正确的,输入几个

}print(data)#发送验证

cont = self.requests.post(checkUrl, data=data, verify=False)#返回json格式的字符串,用json模块解析

dic =cont.json()

code= dic['result_code']#取出验证结果,4:成功 5:验证失败 7:过期

if str(code) == '4':returnTrueelse:print(dic)returnFalse#发送登录请求的方法

defloginTo(self, userName, pwd):

yan=self.decode_captcha(url)

check=False##只有验证成功后才能执行登录操作

#while not check:

check =self.checkYanZheng(yan)if notcheck:return 600, '验证失败,请重新验证'loginUrl= "https://kyfw.12306.cn/passport/web/login"data={'username':userName,'password':pwd,'appid':'otn'}print(data)

headers={'Origin': 'https://kyfw.12306.cn','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36','Referer': 'https://kyfw.12306.cn/otn/login/init','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Accept': 'application/json, text/javascript, */*; q=0.01'}

result= self.requests.post(loginUrl,data=data,headers=headers)

dic=result.json()print(dic)

mes= dic['result_message']#结果的编码方式是Unicode编码,所以对比的时候字符串前面加u,或者mes.encode('utf-8') == '登录成功'进行判断,否则报错

if mes == u'登录成功':#获取cookie

r = self.requests.post('https://kyfw.12306.cn/otn/login/userLogin')

data= {'appid': 'otn'}

r= self.requests.post('https://kyfw.12306.cn/passport/web/auth/uamtk', data=data)if r.status_code != 200:return 600, '登录验证不通过'd=r.json()if d.get('result_code') ==0:

data={'tk': d.get('newapptk')

}

r= self.requests.post('https://kyfw.12306.cn/otn/uamauthclient', data=data)

d=r.json()print(d)if d.get('result_code') ==0:print('恭喜你,登录成功,可以购票!')returnTrueelse:return 600, d.get('result')else:print(dic.get('result_message'))return 600, dic.get('result_message')defget_info(self):

data= {'_json_att': ''}

headers={'Referer': 'https://kyfw.12306.cn/otn/index/initMy12306','Origin': 'https://kyfw.12306.cn','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36','Content-Type': 'application/x-www-form-urlencoded'}

r= self.requests.post('https://kyfw.12306.cn/otn/modifyUser/initQueryUserInfo', data=data, headers=headers)if r.status_code != 200:print('获取购票人信息异常')

with open('__tmp/userInfo.html', 'wb') as f:

f.write(r.content)

f.close()print('获取信息成功')if __name__ == '__main__':

userName= '’ #12306登录账号

pwd = '' #12306登录密码

url = "https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand";

login=LoginTic()

d=login.loginTo(userName, pwd)if type(d) !=tuple:

login.get_info()else:print(d)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值