盼望着,盼望着,春节的脚步近了,然而,每年到这个时候,最难的,莫过于一张回家的火车票。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 用Python抢到回家的车票,so easy! Python 第1张

用Python抢到回家的车票,so easy! Python 第2张用Python抢到回家的车票,so easy! Python 第3张

据悉,今年春运期间,全国铁路发送旅客人次同比将增长 8.0%。达到 4.4 亿人次。

用Python抢到回家的车票,so easy! Python 第4张用Python抢到回家的车票,so easy! Python 第5张

2020 年铁路春运自 1 月 10 日开始,2 月 18 日结束,共 40 天,节前 15 天,节后 25 天,今年的 12 月 12 日春运火车票正式发售。

用Python抢到回家的车票,so easy! Python 第6张用Python抢到回家的车票,so easy! Python 第7张

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

用Python抢到回家的车票,so easy! Python 第8张用Python抢到回家的车票,so easy! Python 第9张

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

 

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

 

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

 

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

 

该项目也在今年加入了这个功能:

用Python抢到回家的车票,so easy! Python 第10张用Python抢到回家的车票,so easy! Python 第11张

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

 用Python抢到回家的车票,so easy! Python 第12张用Python抢到回家的车票,so easy! Python 第13张

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

用Python抢到回家的车票,so easy! Python 第14张用Python抢到回家的车票,so easy! Python 第15张

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

 

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

用Python抢到回家的车票,so easy! Python 第16张用Python抢到回家的车票,so easy! Python 第17张

思路并不复杂而且相当紧凑。首先需要下载一个机器学习模型完成对 12306 验证码的自动识别,该模型需放于项目根目录中。

 

①模型下载链接:

 

https://pan.baidu.com/s/1rS155VjweWVWIJogakechA  
密码:bmlm
用Python抢到回家的车票,so easy! Python 第18张

 

②Git 仓库下载:

 

https://github.com/testerSunshine/12306model.git
   (1)cd 12306/
   (2)git clone
https://github.com/testerSunshine/12306model.git
用Python抢到回家的车票,so easy! Python 第19张

 

用Python抢到回家的车票,so easy! Python 第20张用Python抢到回家的车票,so easy! Python 第21张

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

用Python抢到回家的车票,so easy! Python 第22张用Python抢到回家的车票,so easy! Python 第23张

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

 

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

 

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
用Python抢到回家的车票,so easy! Python 第24张

 

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

 

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
用Python抢到回家的车票,so easy! Python 第25张

 

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

 

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

用Python抢到回家的车票,so easy! Python 第26张用Python抢到回家的车票,so easy! Python 第27张

而后就可以启动项目了。

 

第一步:修改配置文件

 

 

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

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

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

python3 run.py t
用Python抢到回家的车票,so easy! Python 第28张

 

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

 

# -*- 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"
用Python抢到回家的车票,so easy! Python 第29张

 

第二步:启动前筛选 CDN

 

 

python3 run.py c
用Python抢到回家的车票,so easy! Python 第30张

 

第三步:启动服务

 

 

python3 run.py r
用Python抢到回家的车票,so easy! Python 第31张

 

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

用Python抢到回家的车票,so easy! Python 第32张用Python抢到回家的车票,so easy! Python 第33张

项目地址:

 

https://github.com/testerSunshine/12306
用Python抢到回家的车票,so easy! Python 第34张

 

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

 

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

 

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

用Python抢到回家的车票,so easy! Python 第35张用Python抢到回家的车票,so easy! Python 第36张

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

 

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

用Python抢到回家的车票,so easy! Python 第37张用Python抢到回家的车票,so easy! Python 第38张

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

 

简单来说,就是这款“订票助手”使用的文件并不是普通的静态文件(例如 gist),而是一个 repo 的 raw data。

 

这就意味着,每次有人请求这个文件,GitHub 都要去访问这个 repo,查找要求的数据。

 

并且,如果一次数据请求失败,那么这个指令就会每五秒请求一次,直到成功。

 

于是在春节前十几天的抢票高峰时,巨大的访问量导致 Github 受到 DDOS 攻击,不堪负载。

用Python抢到回家的车票,so easy! Python 第39张

 

 

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

用Python抢到回家的车票,so easy! Python 第40张用Python抢到回家的车票,so easy! Python 第41张

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

 

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

盼望着,盼望着,春节的脚步近了,然而,每年到这个时候,最难的,莫过于一张回家的火车票。

 

用Python抢到回家的车票,so easy! Python 第42张据悉,今年春运期间,全国铁路发送旅客人次同比将增长 8.0%。达到 4.4 亿人次。用Python抢到回家的车票,so easy! Python 第43张
2020 年铁路春运自 1 月 10 日开始,2 月 18 日结束,共 40 天,节前 15 天,节后 25 天,今年的 12 月 12 日春运火车票正式发售。用Python抢到回家的车票,so easy! Python 第44张即使再难,家还是要回的,票还是要抢的,所以这一周,GitHub 上用 Python 抢票的项目又重回 Top 榜单。用Python抢到回家的车票,so easy! Python 第45张

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

 

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

 

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

 

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

 

该项目也在今年加入了这个功能:

用Python抢到回家的车票,so easy! Python 第46张

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

 用Python抢到回家的车票,so easy! Python 第47张这个抢票小助手堪称史上最强的抢票小助手了,作者在项目后面提供了交流群,9 个群如今已经有 7 个满了,可想而知这是多么强大的力量。用Python抢到回家的车票,so easy! Python 第48张

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


作者为了这个项目还是费了不少心血的,首先我们来看一下作者的思路:用Python抢到回家的车票,so easy! Python 第49张

思路并不复杂而且相当紧凑。首先需要下载一个机器学习模型完成对 12306 验证码的自动识别,该模型需放于项目根目录中。


①模型下载链接:

https://pan.baidu.com/s/1rS155VjweWVWIJogakechA  
密码:bmlm


②Git 仓库下载:

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


用Python抢到回家的车票,so easy! Python 第50张模型的安装需要一些依赖,具体如下:用Python抢到回家的车票,so easy! Python 第51张

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

 

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 安装相应依赖包即可。

用Python抢到回家的车票,so easy! Python 第52张

而后就可以启动项目了。
第一步:修改配置文件

 

# 测试邮箱和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

 

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

用Python抢到回家的车票,so easy! Python 第53张

项目地址:

https://github.com/testerSunshine/12306

 

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

 

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

 

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

用Python抢到回家的车票,so easy! Python 第54张

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

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

用Python抢到回家的车票,so easy! Python 第55张

这个插件引发了著名的「12306 订票助手拖垮 GitHub」事件。
简单来说,就是这款“订票助手”使用的文件并不是普通的静态文件(例如 gist),而是一个 repo 的 raw data。

 

这就意味着,每次有人请求这个文件,GitHub 都要去访问这个 repo,查找要求的数据。
并且,如果一次数据请求失败,那么这个指令就会每五秒请求一次,直到成功。

 

于是在春节前十几天的抢票高峰时,巨大的访问量导致 Github 受到 DDOS 攻击,不堪负载。

 

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

用Python抢到回家的车票,so easy! Python 第56张

之后随着各种 App 付费抢票的出现,很多人不会选择码一堆代码只为抢一张票,但是程序员心中的执念还是始终不会熄灭,“面向回家编程”,再艰难也是值得的!
最后也祝愿各位小伙伴们:在今年的春运中成功抢票,顺利回家!

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄