Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
janlyn06
12306
提交
2f2d62af
1
12306
项目概览
janlyn06
/
12306
通知
4
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
1
12306
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
2f2d62af
编写于
9月 21, 2018
作者:
W
wenxianping
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加余票不足优先提交功能
上级
cce998d0
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
70 addition
and
52 deletion
+70
-52
Update.md
Update.md
+7
-0
config/ticket_config.yaml
config/ticket_config.yaml
+11
-10
init/select_ticket_info.py
init/select_ticket_info.py
+11
-14
inter/GetPassengerDTOs.py
inter/GetPassengerDTOs.py
+14
-4
inter/GetQueueCount.py
inter/GetQueueCount.py
+5
-8
inter/GetQueueCountAsync.py
inter/GetQueueCountAsync.py
+8
-11
inter/Query.py
inter/Query.py
+14
-4
inter/SubmitOrderRequest.py
inter/SubmitOrderRequest.py
+0
-1
未找到文件。
Update.md
浏览文件 @
2f2d62af
...
...
@@ -116,3 +116,10 @@
-
修改已知bug
-
优化代码结构
-
新增第三方库wrapcache,需要重新安装requirements.txt
-
2018.9.21更新,修复已知问题,增加余票不足优先提交功能
-
修改已知bug
-
优化查询攻略
-
优化随机查询1-3秒,经测试很稳定,不会封ip
-
增加余票不足优先提交功能(当余票小于乘车人,如果选择优先提交,则删减联系人和余票数一致在提交)
-
开关为ticket_config.yaml配置文件中is_more_ticket参数
config/ticket_config.yaml
浏览文件 @
2f2d62af
...
...
@@ -5,28 +5,29 @@ set:
# - 2018-01-06
# - 2018-01-07
station_dates
:
-
"
2018-09-
05
"
-
"
2018-09-
28
"
# 过滤车次(list),格式ex:
# - "G1353"
# - "G1329"
station_trains
:
-
"
D2304"
-
"
"
# 出发城市,比如深圳北,就填深圳就搜得到
from_station
:
"
深圳
"
from_station
:
"
"
# 到达城市 比如深圳北,就填深圳就搜得到
to_station
:
"
上饶
"
to_station
:
"
"
# 座位(list) 多个座位ex:
# - "二等座"
# - "一等座"
set_type
:
-
"
二等座
"
-
"
"
#
余票不足是否自动提交,目前应该没什么卵用
is_more_ticket
:
Tru
e
#
当余票小于乘车人,如果选择优先提交,则删减联系人和余票数一致在提交
is_more_ticket
:
Fals
e
# 乘车人(list) 多个乘车人ex:
# - "张三"
...
...
@@ -67,11 +68,11 @@ auto_code_account:
# host: "smtp.qq.com"
email_conf
:
is_email
:
True
email
:
"
@qq.com
"
notice_email_list
:
"
@qq.com
"
email
:
"
"
notice_email_list
:
"
"
username
:
"
"
password
:
"
"
host
:
"
smtp.qq.com
"
host
:
"
"
# 是否开启cdn查询,可以更快的检测票票 1为开启,2为关闭
is_cdn
:
2
...
...
init/select_ticket_info.py
浏览文件 @
2f2d62af
...
...
@@ -65,10 +65,9 @@ class select:
ticket_black_list_time
=
ticket_info_config
[
"ticket_black_list_time"
]
order_type
=
ticket_info_config
[
"order_type"
]
print
u
"*"
*
20
print
u
"12306刷票小助手,最后更新于2018.8.31,请勿作为商业用途,交流群号:286271084"
print
u
"如果有好的margin,请联系作者,表示非常感激
\n
"
print
u
"当前配置:出发站:{0}
\n
到达站:{1}
\n
乘车日期:{2}
\n
坐席:{3}
\n
是否有票自动提交:{4}
\n
乘车人:{5}
\n
"
\
u
"刷新间隔:随机(1-4S)
\n
候选购买车次:{6}
\n
僵尸票关小黑屋时长:{7}
\n
下单接口:{8}
\n
"
.
format
\
print
u
"12306刷票小助手,最后更新于2018.9.21,请勿作为商业用途,交流群号:286271084"
print
u
"当前配置:
\n
出发站:{0}
\n
到达站:{1}
\n
乘车日期:{2}
\n
坐席:{3}
\n
是否有票优先提交:{4}
\n
乘车人:{5}
\n
"
\
u
"刷新间隔:随机(1-3S)
\n
候选购买车次:{6}
\n
僵尸票关小黑屋时长:{7}
\n
下单接口:{8}
\n
"
.
format
\
(
from_station
,
to_station
,
...
...
@@ -197,17 +196,17 @@ class select:
leftTicket
=
queryResult
.
get
(
"leftTicket"
,
""
)
query_from_station_name
=
queryResult
.
get
(
"query_from_station_name"
,
""
)
query_to_station_name
=
queryResult
.
get
(
"query_to_station_name"
,
""
)
is_more_ticket_num
=
queryResult
.
get
(
"is_more_ticket_num"
,
len
(
self
.
ticke_peoples
))
if
wrapcache
.
get
(
train_no
):
print
(
ticket
.
QUEUE_WARNING_MSG
.
format
(
train_no
))
else
:
# 获取联系人
if
not
self
.
passengerTicketStrList
and
not
self
.
oldPassengerStr
:
s
=
getPassengerDTOs
(
session
=
self
,
ticket_peoples
=
self
.
ticke_peoples
,
set_type
=
seat
)
getPassengerDTOsResult
=
s
.
getPassengerTicketStrListAndOldPassengerStr
()
if
getPassengerDTOsResult
.
get
(
"status"
,
False
):
self
.
passengerTicketStrList
=
getPassengerDTOsResult
.
get
(
"passengerTicketStrList"
,
""
)
self
.
oldPassengerStr
=
getPassengerDTOsResult
.
get
(
"oldPassengerStr"
,
""
)
self
.
set_type
=
getPassengerDTOsResult
.
get
(
"set_type"
,
""
)
s
=
getPassengerDTOs
(
session
=
self
,
ticket_peoples
=
self
.
ticke_peoples
,
set_type
=
seat
,
is_more_ticket_num
=
is_more_ticket_num
)
getPassengerDTOsResult
=
s
.
getPassengerTicketStrListAndOldPassengerStr
()
if
getPassengerDTOsResult
.
get
(
"status"
,
False
):
self
.
passengerTicketStrList
=
getPassengerDTOsResult
.
get
(
"passengerTicketStrList"
,
""
)
self
.
oldPassengerStr
=
getPassengerDTOsResult
.
get
(
"oldPassengerStr"
,
""
)
self
.
set_type
=
getPassengerDTOsResult
.
get
(
"set_type"
,
""
)
# 提交订单
if
self
.
order_type
==
1
:
# 快读下单
a
=
autoSubmitOrderRequest
(
session
=
self
,
...
...
@@ -228,10 +227,8 @@ class select:
self
.
passengerTicketStrList
,
self
.
oldPassengerStr
,
train_date
,
self
.
ticke_peoples
)
sor
.
sendSubmitOrderRequest
()
else
:
random_time
=
round
(
random
.
uniform
(
1
,
4
),
2
)
random_time
=
round
(
random
.
uniform
(
1
,
3
),
2
)
time
.
sleep
(
random_time
)
print
u
"正在第{0}次查询 随机停留时长:{6} 乘车日期: {1} 车次:{2} 查询无票 cdn轮询IP:{4}当前cdn总数:{5} 总耗时:{3}ms"
.
format
(
num
,
","
.
join
(
...
...
inter/GetPassengerDTOs.py
浏览文件 @
2f2d62af
# coding=utf-8
from
config.TicketEnmu
import
ticket
from
myException.PassengerUserException
import
PassengerUserException
import
wrapcache
class
getPassengerDTOs
:
...
...
@@ -8,7 +9,7 @@ class getPassengerDTOs:
获取乘客信息
:return:
"""
def
__init__
(
self
,
session
,
ticket_peoples
,
set_type
):
def
__init__
(
self
,
session
,
ticket_peoples
,
set_type
,
is_more_ticket_num
):
"""
:param session: 登录实例
:param ticket_peoples: 乘客
...
...
@@ -16,6 +17,7 @@ class getPassengerDTOs:
"""
self
.
session
=
session
self
.
ticket_peoples
=
ticket_peoples
self
.
is_more_ticket_num
=
is_more_ticket_num
self
.
set_type
=
set_type
.
encode
(
"utf8"
)
def
sendGetPassengerDTOs
(
self
):
...
...
@@ -57,15 +59,23 @@ class getPassengerDTOs:
获取提交车次人内容格式
passengerTicketStr O,0,1,文贤平,1,43052419950223XXXX,15618715583,N_O,0,1,梁敏,1,43052719920118XXXX,,N
oldPassengerStr 文贤平,1,43052719920118XXXX,1_梁敏,1,43052719920118XXXX,1
ps: 如果is_more_ticket打开了的话,那就是读取联系人列表里面前符合车次数量的前几个联系人
:return:
"""
passengerTicketStrList
=
[]
oldPassengerStr
=
[]
user_info
=
self
.
sendGetPassengerDTOs
()
if
wrapcache
.
get
(
"user_info"
):
# 如果缓存中有联系人方式,则读取缓存中的联系人
user_info
=
wrapcache
.
get
(
"user_info"
)
print
(
u
"缓存中找到联系人信息: {0}"
.
format
(
user_info
))
else
:
user_info
=
self
.
sendGetPassengerDTOs
()
wrapcache
.
set
(
"user_info"
,
user_info
,
timeout
=
9999999
)
set_type
=
self
.
getPassengerTicketStr
(
self
.
set_type
)
if
not
user_info
:
raise
PassengerUserException
(
ticket
.
DTO_NOT_IN_LIST
)
if
len
(
user_info
)
is
1
:
if
len
(
user_info
)
<
self
.
is_more_ticket_num
:
# 如果乘车人填错了导致没有这个乘车人的话,可能乘车人数会小于自动乘车人
self
.
is_more_ticket_num
=
len
(
user_info
)
if
self
.
is_more_ticket_num
is
1
:
passengerTicketStrList
.
append
(
'0,'
+
user_info
[
0
][
'passenger_type'
]
+
","
+
user_info
[
0
][
"passenger_name"
]
+
","
+
...
...
@@ -75,7 +85,7 @@ class getPassengerDTOs:
user_info
[
0
][
'passenger_name'
]
+
","
+
user_info
[
0
][
'passenger_id_type_code'
]
+
","
+
user_info
[
0
][
'passenger_id_no'
]
+
","
+
user_info
[
0
][
'passenger_type'
]
+
'_'
)
else
:
for
i
in
xrange
(
len
(
user_info
)
):
for
i
in
xrange
(
self
.
is_more_ticket_num
):
passengerTicketStrList
.
append
(
'0,'
+
user_info
[
i
][
'passenger_type'
]
+
","
+
user_info
[
i
][
"passenger_name"
]
+
","
+
user_info
[
i
][
'passenger_id_type_code'
]
+
","
+
user_info
[
i
][
...
...
inter/GetQueueCount.py
浏览文件 @
2f2d62af
...
...
@@ -80,14 +80,11 @@ class getQueueCount:
ticket_split
=
sum
(
map
(
conversion_int
,
ticket
.
split
(
","
)))
if
ticket
.
find
(
","
)
!=
-
1
else
ticket
countT
=
getQueueCountResult
[
"data"
][
"countT"
]
if
int
(
countT
)
is
0
:
if
int
(
ticket_split
)
<
len
(
self
.
ticket_peoples
):
print
(
u
"当前余票数小于乘车人数,放弃订票"
)
else
:
print
(
u
"排队成功, 当前余票还剩余: {0} 张"
.
format
(
ticket_split
))
csf
=
confirmSingleForQueue
(
self
.
session
,
self
.
ifShowPassCodeTime
,
self
.
is_need_code
,
self
.
token
,
self
.
set_type
,
self
.
ticket_peoples
,
self
.
ticketInfoForPassengerForm
,
self
.
oldPassengerStr
,
self
.
passengerTicketStrList
)
csf
.
sendConfirmSingleForQueue
()
print
(
u
"排队成功, 当前余票还剩余: {0} 张"
.
format
(
ticket_split
))
csf
=
confirmSingleForQueue
(
self
.
session
,
self
.
ifShowPassCodeTime
,
self
.
is_need_code
,
self
.
token
,
self
.
set_type
,
self
.
ticket_peoples
,
self
.
ticketInfoForPassengerForm
,
self
.
oldPassengerStr
,
self
.
passengerTicketStrList
)
csf
.
sendConfirmSingleForQueue
()
else
:
print
(
u
"当前排队人数: {1} 当前余票还剩余:{0} 张,继续排队中"
.
format
(
ticket_split
,
countT
))
else
:
...
...
inter/GetQueueCountAsync.py
浏览文件 @
2f2d62af
...
...
@@ -94,17 +94,14 @@ class getQueueCountAsync:
","
)
!=
-
1
else
ticket_data
countT
=
getQueueCountAsyncResult
[
"data"
][
"countT"
]
if
int
(
countT
)
is
0
:
if
int
(
ticket_split
)
<
self
.
users
:
print
(
u
"当前余票数小于乘车人数,放弃订票"
)
else
:
print
(
u
"排队成功, 当前余票还剩余: {0} 张"
.
format
(
ticket_split
))
c
=
confirmSingleForQueueAsys
(
session
=
self
.
session
,
passengerTicketStr
=
self
.
passengerTicketStr
,
oldPassengerStr
=
self
.
oldPassengerStr
,
result
=
self
.
result
,)
print
(
u
"验证码提交安全期,等待{}MS"
.
format
(
self
.
ifShowPassCodeTime
))
time
.
sleep
(
self
.
ifShowPassCodeTime
)
c
.
sendConfirmSingleForQueueAsys
()
print
(
u
"排队成功, 当前余票还剩余: {0} 张"
.
format
(
ticket_split
))
c
=
confirmSingleForQueueAsys
(
session
=
self
.
session
,
passengerTicketStr
=
self
.
passengerTicketStr
,
oldPassengerStr
=
self
.
oldPassengerStr
,
result
=
self
.
result
,)
print
(
u
"验证码提交安全期,等待{}MS"
.
format
(
self
.
ifShowPassCodeTime
))
time
.
sleep
(
self
.
ifShowPassCodeTime
)
c
.
sendConfirmSingleForQueueAsys
()
else
:
print
(
u
"排队发现未知错误{0},将此列车 {1}加入小黑屋"
.
format
(
getQueueCountAsyncResult
,
self
.
train_no
))
wrapcache
.
set
(
key
=
self
.
train_no
,
value
=
datetime
.
datetime
.
now
(),
...
...
inter/Query.py
浏览文件 @
2f2d62af
...
...
@@ -68,7 +68,10 @@ class query:
stationTrainCode
=
ticket_info
[
3
]
leftTicket
=
ticket_info
[
12
]
seat
=
self
.
_station_seat
[
j
].
encode
(
"utf8"
)
ticket_num
=
ticket_info
[
self
.
station_seat
(
self
.
_station_seat
[
j
].
encode
(
"utf8"
))]
try
:
ticket_num
=
int
(
ticket_info
[
self
.
station_seat
(
self
.
_station_seat
[
j
].
encode
(
"utf8"
))])
except
ValueError
:
ticket_num
=
"有"
print
(
u
'车次: {0} 始发车站: {1} 终点站: {2} {3}: {4}'
.
format
(
ticket_info
[
3
],
self
.
from_station_h
,
self
.
to_station_h
,
...
...
@@ -77,10 +80,16 @@ class query:
if
wrapcache
.
get
(
train_no
):
print
(
ticket
.
QUERY_IN_BLACK_LIST
.
format
(
train_no
))
continue
if
ticket_num
!=
"有"
and
self
.
ticke_peoples_num
<
ticket_num
:
# 小于乘车人数则无视此次乘车机会, 以后可以扩展为有票优先提交
continue
else
:
if
ticket_num
!=
"有"
and
self
.
ticke_peoples_num
>
ticket_num
:
if
self
.
session
.
is_more_ticket
:
print
(
u
"余票数小于乘车人数,当前余票数: {}, 删减人车人数到: {}"
.
format
(
ticket_num
,
ticket_num
))
is_more_ticket_num
=
ticket_num
else
:
continue
else
:
is_more_ticket_num
=
self
.
ticke_peoples_num
print
(
ticket
.
QUERY_C
)
return
{
"secretStr"
:
secretStr
,
...
...
@@ -93,6 +102,7 @@ class query:
"leftTicket"
:
leftTicket
,
"train_location"
:
train_location
,
"code"
:
ticket
.
SUCCESS_CODE
,
"is_more_ticket_num"
:
is_more_ticket_num
,
"status"
:
True
,
}
else
:
...
...
inter/SubmitOrderRequest.py
浏览文件 @
2f2d62af
...
...
@@ -50,7 +50,6 @@ class submitOrderRequest:
预定的请求参数,注意参数顺序
注意这里为了防止secretStr被urllib.parse过度编码,在这里进行一次解码
否则调用HttpTester类的post方法将会将secretStr编码成为无效码,造成提交预定请求失败
:param self:
:param secretStr: 提交车次加密
:return:
"""
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录