GithubHelp home page GithubHelp logo

pjialin / py12306 Goto Github PK

View Code? Open in Web Editor NEW
14.2K 326.0 3.5K 2.4 MB

🚂 12306 购票助手,支持集群,多账号,多任务购票以及 Web 页面管理

License: Apache License 2.0

Python 99.48% Dockerfile 0.18% HTML 0.34%

py12306's Introduction

🚂 py12306 购票助手

分布式,多账号,多任务购票

Features

  • 多日期查询余票
  • 自动打码下单
  • 用户状态恢复
  • 电话语音通知
  • 多账号、多任务、多线程支持
  • 单个任务多站点查询
  • 分布式运行
  • Docker 支持
  • 动态修改配置文件
  • 邮件通知
  • Web 管理页面
  • 微信消息通知
  • 代理池支持 (pyproxy-async)

使用

py12306 需要运行在 python 3.6 以上版本(其它版本暂未测试)

1. 安装依赖

git clone https://github.com/pjialin/py12306

pip install -r requirements.txt

2. 配置程序

cp env.py.example env.py

自动打码

(若快已停止服务,目前只能设置free打码模式) free 已对接到打码共享平台,https://py12306-helper.pjialin.com,欢迎参与分享

语音通知

语音验证码使用的是阿里云 API 市场上的一个服务商,需要到 https://market.aliyun.com/products/56928004/cmapi026600.html 购买后将 appcode 填写到配置中

3. 启动前测试

目前提供了一些简单的测试,包括用户账号检测,乘客信息检测,车站检测等

开始测试 -t

python main.py -t

测试通知消息 (语音, 邮件) -t -n

# 默认不会进行通知测试,要对通知进行测试需要加上 -n 参数 
python main.py -t -n

4. 运行程序

python main.py

参数列表

  • -t 测试配置信息
  • -t -n 测试配置信息以及通知消息
  • -c 指定自定义配置文件位置

分布式集群

集群依赖于 redis,目前支持情况

  • 单台主节点多个子节点同时运行
  • 主节点宕机后自动切换提升子节点为主节点
  • 主节点恢复后自动恢复为真实主节点
  • 配置通过主节点同步到所有子节点
  • 主节点配置修改后无需重启子节点,支持自动更新
  • 子节点消息实时同步到主节点

使用

将配置文件的中 CLUSTER_ENABLED 打开即开启分布式

目前提供了一个单独的子节点配置文件 env.slave.py.example 将文件修改为 env.slave.py, 通过 python main.py -c env.slave.py 即可快速启动

Docker 使用

1. 将配置文件下载到本地

docker run --rm pjialin/py12306 cat /config/env.py > env.py
#
curl https://raw.githubusercontent.com/pjialin/py12306/master/env.docker.py.example -o env.py

2. 修改好配置后运行

docker run --rm --name py12306 -p 8008:8008 -d -v $(pwd):/config -v py12306:/data pjialin/py12306

当前目录会多一个 12306.log 的日志文件, tail -f 12306.log

Docker-compose 中使用

1. 复制配置文件

cp docker-compose.yml.example docker-compose.yml

2. 从 docker-compose 运行

docker-compose.yml所在的目录使用命令

docker-compose up -d

Web 管理页面

目前支持用户和任务以及实时日志查看,更多功能后续会不断加入

使用

打开 Web 功能需要将配置中的 WEB_ENABLE 打开,启动程序后访问当前主机地址 + 端口号 (默认 8008) 即可,如 http://127.0.0.1:8008

更新

  • 19-01-10
    • 支持分布式集群
  • 19-01-11
    • 配置文件支持动态修改
  • 19-01-12
    • 新增免费打码
  • 19-01-14
    • 新增 Web 页面支持
  • 19-01-15
    • 新增 钉钉通知
    • 新增 Telegram 通知
    • 新增 ServerChan 和 PushBear 微信推送
  • 19-01-18
    • 新增 CDN 查询

截图

Web 管理页面

Web 管理页面图片

下单成功

下单成功图片

关于防封

目前查询和登录操作是分开的,查询是不依赖用户是否登录,放在 A 云 T 云容易被限制 ip,建议在其它网络环境下运行

QQ 交流群 780289875,TG 群 Py12306 交流

Online IDE

在 Gitpod 中打开

Thanks

  • 感谢大佬 testerSunshine,借鉴了部分实现
  • 感谢所有提供 pr 的大佬
  • 感谢大佬 zhaipro 的验证码本地识别模型与算法

License

Apache License.

py12306's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

py12306's Issues

验证码下载失败

打开了若快打码,但测试的时候总出现
验证码下载失败 错误原因:返回数据为空 5 秒后重试

可能是什么原因呢?

提交成功之后不能自动结束

我提交成功之后怎么又在排队?无法自动退出吗?

=== 正在进行第 291 次查询 邯郸 -> 漯河 === 2019-01-15 14:02:21.862580
[ 查询到座位可用 出发时间 20190208 车次 G521 座位类型 二等座 余票数量 2 ]
检查完成 开始提交订单
提交订单成功
检查订单成功
排队成功,你当前排在第 0 位, 余票还剩余 246 张
提交订单成功
排队等待中,排队人数 111,预计还需要 4 秒
第 1 次排队,请耐心等待
排队等待中,排队人数 118,预计还需要 4 秒
第 2 次排队,请耐心等待
排队等待中,排队人数 189,预计还需要 6 秒
第 3 次排队,请耐心等待
排队等待中,排队人数 129,预计还需要 4 秒

而且排队的人数不是越来越少,而是有时候多有时候少?

运行不通过

日志如下:
(base) C:\Users\chd\Desktop\py12306>python main.py
Traceback (most recent call last):
File "main.py", line 62, in
main()
File "main.py", line 13, in main
CommonLog.print_welcome()
File "C:\Users\chd\Desktop\py12306\py12306\log\common_log.py", line 66, in print_welcome
if not Const.IS_TEST and Config().OUT_PUT_LOG_TO_FILE_ENABLED:
File "C:\Users\chd\Desktop\py12306\py12306\helpers\func.py", line 29, in singleton_new
it.init_original(*args, **kw)
File "C:\Users\chd\Desktop\py12306\py12306\config.py", line 98, in init
self.init_envs()
File "C:\Users\chd\Desktop\py12306\py12306\config.py", line 137, in init_envs
self.envs = EnvLoader.load_with_file(self.CONFIG_FILE)
File "C:\Users\chd\Desktop\py12306\py12306\config.py", line 213, in load_with_file
exec(content)
File "", line 1
# encoding=utf-8

requests_html文件未找到

root@Korea:/py12306# python main.py -t
Traceback (most recent call last):
File "main.py", line 4, in
from py12306.app import *
File "/py12306/py12306/app.py", line 7, in
from py12306.helpers.notification import Notification
File "/py12306/py12306/helpers/notification.py", line 5, in
from py12306.helpers.request import Request
File "/py12306/py12306/helpers/request.py", line 4, in
from requests_html import HTMLSession, HTMLResponse
ModuleNotFoundError: No module named 'requests_html'

OSError: [Errno 98] Address already in use

Traceback (most recent call last):
File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner
self.run()
File "/usr/lib/python3.7/threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "/home/captain/py12306/py12306/web/web.py", line 57, in run_session
self.session.run(debug=debug, port=Config().WEB_PORT, host='0.0.0.0')
File "/usr/lib/python3.7/site-packages/flask/app.py", line 943, in run
run_simple(host, port, self, **options)
File "/usr/lib/python3.7/site-packages/werkzeug/serving.py", line 814, in run_simple
inner()
File "/usr/lib/python3.7/site-packages/werkzeug/serving.py", line 774, in inner
fd=fd)
File "/usr/lib/python3.7/site-packages/werkzeug/serving.py", line 660, in make_server
passthrough_errors, ssl_context, fd=fd)
File "/usr/lib/python3.7/site-packages/werkzeug/serving.py", line 577, in init
self.address_family), handler)
File "/usr/lib/python3.7/socketserver.py", line 449, in init
self.server_bind()
File "/usr/lib/python3.7/http/server.py", line 137, in server_bind
socketserver.TCPServer.server_bind(self)
File "/usr/lib/python3.7/socketserver.py", line 463, in server_bind
self.socket.bind(self.server_address)
OSError: [Errno 98] Address already in use

报错了,看看怎么回事?

为什么会出现排队,不理解

提交订单成功
检查订单成功
排队成功,你当前排在第 0 位, 余票还剩余 325 张
# 提交订单成功!#
排队等待中,排队人数 41,预计还需要 4 秒
第 1 次排队,请耐心等待
排队等待中,排队人数 35,预计还需要 4 秒
第 2 次排队,请耐心等待
排队等待中,排队人数 1,预计还需要 4 秒
第 3 次排队,请耐心等待
排队等待中,排队人数 104,预计还需要 4 秒
第 4 次排队,请耐心等待
排队等待中,排队人数 120,预计还需要 4 秒
第 5 次排队,请耐心等待
排队等待中,排队人数 19,预计还需要 4 秒
第 6 次排队,请耐心等待
排队等待中,排队人数 34,预计还需要 4 秒
第 7 次排队,请耐心等待
排队等待中,排队人数 10,预计还需要 4 秒
第 8 次排队,请耐心等待
排队等待中,排队人数 37,预计还需要 4 秒
第 9 次排队,请耐心等待
排队等待中,排队人数 26,预计还需要 4 秒
第 10 次排队,请耐心等待
排队等待中,排队人数 99,预计还需要 4 秒
第 11 次排队,请耐心等待
排队等待中,排队人数 19,预计还需要 4 秒

第 12 次排队,请耐心等待
排队等待中,排队人数 1,预计还需要 4 秒
第 13 次排队,请耐心等待
排队等待中,排队人数 1,预计还需要 4 秒
第 14 次排队,请耐心等待
排队等待中,排队人数 0,预计还需要 4 秒
第 15 次排队,请耐心等待
排队等待中,排队人数 49,预计还需要 4 秒
第 16 次排队,请耐心等待
排队等待中,排队人数 50,预计还需要 4 秒
第 17 次排队,请耐心等待
排队等待中,排队人数 55,预计还需要 4 秒
第 18 次排队,请耐心等待
排队等待中,排队人数 1,预计还需要 4 秒
第 19 次排队,请耐心等待
排队等待中,排队人数 79,预计还需要 4 秒
第 20 次排队,请耐心等待
# 车票购买成功,订单号 E445593482 #
发送成功,请检查微信
当前任务已结束

使用客户端买票需要排队吗?好像没见过排队的现象啊,那咱们这儿排队是为什么呢?排队人数也不规则变化

运行测试时报错,请大佬帮忙看看

[root@asrv5 py12306]# python main.py -t -n
Traceback (most recent call last):
File "main.py", line 4, in
from py12306.app import *
File "/home/chris/py12306/py12306/app.py", line 8, in
from py12306.helpers.func import *
File "/home/chris/py12306/py12306/helpers/func.py", line 155
def dict_count_key_num(data: dict, key, like=False):
^
SyntaxError: invalid syntax

关于提醒问题,无法通知完成了哪个任务,希望作者改进,谢谢

作者你好,我用的邮件提醒,多任务那种,当我成功后,无法看到是哪个任务完成,有可能会导致付不上款。

所以建议作者 邮件提醒时加上:任务某某完成,提高下辨识度,谢谢作者
还有问题就是:请问各位大佬,有没有其他提醒方式可以满足我的需求,即:提醒模板具有辨识度,可以分辨哪个任务或者账号完成的

万分感谢

配置任务是硬座,结果抢了一张无座

以下是配置,我还得去取消票了

'seats': [ # 筛选座位 有先后顺序 :Array # 可用值: 特等座, 商务座, 一等座, 二等座, 软卧, 硬卧, 动卧, 软座, 硬座, 无座 # '硬卧', '硬座' ], 'train_numbers': [ # 筛选车次 可以为空,为空则所有车次都可以提交 # "K356", # "K1172", # "K4184" ]

是否考虑加入回调指定Url?

比如抢票成功时回调指定的url,http code 是200就中断回调,等等,更开放,更方便大家集成到自已熟悉的通知方式,再次感谢作者的辛苦付出!

开启LOG输出至文件后报错

[2019-01-14 17:25:12,974] ERROR in app: Exception on /log/output [GET]
Traceback (most recent call last):
File "C:\Users\inkux\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\inkux\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\inkux\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\inkux\AppData\Local\Programs\Python\Python36\lib\site-packages\flask_compat.py", line 35, in reraise
raise value
File "C:\Users\inkux\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\inkux\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py", line 1799, in dispatch_request
return self.view_functionsrule.endpoint
File "C:\Users\inkux\AppData\Local\Programs\Python\Python36\lib\site-packages\flask_jwt_extended\view_decorators.py", line 103, in wrapper
return fn(*args, **kwargs)
File "C:\Users\inkux\Desktop\py12306\py12306\py12306\web\handler\log.py", line 39, in log_output
linecache.updatecache(file)
File "C:\Users\inkux\AppData\Local\Programs\Python\Python36\lib\linecache.py", line 137, in updatecache
lines = fp.readlines()
File "C:\Users\inkux\AppData\Local\Programs\Python\Python36\lib\codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x87 in position 3515: invalid start byte

持续上述报错,在配置文件使用
OUT_PUT_LOG_TO_FILE_ENABLED = 0
后解决,但因此无法使用Web查看Log

关于通知的问题

我发现我排队抢票后很多次抢到票了,可没有显示抢票成功的提示,而是继续登录,抢票,然后出现这样的提示:
提交订单失败,错误原因 ['您还有未处理的订单,请您到[未完成订单]进行处理!']
这就造成我本来已经抢到票,却没有消息推送,希望作者能够改进一下!

[建议] 在 README 提示使用时留意规避 12306 可能的反刷票策略

**铁道科技研究院电子所副总工程师兼12306技术部主任单杏花表示,12306启用风险防控系统,对访问请求实施安全风险识别和分级控制,维护公平公正的售票环境。如果有人以频繁极高的速度访问服务器,会被视为非正常操作,高危用户将被拦截甚至被列入黑名单。还未达到拦截或封号级别的抢票软件将被风控系统拖到慢队列中,也就是说,通过第三方软件抢票可能会更慢。

参考资料

验证码下载失败 状态码500

ip被封了么,翻墙也一样

验证码下载失败 错误原因: 返回数据为空 5 秒后重试
正在下载验证码...

还没有成功登录上去过。。。。。

邮箱通知失败

你好,非常感谢你的工作!
我在配置文件里配置邮箱如下:

# 邮箱配置
EMAIL_ENABLED = 1  # 是否开启邮件通知
EMAIL_SENDER = '[email protected]'  # 邮件发送者
EMAIL_RECEIVER = ['[email protected]']  # 邮件接受者 # 可以多个 [[email protected], [email protected]]
EMAIL_SERVER_HOST = 'smtp.qq.com'  # 邮件服务 host
EMAIL_SERVER_USER = '[email protected]'
EMAIL_SERVER_PASSWORD = 'password'

但是在测试的时候始终无法成功发送通知邮件,请问这样配置有问题吗?我也试过用163邮箱

怎么开启分布式查询?

我把env.py里的支持多线程和分布式集群的参数都修改了, 但看web界面并没有分布式的结果?

怎样查看有没有下单成功?

感谢大神分享!
小白弱弱的问一句,怎样查看有没有下单成功啊?而且下单成功后怎样支付呢?
再次感谢大神!

Windows10 DOS窗口

问一个特别小白的问题

Windows10环境 DOS窗口

运行cp env.py.example env.py
提示“cp不是内部或外部命令,也不是可运行的程序或批处理文件”

以我的浅显了解,'cp'应该是在Linux环境下 用于复制的命令

请问:在windows DOS 界面下,该如何执行“cp env.py.example env.py”语句呢:

配置疑问

你好,按照使用手册,需要配置的文件就是env.py,相关的用户信息,即购买者信息、购买车次均是在该问题下填写对吧? 但是我填写的12306账号的密码是明显错误的,运行程序依然显示在刷票,不会报告任何错误,这个如何处理?

感谢分享, 正式运行报错 查到票后抢票时

Traceback (most recent call last):
File "C:\Python3\lib\site-packages\urllib3\connectionpool.py", line 377, in _make_request
httplib_response = conn.getresponse(buffering=True)
TypeError: getresponse() got an unexpected keyword argument 'buffering'

During handling of the above exception, another exception occurred:

运行测试不通过

系统环境:Win10 专业版 64位 17134
Python版本:3.6.8

Traceback (most recent call last):
  File "main.py", line 62, in <module>
    main()
  File "main.py", line 13, in main
    CommonLog.print_welcome()
  File "G:\App\py12306\py12306\log\common_log.py", line 69, in print_welcome
    if Config().WEB_ENABLE:
  File "G:\App\py12306\py12306\helpers\func.py", line 29, in singleton_new
    it.__init_original__(*args, **kw)
  File "G:\App\py12306\py12306\config.py", line 98, in __init__
    self.init_envs()
  File "G:\App\py12306\py12306\config.py", line 137, in init_envs
    self.envs = EnvLoader.load_with_file(self.CONFIG_FILE)
  File "G:\App\py12306\py12306\config.py", line 213, in load_with_file
    exec(content)
  File "<string>", line 1
    # encoding=utf8
    ^
SyntaxError: invalid character in identifier

感谢分享,但是运行的时候会报错

配置好文件之后运行时会显示
Traceback (most recent call last): File "main.py", line 61, in <module> main() File "main.py", line 13, in main CommonLog.print_welcome() File "C:\Users\LabMem No.318\py12306\py12306\log\common_log.py", line 54, in print_welcome if Config().WEB_ENABLE: File "C:\Users\LabMem No.318\py12306\py12306\helpers\func.py", line 29, in singleton_new it.__init_original__(*args, **kw) File "C:\Users\LabMem No.318\py12306\py12306\config.py", line 84, in __init__ self.init_envs() File "C:\Users\LabMem No.318\py12306\py12306\config.py", line 123, in init_envs self.envs = EnvLoader.load_with_file(self.CONFIG_FILE) File "C:\Users\LabMem No.318\py12306\py12306\config.py", line 199, in load_with_file exec(content) File "<string>", line 97 'members': [ ^ SyntaxError: invalid syntax
求教这是什么情况?

只查询在有余票的情况下也要有提醒

看了下目前的逻辑是只有下单成功后才会发送提醒要求支付,可是当没有设置12306账号也就是只查询余票的情况下,检查到有余票的时候如果没提醒的话不看日志人根本不知道的吧。

建议没添加账号的时候查询到有余票时也应该要有提醒。(另外,能同时支持下POST请求通知最好,方便推送微信或者TG)

感谢作者的分享!

测试不通过

[root@izwz951e3fbtauq6d7ez9gz py12306]# python main.py -t -c ./env.py
Traceback (most recent call last):
  File "main.py", line 4, in <module>
    from py12306.app import *
  File "/root/py12306/py12306/app.py", line 29
SyntaxError: Non-ASCII character '\xe7' in file /root/py12306/py12306/app.py on line 30, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

app.py & func.py &

解决:
# -*- coding: utf-8 -*-

[root@izwz951e3fbtauq6d7ez9gz py12306]# python main.py -t -c ./env.py
Traceback (most recent call last):
  File "main.py", line 4, in <module>
    from py12306.app import *
  File "/root/py12306/py12306/app.py", line 6, in <module>
    from py12306.helpers.func import *
  File "/root/py12306/py12306/helpers/func.py", line 145
    def dict_count_key_num(data: dict, key, like=False):
                               ^
SyntaxError: invalid syntax
Traceback (most recent call last):
  File "main.py", line 4, in <module>
    from py12306.app import *
  File "/root/py12306/py12306/app.py", line 6, in <module>
    from py12306.helpers.func import *
  File "/root/py12306/py12306/helpers/func.py", line 186, in <module>
    @singleton
  File "/root/py12306/py12306/helpers/func.py", line 21, in singleton
    cls.__new_original__ = cls.__new__
AttributeError: class Const has no attribute '__new__'

未解决,请指教。

有大佬可以打包成exe文件吗

小白实在是看不懂,安装完依赖,不懂怎么修改配置,可以出一个视频教程吗?
有注释的地方可以理解,其他地方不太懂,直接运行测试,提示错误

建议添加新功能

建议添加新功能 :

  1. 快速订票功能;
  2. 填写CDN查询;
  3. 订票成功后进行第三方微信推送把 乘车日期、乘车车次、乘车人、坐席类别 作为参数一起推送。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.