社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

牛X,试用了下 GitHub 上 2 万 Star 的第一抢票神器,3 秒钟抢到!

机器学习算法与自然语言处理 • 4 年前 • 467 次点击  

点击上方“MLNLP”,选择“星标”公众号

重磅干货,第一时间送达

大数据文摘出品

作者:曹培信、池俊辉


盼望着,盼望着,

春节的脚步近了,

然而,每年到这个时候,

最难的,

莫过于一张回家的火车票。




据悉,

今年春运期间,

全国铁路发送旅客人次同比将增长8.0%。

达到4.4亿人次,


2020年铁路春运自1月10日开始,

2月18日结束,共40天,

节前15天,节后25天,

今年的12月12日起日1月10日火车票正式发售。



即使再难,家还是要回的,票还是要抢的,所以这一周,GitHub上用python抢票的项目又重回top榜单。



这个抢票小助手诞生于2017年,作者是文贤平/文先森 (testerSunshine) ,目前这个项目标星已经将近20000,可想而知程序员们回家的愿望是多么的迫切!


史上最强抢票助手,紧随12306更新


从项目的更新日志可以看到,这个项目的第一次更新是在2017.5.13,之后一共进行了32次更新,其中大部分是作者本人,也有一些开发者提供了支持。


这个项目基本上是紧随着12306网站的功能更新而更新的,比如去年春运增加的候补功能,在票卖完的情况下预先付款,等其他人退票之后自动补上。该项目也在今年加入了这个功能。



目前这个抢票小助手基本支持12306的所有主要功能,包括相当邮件通知、智能候补等。


             


这个抢票小助手堪称史上最强的抢票小助手了,作者在项目后面提供了交流群,9个群如今已经有7个满了,可想而知这是多么强大的力量。



句句代码,只为抢一张回家的票


作者为了这个项目还是费了不少心血的,首先我们来看一下作者的思路。



思路并不复杂而且相当紧凑。


首先需要下载一个机器学习模型完成对12306验证码的自动识别,该模型需放于项目根目录中。


1. 模型下载链接:

https://pan.baidu.com/s/1rS155VjweWVWIJogakechA  

密码:bmlm

2. git仓库下载:

https://github.com/testerSunshine/12306model.git
   (1)cd 12306/
   (2)git clone
https://github.com/testerSunshine/12306model.git



模型的安装需要一些依赖,具体如下:



满足了依赖之后可以进行安装:

  • root用户(避免多python环境产生问题):


pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt


  • 非root用户(避免安装和运行时使用了不同环境): 


pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt


许多windows的用户装不了tensorflow的话,可以适当降低版本或者升高版本都是可以的。


注意,在过程中如果报错为缺少上面列表中的依赖,只需单独使用pip3安装相应依赖包即可。




而后就可以启动项目了。


第一步:修改配置文件


# 测试邮箱和server酱是否可用, server酱测试的前提是server酱开关开启

# 可以配置server酱提醒(推荐)[配置教程](https://www.jianshu.com/p/8d10b5b9c4e3)

# 用python3 还是python 完全取决于安装的时候配置的环境变量是否为python3,以下启动默认环境变量为python3

python3 run.py t


配置文件说明(仔细阅读说明!):



# -*- coding=utf-8 -*-

#
 关于软件使用配置说明,一定要看!!!

#
 ps: 如果是候补车票,需要通过人证一致性核验的用户及激活的“铁路畅行”会员可以提交候补需求,请您按照操作说明在铁路12306app.上完成人证核验

#
 关于候补了之后是否还能继续捡漏的问题在此说明:软件为全自动候补加捡漏,如果软件候补成功则会停止抢票,发出邮件通知,但是不会影响你继续捡漏,

#
 如果这个时候捡漏捡到的话,也是可以付款成功的,也就是说,捡漏+候补,可以最大程度提升抢票成功率



#
 刷票模式:1=刷票 2=候补+刷票

TICKET_TYPE = 1



#
 出发日期(list) "2018-01-06" "2018-01-07"

STATION_DATES = [

    "2020-01-17"

]

#
 填入需要购买的车次(list),"G1353"

#
 修改车次填入规则,注:(以前设置的车次逻辑不变),如果车次填入为空,那么就是当日乘车所有车次都纳入筛选返回

#
 不填车次是整个list为空才算,如果不是为空,依然会判断车次的,这种是错误的写法 [""], 正确的写法 []

STATION_TRAINS = ["G1120"]

#
 出发城市,比如深圳北,就填深圳就搜得到

FROM_STATION = "广州"

#
 到达城市 比如深圳北,就填深圳就搜得到

TO_STATION = "武汉"

#
 座位(list) 多个座位ex:

#
 "商务座",

#
 "一等座",

#
 "二等座",

#
 "特等座",

#
 "软卧",

#
 "硬卧",

#
 "硬座",

#
 "无座",

#
 "动卧",

SET_TYPE = ["二等座"]


#
 当余票小于乘车人,如果选择优先提交,则删减联系人和余票数一致在提交

#
 bool

IS_MORE_TICKET = True


#
 乘车人(list) 多个乘车人ex:

#
 "张三",

#
"李四"

TICKET_PEOPLES = [""]


#
 12306登录账号

USER = ""

PWD = ""


#
 加入小黑屋时间默认为5分钟,此功能为了防止僵尸票导致一直下单不成功错过正常的票

TICKET_BLACK_LIST_TIME = 5


#
 自动打码

IS_AUTO_CODE = True


#
 设置2本地自动打码,需要配置tensorflow和keras库,3为云打码,由于云打码服务器资源有限(为2h4C的cpu服务器),请不要恶意请求,不然只能关闭服务器

#
 ps: 请不要一直依赖云服务器资源,在此向所有提供服务器同学表示感谢

AUTO_CODE_TYPE = 3


#
 此处设置云打码服务器地址,如果有自建的服务器,可以自行更改

HOST = "120.77.154.140:8000"

REQ_URL = "/verify/base64/"

HTTP_TYPE = "http"

#
 HOST="12306.yinaoxiong.cn" #备用服务器稳定性较差

#
 REQ_URL="/verify/base64/"

#
 HTTP_TYPE="https"


#
  邮箱配置,如果抢票成功,将通过邮件配置通知给您

#
  列举163

#
  email: "xxx@163.com"

#
  notice_email_list: "123@qq.com"

#
  username: "xxxxx"

#
  password: "xxxxx

#
  host: "smtp.163.com"

#
  列举qq ,qq设置比较复杂,需要在邮箱-->账户-->开启smtp服务,取得授权码==邮箱登录密码

#
  email: "xxx@qq.com"

#
  notice_email_list: "123@qq.com"

#
  username: "xxxxx"

#
  password: "授权码"

#
  host: "smtp.qq.com"

EMAIL_CONF = {

    "IS_MAIL": True,

    "email": "",

    "notice_email_list": "",

    "username": "",

    "password": "",

    "host": "smtp.qq.com",

}


#
 是否开启 server酱 微信提醒, 使用前需要前往 http://sc.ftqq.com/3.version 扫码绑定获取 SECRET 并关注获得抢票结果通知的公众号

SERVER_CHAN_CONF = {

    "is_server_chan": False,

    "secret": ""

}

#
 是否开启cdn查询,可以更快的检测票票 1为开启,2为关闭

IS_CDN = 1


#
 下单接口分为两种,1 模拟网页自动捡漏下单(不稳定),2 模拟车次后面的购票按钮下单(稳如老狗)

ORDER_TYPE = 2

#
 下单模式 1 为预售,整点刷新,刷新间隔0.1-0.5S, 然后会校验时间,比如12点的预售,那脚本就会在12.00整检票,刷新订单

#
         2 是捡漏,捡漏的刷新间隔时间为0.5-3秒,时间间隔长,不容易封ip

ORDER_MODEL = 1


#
 是否开启代理, 0代表关闭, 1表示开始

#
 开启此功能的时候请确保代理ip是否可用,在测试放里面经过充分的测试,再开启此功能,不然可能会耽误你购票的宝贵时间

#
 使用方法:

#
 1、在agency/proxy_list列表下填入代理ip

#
 2、测试UnitTest/TestAll/testProxy 测试代理是否可以用

#
 3、开启代理ip

IS_PROXY = 0

#
 预售放票时间, 如果是捡漏模式,可以忽略此操作

OPEN_TIME = "12:59:50"

#
 1=使用selenium获取devicesID

#
 2=使用网页端/otn/HttpZF/logdevice获取devicesId,这个接口的算法目前可能有点问题,如果登录一直302的请改为配置1

#
 3=自己打开浏览器在headers-Cookies中抓取RAIL_DEVICEID和RAIL_EXPIRATION,这个就不用配置selenium

COOKIE_TYPE = 3

#
 如果COOKIE_TYPE=1,则需配置chromeDriver路径,下载地址http://chromedriver.storage.googleapis.com/index.html

#
 chromedriver配置版本只要和chrome的大版本匹配就行

CHROME_PATH = "/usr/src/app/chromedriver"

#
 为了docker37 准备的环境变量,windows环境可以不用管这个参数

CHROME_CHROME_PATH = "/opt/google/chrome/google-chrome"

#
 如果COOKIE_TYPE=3, 则需配置RAIL_EXPIRATION、RAIL_DEVICEID的值

RAIL_EXPIRATION = "1577033439142"

RAIL_DEVICEID = "PuV16sVaV-CTGsFZUuL8JLAk4OhuT1wgUYC_W3L2JZfWx8Ygx8LOPkko3PSOrK5_xSKhXjgyTMS8dBmj1RZHL2CKBTmVs6UG_yptlB4NJbGHldltrLMTUEgoDpSkpX2vzpGXgMQsTRzgOXfuQkAWwS4GjCxSmV3C; BIGipServerpassport=820510986.50215.0000; route=9036359bb8a8a461c164a04f8f50b252"


#
 1=>为一直随机ua,2->只启动的时候随机一次ua

RANDOM_AGENT = 2

PASSENGER_TICKER_STR = {

    '一等座': 'M',

    '特等座': 'P',

    '二等座': 'O',

    '商务座': 9,

    '硬座': 1,

    '无座': 1,

    '软座': 2,

    '软卧': 4,

    '硬卧': 3,

}


#
 保护12306官网请求频率,设置随机请求时间,原则为5分钟不大于80次

#
 最大间隔请求时间

MAX_TIME = 3

#
 最小间隔请求时间

MIN_TIME = 1


#
 软件版本

RE_VERSION = "1.2.003"



第二步:启动前筛选cdn


python3 run.py c


第三步:启动服务


python3 run.py r


成功抢票后就会出现下面的结果啦!



项目地址:

https://github.com/testerSunshine/12306


程序员为了抢火车票,都干了什么!


程序员为了抢票而写代码这件事可以追溯到12306网站刚出现的时候。


2010年初,12306网络购票刚刚出现,一年后GitHub上就已经有程序员为了买票而写脚本了,但是当时仅限于查询余票。



随后,越来越多的程序员开始了“面向回家编程”,出的最大的新闻是差点搞垮GitHub。


2012年,一位叫做iFish的大佬开发的插件,被很多浏览器的春节版本纷纷搭载,连12306官方也引用了里面的一个资源。



这个插件引发了著名的「12306 订票助手拖垮 GitHub」事件。


简单来说,就是这款“订票助手”使用的文件并不是普通的静态文件(例如 gist),而是一个repo 的raw data。这就意味着,每次有人请求这个文件,github都要去访问这个repo,查找要求的数据。


并且,如果一次数据请求失败,那么这个指令就会就每五秒请求一次,直到成功。于是在春节前十几天的抢票高峰时,巨大的访问量导致Github受到DDOS攻击,不堪负载。


事后作者本人也表示:慌得一批。



之后随着各种App付费抢票的出现,很多人不会选择码一堆代码只为抢一张票,但是程序员心中的执念还是始终不会熄灭,“面向回家编程”,再艰难也是值得的!


最后小编也祝愿各位小伙伴们:在今年的春运中成功抢票,顺利回家!



推荐阅读:


一战赚了1090亿,恐怖的张一鸣!

教育部官宣:985/211已成为历史!

超越ReLU却鲜为人知,3年后被挖掘:BERT、GPT-2等都在用的激活函数

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52293
 
467 次点击