开坑

年关将近,终于对12306下手了,,

平安夜撸代码,攻克了12306的登陆

  2018-12-24 22:16:00

没错 这篇博客就写从零开始的异世界..(误)    一从零开始的抢票

可能为期比较长  毕竟下班了才有时间写..  也才接触python半年不到 所以也是一边学习一边写的比较慢...

一、登陆

采用扫码二维码的方式登陆,就是得下个app。。  验证码太烦了,不想搞

1.获取二维码:

先分析二维码一般是一张图片,我们把他下载到本地 来方便扫码

图片还是base64的数据形式

但是我们用传统的方式爬下来 并不能取到图片的信息,只有一个图片占位标签

拿到的东西没有src内容 但是页面上却有,说明图片的url是动态获取填充的

(用到了 SoupStrainer 库安装pip install beautifulSoup4,介绍:开坑中 )

继续分析,发现有这样一个请求,可以拿到图片的src内容

图片是base64形式存储的 可以直接把他保存为图片 (base64:二进制编码数据形式,图片存数据库一般就这样放,取出来解析就是一张图,但是一般会比较长。。 )

需要用到一个库操作图片pip install pillow

由于图片是base64 还需要引入base64的库解码

模拟请求,下载图片:

参数:{appid:otn} //固定的

返回:{"result_message":"生成二维码成功","result_code":"0","image":"iVBORw0KGgoAAAANSUhEUgAAAMcAAA......","uuid":"4B-aKlPZTyR4xlPGh7wmTz553-0ep8w-Lufw8sVxCir-mcQuzTf9iZPX-M4OZYBWjRiASiGJaiv0we1"}

代码:import base64

import json

import os

import re

import requests  # 用requests库,方便保存会话 功能和urllib差不多

from bs4 import BeautifulSoup, SoupStrainer  # 网页解析库 可以替代正则来获取你想要的内容

from PIL import Image  # 操作图片

session = requests.Session() # session会话对象,请求和返回的信息保存在session中

def get(url):

header = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",

}

reqs = session.get(url, headers=header)

return reqs.text

def post(url, data):

header = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",

}

reqs = session.post(url, headers=header, data=data)

return reqs.text

#获取二维码图片

def getQR():

data = post(

'https://kyfw.12306.cn/passport/web/create-qr64', {"appid": "otn"})

json_result = json.loads(data) # 是json格式 直接转成json方便操作

print(json_result)

if(json_result['result_code'] == "0"):

login_pic =getImage(base64.b64decode(json_result['image']))

Image.open(login_pic).show() #依赖PIL库,打开图片(会创建一个零食文件打开图片,图片未被占用时销毁)

def getImage(img):

filepath = './login.png'

with open(filepath, 'wb') as fd: #w写入 b二进制形式

fd.write(img)

return filepath

if __name__ == "__main__":

getQR()

结果

搞定 图片拿回来了。

2.登陆扫码

图片是拿回来了也可以扫了,然而扫完之后并没有什么反应啊。。

继续分析! 12306是如何知道我们已经扫码了?

在上一步我们分析拿二维码的时候 应该有注意到,请求中不止一个二维码的,还有一个大概每秒一个的请求

就是这个checkqr根据字面意思,检查二维码!!

我们扫一扫二维码 再看返回内容  注意result_code从0变成了1 !!

点击确定登陆再看(勾上preserve log 不然跳转了日志就没了)

??

chrome的弊端。。 看不了了 可以用火狐看

搞定! result_code为 2时,说明扫码成功,token  get√!!

用程序来模拟这个请求:

地址:https://kyfw.12306.cn/passport/web/checkqr

参数:{

uuid:"", //这个参数在前面取二维码时,有同时返回回来的

appid:otn 固定的

}

返回:{'result_message': '扫码登录成功', 'result_code': '2', 'uamtk': '1bzmt2A2uZNXk96zw1kwAypjB4m3DzjQease2oBSTCYjnq2q0'}

代码:import base64

import json

import os

import re

import time

import requests  # 用requests库,方便保存会话 功能和urllib差不多

from bs4 import BeautifulSoup, SoupStrainer  # 网页解析库 可以替代正则来获取你想要的内容

from PIL import Image  # 操作图片

import threading

session = requests.Session()  # session会话对象,请求和返回的信息保存在session中

def get(url):

header = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",

}

reqs = session.get(url, headers=header)

return reqs.text

def post(url, data):

header = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",

}

reqs = session.post(url, headers=header, data=data)

return reqs.text

# 获取二维码图片

def getQR():

data = post(

'https://kyfw.12306.cn/passport/web/create-qr64', {"appid": "otn"})

json_result = json.loads(data)  # 是json格式 直接转成json方便操作

if(json_result['result_code'] == "0"):

uuid = json_result['uuid']

threading._start_new_thread(checkqr,(uuid,)) # 开一个线程去执行监听

login_pic = getImage(base64.b64decode(json_result['image']))

Image.open(login_pic).show()  # 依赖PIL库,打开图片(会创建一个零食文件打开图片,图片未被占用时销毁)

def getImage(img):

filepath = './login.png'

with open(filepath, 'wb') as fd:  # w写入 b二进制形式

fd.write(img)

return filepath

def checkqr(uuid):

while(True):

checkqr_url = 'https://kyfw.12306.cn/passport/web/checkqr'

data = post(checkqr_url, {"uuid": uuid, "appid": "otn"})

json_result = json.loads(data)

print(json_result)

status_code = json_result['result_code']

if(status_code == "1"):

print('已扫描请确定')

elif(status_code == "2"):

print(json_result['result_message'])

return

elif(status_code == '3'):  # 二维码过期

getQR()

return

time.sleep(2)

if __name__ == "__main__":

getQR()

结果

虽然提示扫码登陆成功,现在调用检查是否登陆 可以看到结果flag是false 代表未登录   ↓

(不贴完整代码了 太长,后面给源码)

扫码登陆成功主要是取回token,然后带着token去请求验证,可以看到上一个不是扫码成功的请求里并没有token

这里有个重要的点!!!,怎么保存会话

我们的请求全是通过seeesion来发起的,所有如果请求后返回的信息如token,cookie之类,会自动记录到session中,你再用session来发起时 会自动带上请求的cookie之类的信息!

强大

验证:

地址:https://kyfw.12306.cn/passport/web/auth/uamtk

参数:{appid:otn} //固定的

返回:{"result_message":"验证通过","result_code":0,"apptk":null,"newapptk":"oIxLeXFNNYv1526TDD6Avm-oX3OAmexpa3T6bKVEefg36q2q0"}

地址:https://kyfw.12306.cn/otn/uamauthclient

参数:{tk:""} //验证1里返回的newapptk

返回:{"apptk":"oIxLeXFNNYv1526TDD6Avm-oX3OAmexpa3T6bKVEefg36q2q0","result_code":0,"result_message":"验证通过","username":"XX"}

模拟请求:

可以看到验证成功之后 返回了你的邮箱或者姓名之类的信息! 再检查是否登陆 flag:Ture!

到此为止 登陆搞定! 算是剥去衣服

整理下流程:https://kyfw.12306.cn/passport/web/create-qr64 //获取二维码

https://kyfw.12306.cn/passport/web/checkqr //检查二维码是否过期或是否被扫码

https://kyfw.12306.cn/passport/web/auth/uamtk //验证

https://kyfw.12306.cn/otn/uamauthclient //二次验证

下一步刷票 http://www.tnblog.net/cz/article/details/241

python12306抢票犯法_Python实例 2-12306抢票(一) 登陆相关推荐

  1. python实战扫码下载_Python实例 一 12306抢票(一)扫码登陆

    一.登陆 采用扫码二维码的方式登陆,就是得下个app..  验证码太烦了,不想搞 1.获取二维码: 先分析二维码一般是一张图片,我们把他下载到本地 来方便扫码 图片还是base64的数据形式 但是我们 ...

  2. python抢票web端_python+Splinter实现12306抢票功能

    本文实例为大家分享了python实现12306抢票功能的具体代码,供大家参考,具体内容如下 源码记录如下: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # ...

  3. Python实例 一 12306抢票(二) 下单

    第二篇 刷票与下单 原文地址:http://www.tnblog.net/cz/article/details/241 解决"url":"/leftTicket/init ...

  4. python抢券代码_Python写一个京东抢券脚本

    最近看到京东图书每天有优惠券发放,满200减100,诱惑还是蛮大的.反正自己抢不到,想着写个脚本试试. 几个关键步骤 获取优惠券的url 直接审查元素 获取cookie 通过本地代理,比如BurpSu ...

  5. 12306订票助手-给力火车票自动订票插件

    12306订票助手-给力火车票自动订票插件 Posted 2013-01-01  |  11条评论  |  By 熊猫人 火车票  12306  12306.cn  订票助手  订票插件  在外漂泊了 ...

  6. Python之12306余票查询

    简单的Python学习,用Python完成一个12306余票查询- Python之12306余票查询 参考资料来自Python 实现火车票查询工具 需要用到的第三方库 requests,使用 Pyth ...

  7. 全国各地12306订票时间大集合

    全国各地12306订票时间大集合,12306什么时候放票一查便知道!本12306订票时间汇总是摘自12306官网最新时间表,买票之前,先看12306什么时候放票才能增加第一时间买票.想看各地12306 ...

  8. python 12306抢票_Python爬虫实战:12306抢票开源!

    今天就和大家一起来讨论一下python实现12306余票查询(pycharm+python3.7),一起来感受一下python爬虫的简单实践 我们说先在浏览器中打开开发者工具(F12),尝试一次余票的 ...

  9. python12306下单步骤_python编程实现12306的一个小爬虫实例

    本文思路主要来源于实验楼的教程,但是一些具体的一些细节是我自己发现的,比如哪里获得站点对应的3位英文编号,怎么获得这个查询的url 本文用到的库主要有requests(获取url的内容),pretty ...

最新文章

  1. 创建尽可能小的 Docker 容器
  2. 英文题,我恨你啊..
  3. iOS进阶_Socket(Socket简介代码演练)
  4. python 调用支付宝微信接口_前端在h5页面调起微信支付接口和支付宝接口(日常笔记)...
  5. oracle订单,银科软件:Oracle ERP订单管理模块详细介绍
  6. mount: unknown filesystem type 'smbfs' 问题解决
  7. 【面试笔记系列】排序算法汇总
  8. if函数python_python入门(if函数)
  9. 【jQuery笔记】狂拍灰太狼案例笔记
  10. 光信噪比 (OSNR) 的概念及其重要性
  11. linux如何入侵电脑,Linux超大漏洞,按28次Backspace键即可入侵电脑
  12. 系统软件内部测试报告模板,软件系统测试报告模板-20210316091936.pdf-原创力文档...
  13. 车路协同科研教学与实训先导平台 ——一种面向新一代智能交通人才培养的综合实验平台及系统
  14. CleanMyMac X的免费版电脑系统瘦身工具
  15. iOS开发-简单图片背景替换 实现抠图效果
  16. 微信小程序-房屋设施图标
  17. python界面显示图片更换背景_用python制作一个简陋的证件照换底色的桌面控制台应用...
  18. php处理证件照_ps怎么精修证件照
  19. jQuery 基础 筛选和遍历 jQuery 对象
  20. 瑞萨E1仿真器(R0E000010KCE00)支持的MCU系列---78K Family

热门文章

  1. win8更改计算机账户密码忘记了怎么办,密码忘记怎么办?WIN8平板电脑如何重置密码?...
  2. mfc 弹框只出现一次_只出现一次的数字
  3. 为什么局部内部类和匿名内部类只能访问 final 的局部变量?
  4. php项目webpack打包,Vue项目webpack打包部署时Tomcat刷新报404错误问题如何处理
  5. Jmeter性能测试之while控制器的使用
  6. Jenkins定时构建任务
  7. shell 连续空格输出
  8. mmap和shm共享内存的区别和联系
  9. java 取pdf表格内容数据_Java 在PDF中添加表格
  10. 什么可以代替压感笔_什么是优生五项?一般体检可以代替优生五项检查?医生:不可以!...