Python 实现12306登录功能实例代码


Posted in Python onFebruary 09, 2018

下面一段代码给大家带来了python实现12306登录功能,具体代码如下所示:

#!/usr/bin/env python
import requests
import urllib.parse
import random
import time
req = requests.session()
import sys
import re
import urllib3
import getpass # 密文输入
urllib3.disable_warnings()
# 登陆-------------------------
apptklist = []
newStrList = []
def signin():
 ran = random.uniform(1, 0)
 imgUrl = ('https://kyfw.12306.cn/passport/captcha/captcha-image?'
    'login_site=E&module=login&rand=sjrand&%s' % ran)
 print(imgUrl)
 imgresponse = req.get(url=imgUrl, verify=False)
 codeimg = imgresponse.content
 fn = open('code.png', 'wb')
 fn.write(codeimg)
 fn.close()
 codeStr = input('请输入验证码的坐标:')
 a = ''
 b = ''
 c = ''
 d = ''
 e = ''
 f = ''
 g = ''
 h = ''
 if '1' in codeStr:
  a = '37,37,'
 if '2' in codeStr:
  b = '100,37,'
 if '3' in codeStr:
  c = '180,37,'
 if '4' in codeStr:
  d = '250,37,'
 if '5' in codeStr:
  e = '37,100,'
 if '6' in codeStr:
  f = '100,100,'
 if '7' in codeStr:
  g = '180,100,'
 if '8' in codeStr:
  h = '250,100,'
 newCodeStr = a+b+c+d+e+f+g+h
 newStr = newCodeStr[:-1]
 newStrList.append(newStr)
 url = 'https://kyfw.12306.cn/passport/captcha/captcha-check'
 data = {
  'answer':newStr,
  'login_site':'E',
  'rand':'sjrand'
 }
 headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
      ' Chrome/63.0.3239.108 Safari/537.36',
 }
 response = req.post(url=url, data=data, headers=headers, verify=False)
 print('检测图片-----------', url)
 print(response.text)
 result = response.json()
 if result['result_code'] == '4':
  print('验证码校验成功')
 else:
  print('验证码校验失败,请注意填写正确的坐标')
  signin()
  return
 userName = input('Please input your userName:')
 # password = input('Please input your password:')
 password = getpass.getpass('Please input your password:')
 loginData = {
  'username':userName,
  'password':password,
  'appid':'otn'
 }
 headers = {
  'Host':'kyfw.12306.cn',
  'Referer':'https://kyfw.12306.cn/otn/login/init',
  'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)'
      ' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 '
      'Safari/537.36'
 }
 response = req.post('https://kyfw.12306.cn/passport/web/login', data=loginData, headers=headers, verify=False)
 print('--------------登陆中--------------------')
 print('https://kyfw.12306.cn/passport/web/login')
 print('response', response.text.encode('utf-8').decode('utf-8'))
 fd = open("locate.html", 'wb+')
 fd.write(response.content)
 yzData = {
  'appid':'otn'
 }
 response = req.post('https://kyfw.12306.cn/passport/web/auth/uamtk', data=yzData, headers=headers, verify=False)
 print('---------------------第一次验证---------------------')
 print(response.text)
 # print('typeof response',type(response))
 loginMessage = response.json()['newapptk']
 print('loginMessage=', loginMessage)
 # 第二次验证开始++++++++++++++++++++++++++++++
 yz2Data = {
  'tk': loginMessage
 }
 response = req.post('https://kyfw.12306.cn/otn/uamauthclient', data=yz2Data, headers=headers,verify=False)
 print('---------------------第二次验证---------------------')
 print(response.text)
 apptk = response.json()['apptk']
 apptklist.append(apptk)
def buy():
 print(newStrList)
 req.headers['Referer'] = 'https://kyfw.12306.cn/otn/leftTicket/init'
 result = req.post('https://kyfw.12306.cn/otn/login/checkUser')
 print('----------------购票系统--------------')
 print(result.text)
 print('验证登录状态成功checkUser')
 headers = {
  'Referer':'https://kyfw.12306.cn/otn/leftTicket/init',
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36'
      ' (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
 }
 data = {
  # 'secretStr':reserve[1],
  'train_date':'2018-01-17',
  'back_train_date':'2018-01-17',
  'tour_flag':'dc', # dc 单程
  'purpose_codes':'ADULT', # adult 成人票
  'query_from_station_name':'成都',
  'query_to_station_name':'长沙',
  'undefined':''
 }
def ticket():
 # 先登陆、然后查询车票信息
 signin()
 url = ('https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2018-02-10&'
   'leftTicketDTO.from_station=SZQ&leftTicketDTO.to_station=NFG&purpose_codes=ADULT')
 try:
  response = requests.get(url, verify=False)
  result = response.json()
  print(result)
  return result['data']['result']
 except Exception as e:
  return None
if __name__ == "__main__":
 # ticket()
 # with open('./aaa.xlsx', encoding='utf-8') as f:
 #
 #  print(f.read())
 dic = {}
 context = [('IDS_ABOUT_OFFICAL_PHONE', 'Službeni telefon'),
    ('IDS_ABOUT_OFFICAL_WEBSITE', 'Službeno web-mjesto'),
    ('IDS_ABOUT_OFFICIAL_PHONE_CALL_NOT_SUPPORT', 'Trenutni uređaj ne može pozivati.')]
 for i in range(len(context)):
  print(i)
  dic.setdefault(context[i][0],context[i][1])
 print(dic)
 print(dic.keys())

总结

以上所述是小编给大家介绍的Python 实现12306登录实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python脚本实现分析dns日志并对受访域名排行
Sep 18 Python
Python网页解析利器BeautifulSoup安装使用介绍
Mar 17 Python
Python的面向对象编程方式学习笔记
Jul 12 Python
Python计算斗牛游戏概率算法实例分析
Sep 26 Python
python正则表达式面试题解答
Apr 28 Python
python实现在pandas.DataFrame添加一行
Apr 04 Python
pandas将DataFrame的列变成行索引的方法
Apr 10 Python
python re正则匹配网页中图片url地址的方法
Dec 20 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
pytorch实现对输入超过三通道的数据进行训练
Jan 15 Python
Python PIL库图片灰化处理
Apr 07 Python
Python图片检索之以图搜图
May 31 Python
Python多层装饰器用法实例分析
Feb 09 #Python
理论讲解python多进程并发编程
Feb 09 #Python
Python装饰器(decorator)定义与用法详解
Feb 09 #Python
详解python的ORM中Pony用法
Feb 09 #Python
python监控键盘输入实例代码
Feb 09 #Python
Python with语句上下文管理器两种实现方法分析
Feb 09 #Python
Python遍历pandas数据方法总结
Feb 09 #Python
You might like
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
javascript 表单验证常见正则
2009/09/28 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
Jquery跨域获得Json的简单实例
2016/05/18 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
jQuery:unbind方法的使用详解
2017/08/14 jQuery
js原生日历的实例(推荐)
2017/10/31 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
浅谈使用React.setState需要注意的三点
2017/12/18 Javascript
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
vue debug 二种方法
2018/09/16 Javascript
vue elementui form表单验证的实现
2018/11/11 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
用Node写一条配置环境的指令
2019/11/14 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
Python字符串和文件操作常用函数分析
2015/04/08 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
2019/10/12 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
耐克亚太地区:Nike APAC
2019/12/07 全球购物
运动会稿件100字
2014/02/21 职场文书
体育专业求职信
2014/07/16 职场文书
财务人员廉洁自律心得体会
2016/01/13 职场文书
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis
Windows7下FTP搭建图文教程
2022/08/05 Servers