一款带 Web 管理界面的 12306 抢票软件

前言

本文主要介绍 Py12306 抢票软件的手动安装和 Docker 安装过程,适用于 Centos/Debian/Ubuntu,目前主流开源的 12306 抢票软件有:testerSunshine/12306pjialin/py12306

Py12306 抢票功能介绍

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

py12306-web.png

Python3.6 安装

Py12306 需要运行在 Python 3.6 以上版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 安装依赖(Ubuntu),由于Ubuntu16+自带Python3,只需要安装pip3即可,无需再执行下面通过源码编译安装Python3的操作
# apt install -y python3-pip

# 安装依赖(Debian)
# apt-get update -y
# apt-get install -y build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev

# 安装依赖(Centos)
# yum groupinstall -y "Development tools"
# yum install -y sqlite-devel ncurses-devel ncurses-libs zlib-devel mysql-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl-devel bzip2-devel expat-devel

# 下载Python3.6.5源码
# wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz

# 解压源码
# tar -xvf Python-3.6.5.tgz

# 进入解压后的目录
# cd Python-3.6.5

# 预配置,并指定安装路径
# ./configure --prefix=/usr/local/python3.6.5

# 编译安装
# make
# make install

# 创建软链接
# ln -s /usr/local/python3.6.5/bin/pip3.6 /usr/bin/pip3.6
# ln -s /usr/local/python3.6.5/bin/python3.6 /usr/bin/python3.6

# 删除文件和目录
# rm -rf Python-3.6.5
# rm -f Python-3.6.5.tgz

手动安装 Py12306

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 克隆源码
# git clone https://github.com/pjialin/py12306

# 进入源码目录
# cd py12306

# 安装依赖
# pip3.6 install -r requirements.txt

# 拷贝配置文件
# cp env.py.example env.py

# 更改配置文件内容(原配置文件里有详细的配置介绍,根据注释提示进行配置即可)
# vim env.py

# 启动前测试(包括用户账号检测,乘客信息检测,车站检测)
# python3.6 main.py -t

# 默认不会进行通知测试,如果要对通知进行测试需要加上 -n 参数,其他参数包括 -c 指定自定义配置文件位置
# python3.6 main.py -t -n

# 前台运行程序
# python3.6 main.py

# 后台运行程序(建议修改配置文件,开启日志文件的记录,日志文件默认路径是:runtime/12306.log)
# nohup python3.6 main.py &

# 后台运行程序的情况下,查看日志文件(前提是已开启日志文件的记录)
# tail -f runtime/12306.log

# 应用成功运行后,本地浏览器访问http://localhost:8008,即可打开Web管理界面,如需外网访问Web管理界面,需要打开防火墙端口8008
# firewall-cmd --zone=public --add-port=8008/tcp --permanent
# firewall-cmd --reload

Docker 安装 Py12306

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 新建文件夹存放配置文件
# mkdir py12306

# 进入新建的文件夹
# cd py12306

# 创建数据目录
# mkdir data

# 下载配置文件
# docker run --rm pjialin/py12306 cat /config/env.py > env.py

# 或者
# curl https://github.com/pjialin/py12306/blob/master/env.docker.py.example -o env.py

# 更改配置文件内容(原配置文件里有详细的配置介绍,根据注释提示进行配置即可)
# vim env.py

# 启动容器(该命令必须在py12306文件夹内执行)
# docker run -d --name py12306 -p 8008:8008 -v $(pwd):/config -v data:/data pjialin/py12306

# 容器成功启动后,当前目录下会多了一个12306.log日志文件
# tail -f 12306.log

# 本地浏览器访问http://localhost:8008,即可打开Web管理界面,如需外网访问Web管理界面,需要打开防火墙端口8008
# firewall-cmd --zone=public --add-port=8008/tcp --permanent
# firewall-cmd --reload

Docker-Compose 中使用 Py12306

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 新建文件夹存放配置文件
# mkdir /usr/local/py12306

# 进入新建的文件夹
# cd /usr/local/py12306

# 下载py12306配置文件
# docker run --rm pjialin/py12306 cat /config/env.py > env.py

# 或者
# curl https://github.com/pjialin/py12306/blob/master/env.docker.py.example -o env.py

# 更改py12306配置文件的内容(原配置文件里有详细的配置介绍,根据注释提示进行配置即可)
# vim env.py

# 创建docker-compose配置文件
# touch docker-compose.yml

# 新增以下内容到docker-compose配置文件中
# vim docker-compose.yml
version: "3.5"
services:
redis:
image: pjialin/py12306
container_name: py12306
restart: always
privileged: false
ports:
- 8008:8008
volumes:
- '/usr/local/py12306:/config'
- '/usr/local/py12306/env.py:/config/env.py'
- '/usr/local/py12306/runtime:/code/runtime'

# 启动容器(必须在docker-compose.yml配置文件所在的目录下执行)
# docker-compose up -d

# 容器成功启动后的目录结构如下
# tree /usr/local/py12306
├── docker-compose.yml
├── 12306.log
├── env.py
├── query
│   └── status.json
├── runtime
└── user
└── xxxxxxx.cookie

# 防火墙端口的开放和Web管理界面的访问,可参考上面的介绍

关于 IP 被屏蔽

目前查询和登录操作是分开的,查询是不依赖用户是否登录。12306 现在封服务器(阿里云和腾讯云)IP 比较严重,尽量不要在服务器环境下运行。关于分布式集群和代理池的支持,有兴趣的可以访问 Github 进一步学习。