#-*- 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)