Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
janlyn06
12306
提交
cf2e8f8e
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 搜索 >>
提交
cf2e8f8e
编写于
12月 26, 2018
作者:
W
wenxianping
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
- 优化已知bug
- 开启cdn查询 - 自动识别查询接口
上级
75f88a4c
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
28623 addition
and
959 deletion
+28623
-959
README.md
README.md
+3
-0
Update.md
Update.md
+5
-0
agency/cdn_utils.py
agency/cdn_utils.py
+10
-6
cdn_list
cdn_list
+28536
-914
config/urlConf.py
config/urlConf.py
+13
-1
init/select_ticket_info.py
init/select_ticket_info.py
+27
-31
inter/Query.py
inter/Query.py
+26
-3
myUrllib/httpUtils.py
myUrllib/httpUtils.py
+3
-4
tkcode
tkcode
+0
-0
未找到文件。
README.md
浏览文件 @
cf2e8f8e
...
...
@@ -58,6 +58,9 @@
-
测试邮箱是否可用
-
测试下单接口是否可用,有两个下单接口,随便用哪个都ok
-
如果下载验证码过期或者下载失败的问题,应该是12306封ip的策略,多重试几次,12306现在封服务器(阿里云和腾讯云)ip比较严重,尽量不要放在服务器里面
-
感谢一下小伙伴对本项目提供的帮助
-
@读,◢
-
@才
-
[
更新日志
](
Update.md
)
Update.md
浏览文件 @
cf2e8f8e
...
...
@@ -123,3 +123,8 @@
-
优化随机查询1-3秒,经测试很稳定,不会封ip
-
增加余票不足优先提交功能(当余票小于乘车人,如果选择优先提交,则删减联系人和余票数一致在提交)
-
开关为ticket_config.yaml配置文件中is_more_ticket参数
-
2018.12.26更新
-
优化已知bug
-
开启cdn查询
-
自动识别查询接口
agency/cdn_utils.py
浏览文件 @
cf2e8f8e
...
...
@@ -50,8 +50,15 @@ class CDNProxy:
pass
def
open_cdn_file
(
self
):
f
=
open
(
"./cdn_list"
,
"a+"
)
return
f
cdn
=
[]
cdn_re
=
re
.
compile
(
"CONNECT (\S+) HTTP/1.1"
)
with
open
(
"./cdn_list"
,
"r"
)
as
f
:
for
i
in
f
.
readlines
():
# print(i.replace("\n", ""))
cdn_list
=
re
.
findall
(
cdn_re
,
i
)
if
cdn_list
and
"kyfw.12306.cn:443"
not
in
cdn_list
:
cdn
.
append
(
cdn_list
[
0
].
split
(
":"
)[
0
])
return
cdn
def
get_cdn_list
(
self
):
"""
...
...
@@ -101,9 +108,6 @@ class CDNProxy:
print
(
cdn_ip
[
0
])
if
__name__
==
'__main__'
:
cdn
=
CDNProxy
()
cdn
.
get_cdn_list
()
cdn
.
open_cdn_file
()
cdn_list
100755 → 100644
浏览文件 @
cf2e8f8e
因为 它太大了无法显示 source diff 。你可以改为
查看blob
。
config/urlConf.py
浏览文件 @
cf2e8f8e
...
...
@@ -77,6 +77,18 @@ urls = {
"is_logger"
:
False
,
"is_json"
:
False
,
},
"loginInitCdn"
:
{
# 登录页面
"req_url"
:
"/otn/login/init"
,
"req_type"
:
"get"
,
"Referer"
:
"https://kyfw.12306.cn/otn/index/init"
,
"Host"
:
"kyfw.12306.cn"
,
"re_try"
:
1
,
"re_time"
:
0.1
,
"s_time"
:
0.1
,
"is_logger"
:
False
,
"is_test_cdn"
:
True
,
"is_json"
:
False
,
},
"getUserInfo"
:
{
# 获取用户信息
"req_url"
:
"/otn/index/initMy12306"
,
"req_type"
:
"get"
,
...
...
@@ -156,7 +168,7 @@ urls = {
"is_json"
:
True
,
},
"select_url"
:
{
# 查询余票
"req_url"
:
"/otn/
leftTicket/queryX
?leftTicketDTO.train_date={0}&leftTicketDTO.from_station={1}&leftTicketDTO.to_station={2}&purpose_codes=ADULT"
,
"req_url"
:
"/otn/
{3}
?leftTicketDTO.train_date={0}&leftTicketDTO.from_station={1}&leftTicketDTO.to_station={2}&purpose_codes=ADULT"
,
"req_type"
:
"get"
,
"Referer"
:
"https://kyfw.12306.cn/otn/leftTicket/init"
,
"Host"
:
"kyfw.12306.cn"
,
...
...
init/select_ticket_info.py
浏览文件 @
cf2e8f8e
...
...
@@ -3,6 +3,7 @@ import datetime
import
random
import
socket
import
sys
import
threading
import
time
import
wrapcache
...
...
@@ -26,7 +27,7 @@ from myException.ticketConfigException import ticketConfigException
from
myException.ticketIsExitsException
import
ticketIsExitsException
from
myException.ticketNumOutException
import
ticketNumOutException
from
myUrllib.httpUtils
import
HTTPClient
from
utils.timeUtil
import
time_to_minutes
,
minutes_to_time
from
utils.timeUtil
import
time_to_minutes
,
minutes_to_time
reload
(
sys
)
sys
.
setdefaultencoding
(
'utf-8'
)
...
...
@@ -42,7 +43,6 @@ class select:
self
.
ticke_peoples
,
self
.
station_trains
,
self
.
ticket_black_list_time
,
\
self
.
order_type
,
self
.
is_by_time
,
self
.
train_types
,
self
.
departure_time
,
\
self
.
arrival_time
,
self
.
take_time
=
self
.
get_ticket_info
()
self
.
is_auto_code
=
_get_yaml
()[
"is_auto_code"
]
self
.
auto_code_type
=
_get_yaml
()[
"auto_code_type"
]
self
.
is_cdn
=
_get_yaml
()[
"is_cdn"
]
...
...
@@ -50,6 +50,7 @@ class select:
self
.
urls
=
urlConf
.
urls
self
.
login
=
GoLogin
(
self
,
self
.
is_auto_code
,
self
.
auto_code_type
)
self
.
cdn_list
=
[]
self
.
queryUrl
=
"leftTicket/queryX"
self
.
passengerTicketStrList
=
""
self
.
oldPassengerStr
=
""
self
.
set_type
=
""
...
...
@@ -79,12 +80,13 @@ class select:
take_time
=
time_to_minutes
(
ticket_info_config
[
"set"
][
"take_time"
])
print
u
"*"
*
20
print
u
"12306刷票小助手,最后更新于2018.
9.21
,请勿作为商业用途,交流群号:286271084"
print
u
"12306刷票小助手,最后更新于2018.
12.26
,请勿作为商业用途,交流群号:286271084"
if
is_by_time
:
method_notie
=
"购票方式:根据时间区间购票
\n
可接受最早出发时间:{0}
\n
可接受最晚抵达时间:{1}
\n
可接受最长旅途时间:{2}
\n
可接受列车类型:{3}
\n
"
\
.
format
(
minutes_to_time
(
departure_time
),
minutes_to_time
(
arrival_time
),
minutes_to_time
(
take_time
),
" , "
.
join
(
train_types
))
method_notie
=
"购票方式:根据时间区间购票
\n
可接受最早出发时间:{0}
\n
可接受最晚抵达时间:{1}
\n
可接受最长旅途时间:{2}
\n
可接受列车类型:{3}
\n
"
\
.
format
(
minutes_to_time
(
departure_time
),
minutes_to_time
(
arrival_time
),
minutes_to_time
(
take_time
),
" , "
.
join
(
train_types
))
else
:
method_notie
=
"购票方式:根据候选车次购买
\n
候选购买车次:{0}"
.
format
(
","
.
join
(
station_trains
))
method_notie
=
"购票方式:根据候选车次购买
\n
候选购买车次:{0}"
.
format
(
","
.
join
(
station_trains
))
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
\
(
...
...
@@ -128,26 +130,17 @@ class select:
else
:
self
.
login
.
go_login
()
def
set_cdn
(
self
):
"""
设置cdn
:return:
"""
if
self
.
is_cdn
==
1
:
while
True
:
if
self
.
cdn_list
:
self
.
httpClint
.
cdn
=
self
.
cdn_list
[
random
.
randint
(
0
,
len
(
self
.
cdn_list
)
-
1
)]
def
cdn_req
(
self
,
cdn
):
for
i
in
range
(
len
(
cdn
)
-
1
):
http
=
HTTPClient
()
urls
=
self
.
urls
[
"loginInit"
]
http
.
cdn
=
cdn
[
i
].
replace
(
"
\n
"
,
""
)
urls
=
self
.
urls
[
"loginInit
Cdn
"
]
http
.
_
cdn
=
cdn
[
i
].
replace
(
"
\n
"
,
""
)
start_time
=
datetime
.
datetime
.
now
()
rep
=
http
.
send
(
urls
)
if
rep
and
"message"
not
in
rep
and
(
datetime
.
datetime
.
now
()
-
start_time
).
microseconds
/
1000
<
500
:
print
(
"加入cdn {0}"
.
format
(
cdn
[
i
].
replace
(
"
\n
"
,
""
)))
self
.
cdn_list
.
append
(
cdn
[
i
].
replace
(
"
\n
"
,
""
))
if
cdn
[
i
].
replace
(
"
\n
"
,
""
)
not
in
self
.
cdn_list
:
# 如果有重复的cdn,则放弃加入
print
(
"加入cdn {0}"
.
format
(
cdn
[
i
].
replace
(
"
\n
"
,
""
)))
self
.
cdn_list
.
append
(
cdn
[
i
].
replace
(
"
\n
"
,
""
))
print
(
u
"所有cdn解析完成..."
)
def
cdn_certification
(
self
):
...
...
@@ -157,14 +150,14 @@ class select:
"""
if
self
.
is_cdn
==
1
:
CDN
=
CDNProxy
()
all_cdn
=
CDN
.
all_cdn
()
all_cdn
=
CDN
.
open_cdn_file
()
if
all_cdn
:
print
(
u
"由于12306网站策略调整,cdn功能暂时关闭。"
)
#
print(u"开启cdn查询")
#
print(u"本次待筛选cdn总数为{}, 筛选时间大约为5-10min".format(len(all_cdn)))
#
t = threading.Thread(target=self.cdn_req, args=(all_cdn,))
#
print(u"由于12306网站策略调整,cdn功能暂时关闭。")
print
(
u
"开启cdn查询"
)
print
(
u
"本次待筛选cdn总数为{}, 筛选时间大约为5-10min"
.
format
(
len
(
all_cdn
)))
t
=
threading
.
Thread
(
target
=
self
.
cdn_req
,
args
=
(
all_cdn
,))
# t2 = threading.Thread(target=self.set_cdn, args=())
#
t.start()
t
.
start
()
# t2.start()
else
:
raise
ticketConfigException
(
u
"cdn列表为空,请先加载cdn"
)
...
...
@@ -174,7 +167,7 @@ class select:
l
=
liftTicketInit
(
self
)
l
.
reqLiftTicketInit
()
self
.
call_login
()
check_user
=
checkUser
(
self
)
check_user
=
checkUser
(
self
)
check_user
.
sendCheckUser
()
from_station
,
to_station
=
self
.
station_table
(
self
.
from_station
,
self
.
to_station
)
num
=
0
...
...
@@ -220,7 +213,8 @@ class select:
print
(
ticket
.
QUEUE_WARNING_MSG
.
format
(
train_no
))
else
:
# 获取联系人
s
=
getPassengerDTOs
(
session
=
self
,
ticket_peoples
=
self
.
ticke_peoples
,
set_type
=
seat_conf_2
[
seat
],
s
=
getPassengerDTOs
(
session
=
self
,
ticket_peoples
=
self
.
ticke_peoples
,
set_type
=
seat_conf_2
[
seat
],
is_more_ticket_num
=
is_more_ticket_num
)
getPassengerDTOsResult
=
s
.
getPassengerTicketStrListAndOldPassengerStr
()
if
getPassengerDTOsResult
.
get
(
"status"
,
False
):
...
...
@@ -256,8 +250,8 @@ class select:
","
.
join
(
self
.
station_trains
),
(
datetime
.
datetime
.
now
()
-
start_time
).
microseconds
/
1000
,
wrapcache
.
get
(
"cdn"
),
datetime
.
datetime
.
now
()
-
start_time
).
microseconds
/
1000
,
queryResult
.
get
(
"cdn"
,
None
),
len
(
self
.
cdn_list
),
random_time
)
...
...
@@ -290,4 +284,6 @@ class select:
if
__name__
==
'__main__'
:
pass
s
=
select
()
cdn
=
CDNProxy
().
open_cdn_file
()
s
.
cdn_req
(
cdn
)
inter/Query.py
浏览文件 @
cf2e8f8e
# coding=utf-8
import
copy
import
threading
import
time
import
random
import
wrapcache
from
config
import
urlConf
from
config.TicketEnmu
import
ticket
...
...
@@ -27,7 +32,6 @@ class query:
self
.
station_dates
=
station_dates
if
isinstance
(
station_dates
,
list
)
else
list
(
station_dates
)
self
.
ticket_black_list
=
dict
()
self
.
ticke_peoples_num
=
ticke_peoples_num
# by time
self
.
is_by_time
=
session
.
is_by_time
self
.
train_types
=
session
.
train_types
...
...
@@ -76,13 +80,19 @@ class query:
查询
:return:
"""
t1
=
threading
.
Thread
(
target
=
self
.
set_cdn
,
args
=
())
t1
.
start
()
for
station_date
in
self
.
station_dates
:
select_url
=
copy
.
copy
(
self
.
urls
[
"select_url"
])
select_url
[
"req_url"
]
=
select_url
[
"req_url"
].
format
(
station_date
,
self
.
from_station
,
self
.
to_station
)
select_url
[
"req_url"
]
=
select_url
[
"req_url"
].
format
(
station_date
,
self
.
from_station
,
self
.
to_station
,
self
.
session
.
queryUrl
)
station_ticket
=
self
.
httpClint
.
send
(
select_url
)
if
station_ticket
.
get
(
"c_url"
,
""
):
print
(
station_ticket
.
get
(
"c_url"
,
""
))
self
.
session
.
queryUrl
=
station_ticket
.
get
(
"c_url"
,
""
)
# 重设查询接口
continue
value
=
station_ticket
.
get
(
"data"
,
""
)
if
not
value
:
print
(
u
'{0}-{1} 车次坐席查询为空
'
.
format
(
self
.
from_station_h
,
self
.
to_station_h
))
print
(
u
'{0}-{1} 车次坐席查询为空
, 查询url: https://kyfw.12306.cn{2}, 可以手动查询是否有票'
.
format
(
self
.
from_station_h
,
self
.
to_station_h
,
select_url
[
"req_url"
]
))
else
:
result
=
value
.
get
(
'result'
,
[])
if
result
:
...
...
@@ -142,12 +152,25 @@ class query:
"train_location"
:
train_location
,
"code"
:
ticket
.
SUCCESS_CODE
,
"is_more_ticket_num"
:
is_more_ticket_num
,
"cdn"
:
self
.
httpClint
.
cdn
,
"status"
:
True
,
}
else
:
print
u
"车次配置信息有误,或者返回数据异常,请检查 {}"
.
format
(
station_ticket
)
return
{
"code"
:
ticket
.
FAIL_CODE
,
"status"
:
False
}
def
set_cdn
(
self
):
"""
设置cdn
:return:
"""
if
self
.
session
.
is_cdn
==
1
:
while
True
:
if
self
.
session
.
cdn_list
:
self
.
httpClint
.
cdn
=
self
.
session
.
cdn_list
[
random
.
randint
(
0
,
len
(
self
.
session
.
cdn_list
)
-
1
)]
else
:
time
.
sleep
(
0.05
)
if
__name__
==
"__main__"
:
q
=
query
()
myUrllib/httpUtils.py
浏览文件 @
cf2e8f8e
...
...
@@ -117,9 +117,8 @@ class HTTPClient(object):
if
is_test_cdn
:
url_host
=
self
.
_cdn
elif
is_cdn
:
cdn
=
wrapcache
.
get
(
"cdn"
)
if
cdn
:
url_host
=
cdn
if
self
.
_cdn
:
url_host
=
self
.
_cdn
else
:
url_host
=
urls
[
"Host"
]
else
:
...
...
@@ -136,7 +135,7 @@ class HTTPClient(object):
allow_redirects
=
allow_redirects
,
verify
=
False
,
**
kwargs
)
if
response
.
status_code
==
200
:
if
response
.
status_code
==
200
or
response
.
status_code
==
302
:
if
response
.
content
:
if
is_logger
:
logger
.
log
(
...
...
tkcode
浏览文件 @
cf2e8f8e
无法预览此类型文件
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录