Giter VIP home page Giter VIP logo

12306python's Introduction

12306Python

hack12306.py 是一个 Python 3.x 版的12306.cn自动订票程序。利用splinter(一个开源的用来通过python自动化测试web的工具),让电脑自动操作网页。

码云地址

说明

    |-- README.md:说明
    |-- config.ini:登录名、密码等的配置文件
    |-- hack12306.py:主程序
    |-- city_code.txt:城市中文名称与三字码对应文件
    |-- resoures:存放的一些资源信息
            |-- images
                    |-- 流程图.jpg

设计

image

功能介绍

    hack12306.py 是一个 Python 3.x 版的12306.cn订票程序。执行程序,等待浏览器页面跳出后输入验证码点击登录,即可完成自动购票。

支持的功能:
    1、支持配置出发地、目的地、乘车日
    2、支持配置车次类型(动车、高铁等)
    3、支持配置出发时间
    4、需要手动输入登录验证码
    5、支持配置预定车次的选择顺序(使用order字段配置,数字0:从上至下选择;数字x(1、2、3、4...):车次从上到下的序号,配置2表示列表中的第二个车次)
    6、支持预定、购票自动完成	
    7、支持配置文件路径指定
    8、支持席别指定
    9、支持是否允许分配无座
   
还不支持的功能:
    1、邮件提醒

Usage

1、加入待购票乘车人信息到登录账号

    乘客姓名需要提前加入到登录的12306账号的联系人中,为了程序自动选择乘客姓名

2、修改配置(参照Config说明)

直接修改 hack12306.py 当前目录下的config.ini 或者 拷贝一份 config.ini 到任意目录,在执行时指定绝对路径

    特别说明:
        1、[cookieInfo]中starts和ends为中文名称

3、运行

方式一:直接运行(配置文件使用hack12306.py相同目录下的config.ini)
	python hack12306.py

方式二:指定config.ini路径(配置文件使用指定的config.ini)
	python hack12306.py -c /Users/xxx/config.ini

	参数说明:
		'-c', '--config', '可选参数, 指定配置文件, 默认使用当前目录 config.ini'

方式三:下载可执行文件执行
    1、下载可执行程序
    2、配置config.ini,放在可执行程序同级目录
    3、双击运行程序

可执行程序下载地址

下载 hack12306 可执行程序

可执行文件说明:
    1、本程序的可执行文件都是通过 pyinstaller 转换的,如果不能时候,请pull最新代码,重新转换
        pyinstaller -onefile <scriptName>
    2、下载后解压,按照上文【3、运行】-> 方式三 步骤执行

4、输入验证码

等待跳出浏览器页面,输入验证码,点击登录

5、完成支付

等待自动完成选票、提交订单,完成后自行支付订单

环境说明

Python版本 3.X

依赖包

pip install splinter
pip install configparser

chromedriver

1、查看chrome版本号:帮助->关于Google Chrome,在打开的设置页面中间可以看到Chrome的当前版本,例如:当前Chrome版本63,下载v2.34版本的chromedriver
2、下载chromedrive驱动:https://chromedriver.storage.googleapis.com/index.html
3、注意浏览器chrome与chromedriver的对应版本(我的chrome是63+,因此选择2.34的chromedriver)
4、参照下方的对应关系表下载

chromedriver与chrome的对应关系表

chromedriver版本  支持的Chrome版本
    v2.34           v61-63
    v2.33           v60-62
    v2.32           v59-61
    v2.31           v58-60
    v2.30           v58-60
    v2.29           v56-58
    v2.28           v55-57
    v2.27           v54-56
    v2.26           v53-55
    v2.25           v53-55
    v2.24           v52-54
    v2.23           v51-53
    v2.22           v49-52
    v2.21           v46-50
    v2.20           v43-48
    v2.19           v43-47
    v2.18           v43-46
    v2.17           v42-43
    v2.13           v42-45
    v2.15           v40-43
    v2.14           v39-42
    v2.13           v38-41
    v2.12           v36-40
    v2.11           v36-40
    v2.10           v33-36
    v2.9            v31-34
    v2.8            v30-33
    v2.7            v30-33
    v2.6            v29-32
    v2.5            v29-32
    v2.4            v29-32

Config说明

最简单的方法是修改 config.ini, 然后填写自己的乘车信息, 这些配置都可以在运行期间进行修改。

; config.ini
; 配置信息:请依照注释修改必选项,非必选项可以删除等号后的值

## 登陆账号和密码
[login]
### username:12306登录用户名,必选参数
[email protected]
### password:12306登录密码,必选参数
password=xxx

## cookie信息,出发站,目的站
[cookieInfo]
### starts:对应搜索框出发地,必选参数,请输入中文名称,例如:武汉
starts=武汉
### ends:对应搜索框目的地,必选参数,请输入中文名称,例如:南京
ends=南京
### dtime:对应搜索框出发日,必选参数,时间格式:年-月-日,例如 2018-01-19
## 时间格式2018-01-19
dtime=2018-01-11

## order:车次,选择第几趟,0则从上至下依次点击,必选参数,如果要特定车次,需要先找到车次在列表中的次序,有效值如下:
#### 0->从上至下点击
#### 1->第一个车次
#### 2->第二个车次
[orderItem]
order=2

## users:乘客姓名,必选参数,中文姓名,支持多个乘客,用英文逗号隔开,例如:张三,李四
### 乘客姓名需要提前加入到登录的12306账号的联系人中,为了程序自动选择乘客姓名
[userInfo]
users = xxx

## 车次类型:
[trainInfo]
### train_types:车次类型,可选参数,默认全部车次,支持多个值,用英文逗号隔开,特别需求的在此指定值,不指定请删除等号后的值,默认是车次不勾选,有效值如下:
#### T->特快
#### G->高铁
#### D->动车
#### Z->直达
#### K->快车
train_types = D,G

### start_time:发车时间,可选参数,不指定请删除等号后的值,默认值“00:00--24:00”
### 时间格式 12:00--18:00,有效值如下:
##### 00:00--24:00->00:00--24:00
##### 00:00--06:00->00:00--06:00
##### 06:00--12:00->06:00--12:00
##### 12:00--18:00->12:00--18:00
##### 18:00--24:00->18:00--24:00
start_time = 12:00--18:00

[confirmInfo]
## 席别
### seat_type:席别,可选参数,不指定请删除等号后的值,默认按照12306预定到的车次的席别,有效值如下:
#### 硬座
#### 硬卧
#### 软卧
#### 一等软座
#### 二等软座
#### 商务座
#### 一等座
#### 二等座
#### 混编硬座
#### 特等座
seat_type = 二等座

## 网址,必选参数
## 此部分不需改动
[urlInfo]
ticket_url = https://kyfw.12306.cn/otn/leftTicket/init
login_url = https://kyfw.12306.cn/otn/login/init
initmy_url = https://kyfw.12306.cn/otn/index/initMy12306
buy = https://kyfw.12306.cn/otn/confirmPassenger/initDc

## 路径信息
[pathInfo]
### driver_name: 浏览器名称,必选参数
driver_name = chrome
### executable_path: 浏览器驱动路径,必选参数
### windows路径例如:C:\Users\sanshunfeng\Downloads\chromedriver.exe
executable_path = C:\Users\sanshunfeng\Downloads\chromedriver.exe



一些说明

    1、本程序是让电脑自动操作浏览器,将一些手动点击的动作自动化完成,机器操作总比手动点击要快一点,能争取一点时间是一点时间
    2、如果在运行中遇到找不到元素等错误,如object has no attribute 'click',这是因为程序点击时页面还没加载出来,请将程序中sleep的时间稍微加大一些
    3、遇到上述错误程序退出,重新运行一遍
    4、由于使用splinter包,通过加载浏览器驱动,获取浏览器渲染之后的响应内容,由于需要加载浏览器,效率上有待商榷,但是模拟程度更高

TODO

1、支持邮件提醒
2、。。。

LICENSE

12306python's People

Contributors

lonycc avatar xiaoshun007 avatar

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

12306python's Issues

请问这个未实现是什么意思

Message: unknown error: Element ... is not clickable at point (370, 7). Other element would receive the click: ...
(Session info: chrome=63.0.3239.132)
(Driver info: chromedriver=2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 6.1.7601 SP1 x86_64)

D:\gitProject\12306Python>[6636:6140:0116/161524.730:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED
[6636:6140:0116/161524.730:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED
[6636:6140:0116/161524.730:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED
[6636:6140:0116/161524.730:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED
[6636:6140:0116/161724.735:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED
[6636:6140:0116/161724.735:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED
[6636:6140:0116/161724.735:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED
[6636:6140:0116/161724.736:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED
[6636:6140:0116/161924.740:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED
[6636:6140:0116/161924.740:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED
[6636:6140:0116/161924.740:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED
[6636:6140:0116/161924.740:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED

seat_type与票类型的value错位了

设置seat_type的类型反而设置成了tickect_type
比如设置seat_type=软卧,则会默认购买伤残票,因为软卧的value为4,伤残票的value也为4

选座问题

K系列的列车没有选座选项,导致程序多点一次没有成功提交订单

Mac executable_path 相关错误

错误信息如下,不知道怎么解决:

===========hack12306 begin===========
映射出发地、目的地...
加载配置文件...
Traceback (most recent call last):
  File "hack12306.py", line 310, in <module>
    hackTickets.start()
  File "hack12306.py", line 294, in start
    self.driver=Browser(driver_name=self.driver_name,executable_path=self.executable_path)
  File "/usr/local/lib/python2.7/site-packages/splinter/browser.py", line 43, in Browser
    return driver(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'executable_path'

关于学生票,邮件提醒等

如果程序里面能设置优先购买学生票,就好了。
另外,有时候刷票人可能离开了,刷成功了也不知道,能加邮件提醒就好了

调用浏览器出错

打开火狐后,只停留在主页面,报错Message: Service D:\Program Files (x86)\Firefox\firefox.exe unexpectedly exited. Status code was: 1,请问这个该怎么办

时间貌似有点问题

我在这里设置了, self.dtime = '2018-01-12' 但是 在网页上 时间,还是今天,2月6日。来和去地址cookie 都写上了 ,就是这个时间貌似不行

Message: unknown error

`===========hack12306 begin===========
映射出发地、目的地...
加载配置文件...

DevTools listening on ws://127.0.0.1:12975/devtools/browser/187de14c-4671-4195-9bd6-c8a8a3ed4390
[0614/181923.501:ERROR:gl_surface_egl.cc(843)] eglInitialize D3D11 failed with error EGL_NOT_INITIALIZED, trying next display type
开始登录...
[0614/181946.204:ERROR:adm_helpers.cc(73)] Failed to query stereo recording.
等待验证码,自行输入...
购票页面开始...
--------->选择的车次类型 Z-直达
--------->选择的车次类型 K-快速
--------->选择的车次类型 GC-高铁/城际
--------->选择的发车时间 18:00--24:00
循环点击查询... 第 1 次
--------->选择的车次类型 Z-直达
Message: unknown error: Element ... is not clickable at point (542, 204).
Other element would receive the click:


(Session info: chrome=66.0.3359.181)
(Driver info: chromedriver=2.36.540470 (e522d04694c7ebea4ba8821272dbef4f9b818c91),platform=Windows NT 6.1.7601 SP1 x86_64)`

无法提交订单

测试了一下,'ElementList' object has no attribute 'click',无法提交订单

选座位靠窗 过道 问题

代码里面好像没看见 最后座位的选项 导致不能自动化提交订单 这个能否修改一下 谢谢~

车次怎么制定 说的有点模糊

order:车次,选择第几趟,0则从上至下依次点击,必选参数,如果要特定车次,需要先找到车次在列表中的次序,有效值如下:

0->从上至下点击

1->第一个车次

2->第二个车次

[orderItem]
order=0

你好,我想加入这个项目,可以吗

十分冒昧地打扰你,我很多朋友都让我帮他们抢票,目前正在做一个傻瓜版抢票教程,用Anaconda装环境和依赖,今天发现了你的项目,试了一下,有成功的有失败的,总之想加入这个项目,不知大神是否愿意?

车型锁定问题

请教下我这边Chrome浏览器只有首次会锁定所选车型,第二次就直接跳过不选车型了,直接就是豪华。。。

停在了等待验证码

===========hack12306 begin===========
映射出发地、目的地...
加载配置文件...
开始登录...
等待验证码,自行输入...

到这就停了,进行不下去,一直这样,请问是配置错了吗

我还没成功过,一直碰到这两个bug

一个楼主说的,object has no attribute 'click' 这个问题要增加休息时间,楼主是这个地方吗,我都增加了15s,有的时候还是会崩溃
def confirmSeat(self): # 若提交订单异常,请适当加大sleep的时间 sleep(15) #1

第二个问题:
开始登录...
[0111/103516.261:ERROR:adm_helpers.cc(62)] Failed to query stereo recording.
等待验证码,自行输入...

第三个问:
C:\Users\Administrator\Desktop\火车票\2\12306Python>python hack12306.py
===========hack12306 begin===========
映射出发地、目的地...
加载配置文件...

DevTools listening on ws://127.0.0.1:12714/devtools/browser/de712512-6242-4387-9
bf9-4c4528c9fc09
开始登录...
[0111/103922.049:ERROR:adm_helpers.cc(62)] Failed to query stereo recording.
等待验证码,自行输入...
购票页面开始...
--------->选择的车次类型 GC-高铁/城际
Message: stale element reference: element is not attached to the page document
(Session info: chrome=63.0.3213.3)
(Driver info: chromedriver=2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87a
f1),platform=Windows NT 6.1.7601 SP1 x86_64)

C:\Users\Administrator\Desktop\火车票\2\12306Python>

测试了一下,先提一几小问题

非常感谢你的创作,试用了一下,发现有几个小问题:

  1. 车次没有全选,没有K字头的火车,春运有个K字头也比较幸福啦
    2,查询过程中,12306只要出现对话框,程序就中止了。

希望慢慢完善吧

关于车站名不在列表中的问题

例如买从福田到湘潭北,这两个车站都不在列表中,这时候就需要在12306官网中填上出发地,目的地之后,点击查询,打开F12调试窗口,Network--all--haders--Query String Parameters。显示leftTicketDTO.from_station:NZQ.那么这个NZQ就是出发地福田的代号,leftTicketDTO.to_station:EDQ,同理EDQ就是湘潭北的代号。

登录刷新预定页面,第一次进入提示超时,导致预定element not visible

开始登录...
等待验证码,自行输入...
购票页面开始...
--------->选择的车次类型 GC-高铁/城际
--------->选择的发车时间
未指定发车时间,默认00:00-24:00
循环点击查询... 第 1 次
no elements could be found with text "预订"
还没开始预订
--------->选择的车次类型 GC-高铁/城际
Message: element not visible

Message: element not visible 错误

你好,在win7 64位环境下,使用Python 3.6.1,运行一会后报如下错误
Message: element not visible
(Session info: chrome=63.0.3239.132)
(Driver info: chromedriver=2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87a
f1),platform=Windows NT 6.1.7601 SP1 x86_64)

(python36env) D:\mrsync\12306Python>[15016:12920:0110/160322.887:ERROR:process_m
etrics.cc(105)] NOT IMPLEMENTED
[15016:12920:0110/160322.887:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED
[15016:12920:0110/160322.887:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED
[15016:12920:0110/160322.888:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED

关于无座的问题

1///if self.driver.find_by_text(u"硬座余票0张") == None
这句是不是有问题啊,我明明余票很多,还是自动执行else。(这里应该可以根据config设置的座位来判别,如果是二等座,这个判断就没有意义了)

2///if self.noseat_allow == 0:
self.driver.find_by_id('back_edit_id').click()
这里逻辑希望可以调整,无座,接下来不该是继续刷新查询么、、、

没执行成功,好像驱动的问题?

非Python开发人员,报错搞不懂,勉强装好环境。。求大神帮忙!

Mac系统,执行信息如下:

===========hack12306 begin===========
映射出发地、目的地...
加载配置文件...
hack12306.py:41: DeprecationWarning: This method will be removed in future versions. Use 'parser.read_file()' instead.
cp.readfp(codecs.open(config_file, "r", "utf-8-sig"))
Traceback (most recent call last):
File "hack12306.py", line 319, in
hackTickets.start()
File "hack12306.py", line 303, in start
self.driver=Browser(driver_name=self.driver_name,executable_path=self.executable_path)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/splinter/browser.py", line 63, in Browser
return driver(*args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/splinter/driver/webdriver/chrome.py", line 35, in init
self.driver = Chrome(chrome_options=options, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/chrome/webdriver.py", line 75, in init
desired_capabilities=desired_capabilities)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 154, in init
self.start_session(desired_capabilities, browser_profile)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 243, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 312, in execute
self.error_handler.check_response(response)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 237, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary
(Driver info: chromedriver=2.35.528157 (4429ca2590d6988c0745c24c8858745aaaec01ef),platform=Mac OS X 10.12.6 x86_64)

ModuleNotFoundError: No module named 'splinter'

感谢分享,下面这个问题是因为少了什么?
google了一下,没有类似的信息

Traceback (most recent call last):
File "hack12306.py", line 19, in
from splinter.browser import Browser
ModuleNotFoundError: No module named 'splinter'

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.