最近一段时间一直在研究用Python模拟登陆12306网站并自动刷票下单,经过一段时间的摸索,终于完成了代码,实现了12306刷票的功能。话不多说,先给大伙儿看看成果。我录制了一段时间,展示了自动刷票下单的全过程,实际效果可以移步这里观看:

Python模拟登陆12306并自动下单

可以看到,只需要输入车次和乘车人姓名,代码能自动下单预定,基本达到了我预想的效果。接下来我就一步一步给大家详细讲解一下这个模拟登陆并自动下单的过程。
首先是登陆。通过抓包我们发现,12306的登陆是分两步的,第一步是获取验证码并验证验证码输入是否正确,输入正确接下来才会验证用户名和密码,全都验证通过方才能成功登陆。我们的第1步是获取验证码。
通过抓包,我们可以知道12306获取验证码的地址是:https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&0.8030393410546426,获取方式是GET,我们首先导入requests库,建立一个会话。
#!/usr/bin/env python
# -*- coding:utf-8 -*-import requests
session = requests.session()
然后设置请求验证码网址,获得验证码。这里为了确保验证码出错了程序能自动重新获取验证码,我们使用一个While循环。另外,为了确保验证码能看清晰,我们将验证码图片保存到本地来。
captchaurl = 'https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&0.8030393410546426'
While True:captchapage = session.get(captchaurl)with open('code.png','wb') as fn:fn.write(captchapage.content)fn.close()
然后我们构造一个字典,将验证码的位置信息放进去,这样方便我们在登陆的时候只需要输入验证码序号即可实现验证。
code = {'1': '40,40','2': '110,40','3': '180,40','4': '260,40','5': '40,120','6': '110,120','7': '180,120','8': '260,120'}
这是我通过摸索确定的验证码的位置信息。这里有一个难题,符合条件的验证码的图片张数是不确定的,有可能是1张,2张,3张甚至更多,我们怎么处理呢?通过切片和添加把符合条件的位置信息组合成一个字符串。
 captchacode = input('请输入验证码序号:')  #用户手动输入验证码序号
temp = captchacode.split(',') #将输入的序号以','号分隔,组成一个输入的数字的列表
tempcode = ''  #构建一个空字符串
for i in temp:  # 对验证码序号列表进行遍历tempcode += code[i] + ',' #将每个验证码序号对应的位置信息添加到字符串中,并加上','号
finalcode = tempcode.rstrip(',')   #将最后一个','号去掉,构成一个位置信息的字符串
然后我们将这些信息POST给验证码验证网址进行验证,代码如下:
captchadata = {'answer': finalcode,'login_site': 'E','rand': 'sjrand'}
captchaheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36','Referer':'https://kyfw.12306.cn/otn/login/init'
}
captchaurl = 'https://kyfw.12306.cn/passport/captcha/captcha-check'
captchapage = session.post(captchaurl,data=captchadata,headers=captchaheaders,verify=False)  #注意关掉SSL验证   
然后我们对返回的页面进行解析,得到验证的结果。
passmess = json.loads(passpage.text)
if passmess['result_code'] == '4': #4代表成功,5代表验证码错误,8代表验证信息为空print(passmess['result_message'])
else:print('验证失败,请重新输入')continue #重新进行验证
验证码验证成功后就需要进行登陆,因为是验证成功之后紧接着进行的,我们把如下代码放到if条件语句之后,完整代码如下:
passmess = json.loads(passpage.text)
if passmess['result_code'] == '4':print(passmess['result_message'])loginurl = 'https://kyfw.12306.cn/passport/web/login'logindata = {'username':'用户名','password':'密码','appid':'otn'}loginpage = session.post(loginurl,data=logindata,headers=passheaders,verify=False)loginmess = json.loads(loginpage.text)print(loginmess['result_message'])break
else:print('验证失败,请重新输入')continue
这样就实现了模拟登陆。当然,在这里你也可以对登陆的结果进行判断,主要是看用户名和密码是否正确,这个判断也可以先在浏览器中做好,确保写入程序的用户名和密码是正确的。
(未完待续,有空再更)

使用Python模拟登陆12306并全自动下单相关推荐

  1. python模拟登陆 验证码el_python 模拟登陆github的示例

    # -*- coding: utf-8 -*- # @Author: CriseLYJ # @Date: 2020-08-14 12:13:11 import re import requests c ...

  2. python模拟登陆163邮箱并获取通讯录

    From: http://hi.baidu.com/fc_lamp/blog/item/2466d1096fcc532de8248839.html python模拟登陆163邮箱并获取通讯录 #-*- ...

  3. 潜心专研Python模拟登陆专题,实现网易云音乐自动签到!这项目居然只值三百?

    前言: 时隔三周没有和大家见过面了,最近在研究python模拟登陆专题,话不多说,让我们愉快地开始实现模拟登陆实现网易云自动签到 开发工具 **Python****版本:**3.6.4 相关模块: D ...

  4. python模拟登陆 验证码el_python 模拟登陆163邮箱

    import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium ...

  5. Python模拟登陆大连交通大学教务在线

    Python模拟登陆大连交通大学教务在线,使用wxPython做的界面,urllib2发送数据,可以实现登陆后获取首页登陆数据的功能,目前只做登陆,其他的暂时没做 Python2.7代码 # -*- ...

  6. Python3 爬虫实战 — 模拟登陆12306【点触验证码对抗】

    登陆时间:2019-10-21 实现难度:★★★☆☆☆ 请求链接:https://kyfw.12306.cn/otn/resources/login.html 实现目标:模拟登陆中国铁路12306,攻 ...

  7. python模拟登录qq账号密码_最新的Python模拟登陆QQ脚本,一键批量登录,强行过验证!...

    Python模拟QQ批量登陆脚本,以下代码附带解释以便于理解思路. Python代码: #coding=utf-8 import os import time import win32gui impo ...

  8. python github登陆_用Python模拟登陆GitHub并获取信息

    最近在研究如何对搜狗搜索公众号文章进行爬取,由于需要用到Cookies,所以这回先了解下Cookies的相关知识. 搜狗的反爬有点厉害,即使我用了高匿代理,它还是会提醒我IP访问过于频繁,然后跳转验证 ...

  9. python模拟登陆

    简单使用python(python3.7)模拟登陆github # !/usr/bin/env python # -*-coding:utf-8-*- """ @Auth ...

最新文章

  1. 武器化道路越走越远的无人机
  2. 大龄计算机考研 考研帮,大龄学子考研之路
  3. python中int input_python中的input是什么
  4. git常用命令之log
  5. Python使用超高效算法查找所有类似123-45-67+89=100的组合
  6. php 中 date转换为字符串,PHP 时间与字符串的相互转化
  7. 【bzoj5133】[CodePlus2017年12月]白金元首与独舞 并查集+矩阵树定理
  8. 小波变换与傅里叶变换的区别
  9. 越优秀的人,越早想通透这七件事
  10. 2021-07-25梦笔记
  11. 机器人工程师学习计划(新工科自学方案)------杨硕
  12. 四叶草关闭啰嗦模式_教你如何解决 Win7 64位卡LOGO(四叶草)
  13. cadence设计PCB流程
  14. php 最常用的内置函数大全
  15. 《CSDN排行榜冲榜攻略》妙用Emoji表情符号读者提升阅读体验(编码表)
  16. 微信如何将聊天记录输出html或pdf
  17. 文件夹里面的文件批量改名字
  18. 2所非211院校挺进全球高校600强,甩开一众985 | 泰晤士世界大学排行榜出炉
  19. css动画animation详细解读
  20. ubuntu项目移植windows

热门文章

  1. 实现微信小程序直播的2种方式|7大场景解决方案
  2. java Gecco的爬虫框架的使用
  3. 2015最流行的Android组件、工具、框架大全 UI框架大全
  4. 网页js打开微信小程序示例
  5. 什么是spring,它能够做什么?
  6. R语言 | xlsx包的安装(附链接:java环境变量的配置与详解)
  7. 【一看就懂】数据结构以及各种算法的可视化演示工具
  8. 你拿VR干什么?VR这五大领域你都体验过么?
  9. html 更改视频封面,HTML5视频标签 - 如何设置封面背景大小
  10. 输入一个数组,求出这个数组中的逆序对的总数