Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
py12306
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
python
py12306
Commits
493411ec
Commit
493411ec
authored
Jan 18, 2019
by
Jalin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加排除车次, 增加通过序号确定唯一联系人 #68
parent
b72f7ec5
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
58 additions
and
19 deletions
+58
-19
README.md
README.md
+2
-1
env.docker.py.example
env.docker.py.example
+13
-7
env.py.example
env.py.example
+8
-2
config.py
py12306/config.py
+1
-0
func.py
py12306/helpers/func.py
+6
-0
query_log.py
py12306/log/query_log.py
+5
-1
job.py
py12306/query/job.py
+7
-3
job.py
py12306/user/job.py
+15
-5
query.py
py12306/web/handler/query.py
+1
-0
No files found.
README.md
View file @
493411ec
...
@@ -121,7 +121,8 @@ docker run --rm --name py12306 -p 8008:8008 -d -v $(pwd):/config -v py12306:/dat
...
@@ -121,7 +121,8 @@ docker run --rm --name py12306 -p 8008:8008 -d -v $(pwd):/config -v py12306:/dat
-
新增 钉钉通知
-
新增 钉钉通知
-
新增 Telegram 通知
-
新增 Telegram 通知
-
新增 ServerChan 和 PushBear 微信推送
-
新增 ServerChan 和 PushBear 微信推送
-
19-01-18
-
新增 CDN 查询
## 截图
## 截图
### Web 管理页面
### Web 管理页面
...
...
env.docker.py.example
View file @
493411ec
...
@@ -99,6 +99,9 @@ WEB_USER = { # 登录信息
...
@@ -99,6 +99,9 @@ WEB_USER = { # 登录信息
}
}
WEB_PORT = 8008 # 监听端口
WEB_PORT = 8008 # 监听端口
# 是否开启 CDN 查询
CDN_ENABLED = 0
# 查询任务
# 查询任务
QUERY_JOBS = [
QUERY_JOBS = [
{
{
...
@@ -123,6 +126,7 @@ QUERY_JOBS = [
...
@@ -123,6 +126,7 @@ QUERY_JOBS = [
'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三']
'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三']
"张三",
"张三",
"王五",
"王五",
# 7, # 支持通过序号确定唯一乘客,序号查看可通过 python main.py -t 登录成功之后在 runtime/user/ 下找到对应的 用户名_passengers.json 文件,找到对应的 code 填入
],
],
'allow_less_member': 0, # 是否允许余票不足时提交部分乘客
'allow_less_member': 0, # 是否允许余票不足时提交部分乘客
'seats': [ # 筛选座位 有先后顺序 :Array
'seats': [ # 筛选座位 有先后顺序 :Array
...
@@ -134,6 +138,8 @@ QUERY_JOBS = [
...
@@ -134,6 +138,8 @@ QUERY_JOBS = [
"K356",
"K356",
"K1172",
"K1172",
"K4184"
"K4184"
],
'except_train_numbers': [ # 筛选车次,排除车次 train_numbers 和 except_train_numbers 不可同时存在
]
]
},
},
...
...
env.py.example
View file @
493411ec
...
@@ -97,6 +97,9 @@ WEB_USER = { # 登录信息
...
@@ -97,6 +97,9 @@ WEB_USER = { # 登录信息
}
}
WEB_PORT = 8008 # 监听端口
WEB_PORT = 8008 # 监听端口
# 是否开启 CDN 查询
CDN_ENABLED = 0
# 查询任务
# 查询任务
QUERY_JOBS = [
QUERY_JOBS = [
{
{
...
@@ -121,6 +124,7 @@ QUERY_JOBS = [
...
@@ -121,6 +124,7 @@ QUERY_JOBS = [
'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三']
'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三']
"张三",
"张三",
"王五",
"王五",
# 7, # 支持通过序号确定唯一乘客,序号查看可通过 python main.py -t 登录成功之后在 runtime/user/ 下找到对应的 用户名_passengers.json 文件,找到对应的 code 填入
],
],
'allow_less_member': 0, # 是否允许余票不足时提交部分乘客
'allow_less_member': 0, # 是否允许余票不足时提交部分乘客
'seats': [ # 筛选座位 有先后顺序 :Array
'seats': [ # 筛选座位 有先后顺序 :Array
...
@@ -132,6 +136,8 @@ QUERY_JOBS = [
...
@@ -132,6 +136,8 @@ QUERY_JOBS = [
"K356",
"K356",
"K1172",
"K1172",
"K4184"
"K4184"
],
'except_train_numbers': [ # 筛选车次,排除车次 train_numbers 和 except_train_numbers 不可同时存在
]
]
},
},
...
...
py12306/config.py
View file @
493411ec
...
@@ -37,6 +37,7 @@ class Config:
...
@@ -37,6 +37,7 @@ class Config:
RUNTIME_DIR
=
PROJECT_DIR
+
'runtime/'
RUNTIME_DIR
=
PROJECT_DIR
+
'runtime/'
QUERY_DATA_DIR
=
RUNTIME_DIR
+
'query/'
QUERY_DATA_DIR
=
RUNTIME_DIR
+
'query/'
USER_DATA_DIR
=
RUNTIME_DIR
+
'user/'
USER_DATA_DIR
=
RUNTIME_DIR
+
'user/'
USER_PASSENGERS_FILE
=
RUNTIME_DIR
+
'user/
%
s_passengers.json'
STATION_FILE
=
PROJECT_DIR
+
'data/stations.txt'
STATION_FILE
=
PROJECT_DIR
+
'data/stations.txt'
CONFIG_FILE
=
PROJECT_DIR
+
'env.py'
CONFIG_FILE
=
PROJECT_DIR
+
'env.py'
...
...
py12306/helpers/func.py
View file @
493411ec
...
@@ -121,6 +121,12 @@ def time_int():
...
@@ -121,6 +121,12 @@ def time_int():
return
int
(
time
.
time
())
return
int
(
time
.
time
())
def
is_number
(
val
):
if
isinstance
(
val
,
int
):
return
val
if
isinstance
(
val
,
str
):
return
val
.
isdigit
()
return
False
def
create_thread_and_run
(
jobs
,
callback_name
,
wait
=
True
,
daemon
=
True
,
args
=
(),
kwargs
=
{}):
def
create_thread_and_run
(
jobs
,
callback_name
,
wait
=
True
,
daemon
=
True
,
args
=
(),
kwargs
=
{}):
threads
=
[]
threads
=
[]
if
not
isinstance
(
jobs
,
list
):
jobs
=
[
jobs
]
if
not
isinstance
(
jobs
,
list
):
jobs
=
[
jobs
]
...
...
py12306/log/query_log.py
View file @
493411ec
...
@@ -101,7 +101,11 @@ class QueryLog(BaseLog):
...
@@ -101,7 +101,11 @@ class QueryLog(BaseLog):
self
.
add_log
(
'乘车日期:{}'
.
format
(
job
.
left_dates
))
self
.
add_log
(
'乘车日期:{}'
.
format
(
job
.
left_dates
))
self
.
add_log
(
'坐席:{}'
.
format
(
','
.
join
(
job
.
allow_seats
)))
self
.
add_log
(
'坐席:{}'
.
format
(
','
.
join
(
job
.
allow_seats
)))
self
.
add_log
(
'乘车人:{}'
.
format
(
','
.
join
(
job
.
members
)))
self
.
add_log
(
'乘车人:{}'
.
format
(
','
.
join
(
job
.
members
)))
self
.
add_log
(
'筛选车次:{}'
.
format
(
','
.
join
(
job
.
allow_train_numbers
if
job
.
allow_train_numbers
else
[
'不筛选'
])))
if
job
.
except_train_numbers
:
train_number_message
=
'排除 '
+
','
.
join
(
job
.
allow_train_numbers
)
else
:
train_number_message
=
','
.
join
(
job
.
allow_train_numbers
if
job
.
allow_train_numbers
else
[
'不筛选'
])
self
.
add_log
(
'筛选车次:{}'
.
format
(
train_number_message
))
self
.
add_log
(
'任务名称:{}'
.
format
(
job
.
job_name
))
self
.
add_log
(
'任务名称:{}'
.
format
(
job
.
job_name
))
# 乘车日期:['2019-01-24', '2019-01-25', '2019-01-26', '2019-01-27']
# 乘车日期:['2019-01-24', '2019-01-25', '2019-01-26', '2019-01-27']
self
.
add_log
(
''
)
self
.
add_log
(
''
)
...
...
py12306/query/job.py
View file @
493411ec
...
@@ -34,6 +34,7 @@ class Job:
...
@@ -34,6 +34,7 @@ class Job:
current_seat
=
None
current_seat
=
None
current_order_seat
=
None
current_order_seat
=
None
allow_train_numbers
=
[]
allow_train_numbers
=
[]
except_train_numbers
=
[]
members
=
[]
members
=
[]
member_num
=
0
member_num
=
0
member_num_take
=
0
# 最终提交的人数
member_num_take
=
0
# 最终提交的人数
...
@@ -75,7 +76,8 @@ class Job:
...
@@ -75,7 +76,8 @@ class Job:
self
.
account_key
=
str
(
info
.
get
(
'account_key'
))
self
.
account_key
=
str
(
info
.
get
(
'account_key'
))
self
.
allow_seats
=
info
.
get
(
'seats'
)
self
.
allow_seats
=
info
.
get
(
'seats'
)
self
.
allow_train_numbers
=
info
.
get
(
'train_numbers'
)
self
.
allow_train_numbers
=
info
.
get
(
'train_numbers'
)
self
.
members
=
info
.
get
(
'members'
)
self
.
except_train_numbers
=
info
.
get
(
'except_train_numbers'
)
self
.
members
=
list
(
map
(
str
,
info
.
get
(
'members'
)))
self
.
member_num
=
len
(
self
.
members
)
self
.
member_num
=
len
(
self
.
members
)
self
.
member_num_take
=
self
.
member_num
self
.
member_num_take
=
self
.
member_num
self
.
allow_less_member
=
bool
(
info
.
get
(
'allow_less_member'
))
self
.
allow_less_member
=
bool
(
info
.
get
(
'allow_less_member'
))
...
@@ -148,7 +150,7 @@ class Job:
...
@@ -148,7 +150,7 @@ class Job:
return
False
return
False
for
result
in
results
:
for
result
in
results
:
self
.
ticket_info
=
ticket_info
=
result
.
split
(
'|'
)
self
.
ticket_info
=
ticket_info
=
result
.
split
(
'|'
)
if
not
self
.
is_trains_number_valid
(
ticket_info
):
# 车次是否有效
if
not
self
.
is_trains_number_valid
():
# 车次是否有效
continue
continue
QueryLog
.
add_log
(
QueryLog
.
MESSAGE_QUERY_LOG_OF_EVERY_TRAIN
.
format
(
self
.
get_info_of_train_number
()))
QueryLog
.
add_log
(
QueryLog
.
MESSAGE_QUERY_LOG_OF_EVERY_TRAIN
.
format
(
self
.
get_info_of_train_number
()))
if
not
self
.
is_has_ticket
(
ticket_info
):
if
not
self
.
is_has_ticket
(
ticket_info
):
...
@@ -231,7 +233,9 @@ class Job:
...
@@ -231,7 +233,9 @@ class Job:
def
is_has_ticket_by_seat
(
self
,
seat
):
def
is_has_ticket_by_seat
(
self
,
seat
):
return
seat
!=
''
and
seat
!=
'无'
and
seat
!=
'*'
return
seat
!=
''
and
seat
!=
'无'
and
seat
!=
'*'
def
is_trains_number_valid
(
self
,
ticket_info
):
def
is_trains_number_valid
(
self
):
if
self
.
except_train_numbers
:
return
self
.
get_info_of_train_number
()
.
upper
()
not
in
map
(
str
.
upper
,
self
.
except_train_numbers
)
if
self
.
allow_train_numbers
:
if
self
.
allow_train_numbers
:
return
self
.
get_info_of_train_number
()
.
upper
()
in
map
(
str
.
upper
,
self
.
allow_train_numbers
)
return
self
.
get_info_of_train_number
()
.
upper
()
in
map
(
str
.
upper
,
self
.
allow_train_numbers
)
return
True
return
True
...
...
py12306/user/job.py
View file @
493411ec
...
@@ -150,7 +150,8 @@ class UserJob:
...
@@ -150,7 +150,8 @@ class UserJob:
UserLog
.
add_quick_log
(
UserLog
.
MESSAGE_LOGIN_FAIL
.
format
(
result
.
get
(
'result_message'
)))
.
flush
()
UserLog
.
add_quick_log
(
UserLog
.
MESSAGE_LOGIN_FAIL
.
format
(
result
.
get
(
'result_message'
)))
.
flush
()
else
:
else
:
UserLog
.
add_quick_log
(
UserLog
.
add_quick_log
(
UserLog
.
MESSAGE_LOGIN_FAIL
.
format
(
result
.
get
(
'result_message'
,
result
.
get
(
'message'
,
CommonLog
.
MESSAGE_RESPONSE_EMPTY_ERROR
))))
.
flush
()
UserLog
.
MESSAGE_LOGIN_FAIL
.
format
(
result
.
get
(
'result_message'
,
result
.
get
(
'message'
,
CommonLog
.
MESSAGE_RESPONSE_EMPTY_ERROR
))))
.
flush
()
return
False
return
False
...
@@ -304,10 +305,14 @@ class UserJob:
...
@@ -304,10 +305,14 @@ class UserJob:
result
=
response
.
json
()
result
=
response
.
json
()
if
result
.
get
(
'data.normal_passengers'
):
if
result
.
get
(
'data.normal_passengers'
):
self
.
passengers
=
result
.
get
(
'data.normal_passengers'
)
self
.
passengers
=
result
.
get
(
'data.normal_passengers'
)
# 将乘客写入到文件
with
open
(
Config
()
.
USER_PASSENGERS_FILE
%
self
.
user_name
,
'w'
)
as
f
:
f
.
write
(
json
.
dumps
(
self
.
passengers
,
indent
=
4
,
ensure_ascii
=
False
))
return
self
.
passengers
return
self
.
passengers
else
:
else
:
UserLog
.
add_quick_log
(
UserLog
.
add_quick_log
(
UserLog
.
MESSAGE_GET_USER_PASSENGERS_FAIL
.
format
(
result
.
get
(
'messages'
,
CommonLog
.
MESSAGE_RESPONSE_EMPTY_ERROR
),
self
.
retry_time
))
.
flush
()
UserLog
.
MESSAGE_GET_USER_PASSENGERS_FAIL
.
format
(
result
.
get
(
'messages'
,
CommonLog
.
MESSAGE_RESPONSE_EMPTY_ERROR
),
self
.
retry_time
))
.
flush
()
stay_second
(
self
.
retry_time
)
stay_second
(
self
.
retry_time
)
return
self
.
get_user_passengers
()
return
self
.
get_user_passengers
()
...
@@ -326,11 +331,16 @@ class UserJob:
...
@@ -326,11 +331,16 @@ class UserJob:
self
.
get_user_passengers
()
self
.
get_user_passengers
()
results
=
[]
results
=
[]
for
member
in
members
:
for
member
in
members
:
is_member_code
=
is_number
(
member
)
if
not
is_member_code
:
child_check
=
array_dict_find_by_key_value
(
results
,
'name'
,
member
)
child_check
=
array_dict_find_by_key_value
(
results
,
'name'
,
member
)
if
child_check
:
if
not
is_member_code
and
child_check
:
new_member
=
child_check
.
copy
()
new_member
=
child_check
.
copy
()
new_member
[
'type'
]
=
UserType
.
CHILD
new_member
[
'type'
]
=
UserType
.
CHILD
new_member
[
'type_text'
]
=
dict_find_key_by_value
(
UserType
.
dicts
,
int
(
new_member
[
'type'
]))
new_member
[
'type_text'
]
=
dict_find_key_by_value
(
UserType
.
dicts
,
int
(
new_member
[
'type'
]))
else
:
if
is_member_code
:
passenger
=
array_dict_find_by_key_value
(
self
.
passengers
,
'code'
,
member
)
else
:
else
:
passenger
=
array_dict_find_by_key_value
(
self
.
passengers
,
'passenger_name'
,
member
)
passenger
=
array_dict_find_by_key_value
(
self
.
passengers
,
'passenger_name'
,
member
)
if
not
passenger
:
if
not
passenger
:
...
...
py12306/web/handler/query.py
View file @
493411ec
...
@@ -30,6 +30,7 @@ def convert_job_to_info(job: Job):
...
@@ -30,6 +30,7 @@ def convert_job_to_info(job: Job):
'member_num'
:
job
.
member_num
,
'member_num'
:
job
.
member_num
,
'allow_seats'
:
job
.
allow_seats
,
'allow_seats'
:
job
.
allow_seats
,
'allow_train_numbers'
:
job
.
allow_train_numbers
,
'allow_train_numbers'
:
job
.
allow_train_numbers
,
'except_train_numbers'
:
job
.
except_train_numbers
,
'allow_less_member'
:
job
.
allow_less_member
,
'allow_less_member'
:
job
.
allow_less_member
,
'passengers'
:
job
.
passengers
,
'passengers'
:
job
.
passengers
,
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment