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
Hide 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
-
新增 钉钉通知
-
新增 Telegram 通知
-
新增 ServerChan 和 PushBear 微信推送
-
19-01-18
-
新增 CDN 查询
## 截图
### Web 管理页面
...
...
env.docker.py.example
View file @
493411ec
...
...
@@ -84,21 +84,24 @@ REDIS_PORT = '6379' # Redis port
REDIS_PASSWORD = '' # Redis 密码 没有可以留空
# 邮箱配置
EMAIL_ENABLED = 0 # 是否开启邮件通知
EMAIL_SENDER = 'sender@example.com' # 邮件发送者
EMAIL_RECEIVER = 'receiver@example.com' # 邮件接受者 # 可以多个 [email1@gmail.com, email2@gmail.com]
EMAIL_SERVER_HOST = 'localhost' # 邮件服务 host
EMAIL_SERVER_USER = '' # 邮件服务登录用户名
EMAIL_SERVER_PASSWORD = '' # 邮件服务登录密码
EMAIL_ENABLED = 0
# 是否开启邮件通知
EMAIL_SENDER = 'sender@example.com'
# 邮件发送者
EMAIL_RECEIVER = 'receiver@example.com'
# 邮件接受者 # 可以多个 [email1@gmail.com, email2@gmail.com]
EMAIL_SERVER_HOST = 'localhost'
# 邮件服务 host
EMAIL_SERVER_USER = ''
# 邮件服务登录用户名
EMAIL_SERVER_PASSWORD = ''
# 邮件服务登录密码
# Web 管理
WEB_ENABLE = 1 # 是否打开 Web 管理
WEB_USER = { # 登录信息
WEB_USER = {
# 登录信息
'username': 'admin',
'password': 'password'
}
WEB_PORT = 8008 # 监听端口
# 是否开启 CDN 查询
CDN_ENABLED = 0
# 查询任务
QUERY_JOBS = [
{
...
...
@@ -123,6 +126,7 @@ QUERY_JOBS = [
'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三']
"张三",
"王五",
# 7, # 支持通过序号确定唯一乘客,序号查看可通过 python main.py -t 登录成功之后在 runtime/user/ 下找到对应的 用户名_passengers.json 文件,找到对应的 code 填入
],
'allow_less_member': 0, # 是否允许余票不足时提交部分乘客
'seats': [ # 筛选座位 有先后顺序 :Array
...
...
@@ -134,6 +138,8 @@ QUERY_JOBS = [
"K356",
"K1172",
"K4184"
],
'except_train_numbers': [ # 筛选车次,排除车次 train_numbers 和 except_train_numbers 不可同时存在
]
},
...
...
env.py.example
View file @
493411ec
...
...
@@ -86,8 +86,8 @@ EMAIL_ENABLED = 0 # 是否开启邮件通知
EMAIL_SENDER = 'sender@example.com' # 邮件发送者
EMAIL_RECEIVER = 'receiver@example.com' # 邮件接受者 # 可以多个 [email1@gmail.com, email2@gmail.com]
EMAIL_SERVER_HOST = 'localhost' # 邮件服务 host
EMAIL_SERVER_USER = '' # 邮件服务登录用户名
EMAIL_SERVER_PASSWORD = '' # 邮件服务登录密码
EMAIL_SERVER_USER = ''
# 邮件服务登录用户名
EMAIL_SERVER_PASSWORD = ''
# 邮件服务登录密码
# Web 管理
WEB_ENABLE = 1 # 是否打开 Web 管理
...
...
@@ -97,6 +97,9 @@ WEB_USER = { # 登录信息
}
WEB_PORT = 8008 # 监听端口
# 是否开启 CDN 查询
CDN_ENABLED = 0
# 查询任务
QUERY_JOBS = [
{
...
...
@@ -121,6 +124,7 @@ QUERY_JOBS = [
'members': [ # 乘客姓名,会根据当前账号自动识别乘客类型 购买儿童票 设置两个相同的姓名即可,程序会自动识别 如 ['张三', '张三']
"张三",
"王五",
# 7, # 支持通过序号确定唯一乘客,序号查看可通过 python main.py -t 登录成功之后在 runtime/user/ 下找到对应的 用户名_passengers.json 文件,找到对应的 code 填入
],
'allow_less_member': 0, # 是否允许余票不足时提交部分乘客
'seats': [ # 筛选座位 有先后顺序 :Array
...
...
@@ -132,6 +136,8 @@ QUERY_JOBS = [
"K356",
"K1172",
"K4184"
],
'except_train_numbers': [ # 筛选车次,排除车次 train_numbers 和 except_train_numbers 不可同时存在
]
},
...
...
py12306/config.py
View file @
493411ec
...
...
@@ -37,6 +37,7 @@ class Config:
RUNTIME_DIR
=
PROJECT_DIR
+
'runtime/'
QUERY_DATA_DIR
=
RUNTIME_DIR
+
'query/'
USER_DATA_DIR
=
RUNTIME_DIR
+
'user/'
USER_PASSENGERS_FILE
=
RUNTIME_DIR
+
'user/
%
s_passengers.json'
STATION_FILE
=
PROJECT_DIR
+
'data/stations.txt'
CONFIG_FILE
=
PROJECT_DIR
+
'env.py'
...
...
py12306/helpers/func.py
View file @
493411ec
...
...
@@ -121,6 +121,12 @@ def time_int():
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
=
{}):
threads
=
[]
if
not
isinstance
(
jobs
,
list
):
jobs
=
[
jobs
]
...
...
py12306/log/query_log.py
View file @
493411ec
...
...
@@ -101,7 +101,11 @@ class QueryLog(BaseLog):
self
.
add_log
(
'乘车日期:{}'
.
format
(
job
.
left_dates
))
self
.
add_log
(
'坐席:{}'
.
format
(
','
.
join
(
job
.
allow_seats
)))
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
))
# 乘车日期:['2019-01-24', '2019-01-25', '2019-01-26', '2019-01-27']
self
.
add_log
(
''
)
...
...
py12306/query/job.py
View file @
493411ec
...
...
@@ -34,6 +34,7 @@ class Job:
current_seat
=
None
current_order_seat
=
None
allow_train_numbers
=
[]
except_train_numbers
=
[]
members
=
[]
member_num
=
0
member_num_take
=
0
# 最终提交的人数
...
...
@@ -75,7 +76,8 @@ class Job:
self
.
account_key
=
str
(
info
.
get
(
'account_key'
))
self
.
allow_seats
=
info
.
get
(
'seats'
)
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_take
=
self
.
member_num
self
.
allow_less_member
=
bool
(
info
.
get
(
'allow_less_member'
))
...
...
@@ -148,7 +150,7 @@ class Job:
return
False
for
result
in
results
:
self
.
ticket_info
=
ticket_info
=
result
.
split
(
'|'
)
if
not
self
.
is_trains_number_valid
(
ticket_info
):
# 车次是否有效
if
not
self
.
is_trains_number_valid
():
# 车次是否有效
continue
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
):
...
...
@@ -231,7 +233,9 @@ class Job:
def
is_has_ticket_by_seat
(
self
,
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
:
return
self
.
get_info_of_train_number
()
.
upper
()
in
map
(
str
.
upper
,
self
.
allow_train_numbers
)
return
True
...
...
py12306/user/job.py
View file @
493411ec
...
...
@@ -150,7 +150,8 @@ class UserJob:
UserLog
.
add_quick_log
(
UserLog
.
MESSAGE_LOGIN_FAIL
.
format
(
result
.
get
(
'result_message'
)))
.
flush
()
else
:
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
...
...
@@ -304,10 +305,14 @@ class UserJob:
result
=
response
.
json
()
if
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
else
:
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
)
return
self
.
get_user_passengers
()
...
...
@@ -326,13 +331,18 @@ class UserJob:
self
.
get_user_passengers
()
results
=
[]
for
member
in
members
:
child_check
=
array_dict_find_by_key_value
(
results
,
'name'
,
member
)
if
child_check
:
is_member_code
=
is_number
(
member
)
if
not
is_member_code
:
child_check
=
array_dict_find_by_key_value
(
results
,
'name'
,
member
)
if
not
is_member_code
and
child_check
:
new_member
=
child_check
.
copy
()
new_member
[
'type'
]
=
UserType
.
CHILD
new_member
[
'type_text'
]
=
dict_find_key_by_value
(
UserType
.
dicts
,
int
(
new_member
[
'type'
]))
else
:
passenger
=
array_dict_find_by_key_value
(
self
.
passengers
,
'passenger_name'
,
member
)
if
is_member_code
:
passenger
=
array_dict_find_by_key_value
(
self
.
passengers
,
'code'
,
member
)
else
:
passenger
=
array_dict_find_by_key_value
(
self
.
passengers
,
'passenger_name'
,
member
)
if
not
passenger
:
UserLog
.
add_quick_log
(
UserLog
.
MESSAGE_USER_PASSENGERS_IS_INVALID
.
format
(
self
.
user_name
,
member
))
.
flush
()
...
...
py12306/web/handler/query.py
View file @
493411ec
...
...
@@ -30,6 +30,7 @@ def convert_job_to_info(job: Job):
'member_num'
:
job
.
member_num
,
'allow_seats'
:
job
.
allow_seats
,
'allow_train_numbers'
:
job
.
allow_train_numbers
,
'except_train_numbers'
:
job
.
except_train_numbers
,
'allow_less_member'
:
job
.
allow_less_member
,
'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