Compare commits
7 Commits
v2.0
...
fix/drag-c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fbeb7835e5 | ||
|
|
f9a0f20e41 | ||
|
|
fd8c500128 | ||
|
|
da1a0903c5 | ||
|
|
8d0a6f05b7 | ||
|
|
c82a94de39 | ||
|
|
0316e52e90 |
@@ -28,7 +28,8 @@ QUERY_JOB_THREAD_ENABLED = 0 # 是否开启多线程查询,开启后第个任
|
|||||||
|
|
||||||
# 打码平台账号
|
# 打码平台账号
|
||||||
# 目前只支持免费打码接口 和 若快打码,注册地址:http://www.ruokuai.com/login
|
# 目前只支持免费打码接口 和 若快打码,注册地址:http://www.ruokuai.com/login
|
||||||
AUTO_CODE_PLATFORM = 'free' # 免费填写 free 若快 ruokuai # 免费打码无法保证持续可用,如失效请手动切换
|
AUTO_CODE_PLATFORM = 'free' # 免费填写 free 若快 ruokuai # 免费打码无法保证持续可用,如失效请手动切换 #个人本地打码填写 user,并修改 API_USER_CODE_QCR_API
|
||||||
|
API_USER_CODE_QCR_API = ''
|
||||||
AUTO_CODE_ACCOUNT = {
|
AUTO_CODE_ACCOUNT = {
|
||||||
'user': 'your user name',
|
'user': 'your user name',
|
||||||
'pwd': 'your password'
|
'pwd': 'your password'
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ QUERY_JOB_THREAD_ENABLED = 0 # 是否开启多线程查询,开启后第个任
|
|||||||
|
|
||||||
# 打码平台账号
|
# 打码平台账号
|
||||||
# 目前只支持免费打码接口 和 若快打码,注册地址:http://www.ruokuai.com/login
|
# 目前只支持免费打码接口 和 若快打码,注册地址:http://www.ruokuai.com/login
|
||||||
AUTO_CODE_PLATFORM = 'free' # 免费填写 free 若快 ruokuai # 免费打码无法保证持续可用,如失效请手动切换
|
AUTO_CODE_PLATFORM = 'free' # 免费填写 free 若快 ruokuai # 免费打码无法保证持续可用,如失效请手动切换; 个人打码填写 user 并修改API_USER_CODE_QCR_API 为自己地址
|
||||||
|
API_USER_CODE_QCR_API = ''
|
||||||
AUTO_CODE_ACCOUNT = { # 使用 free 可用省略
|
AUTO_CODE_ACCOUNT = { # 使用 free 可用省略
|
||||||
'user': 'your user name',
|
'user': 'your user name',
|
||||||
'pwd': 'your password'
|
'pwd': 'your password'
|
||||||
@@ -77,9 +78,7 @@ BARK_ENABLED = 0
|
|||||||
BARK_PUSH_URL = 'https://api.day.app/:your_token'
|
BARK_PUSH_URL = 'https://api.day.app/:your_token'
|
||||||
|
|
||||||
# 输出日志到文件
|
# 输出日志到文件
|
||||||
# 默认设置不需要,related issue: https://github.com/pjialin/py12306/issues/319
|
OUT_PUT_LOG_TO_FILE_ENABLED = 0
|
||||||
# 如需更改再 uncomment 掉下面这行
|
|
||||||
# OUT_PUT_LOG_TO_FILE_ENABLED = 0
|
|
||||||
OUT_PUT_LOG_TO_FILE_PATH = 'runtime/12306.log' # 日志目录
|
OUT_PUT_LOG_TO_FILE_PATH = 'runtime/12306.log' # 日志目录
|
||||||
|
|
||||||
# 分布式集群配置
|
# 分布式集群配置
|
||||||
@@ -111,6 +110,11 @@ WEB_PORT = 8008 # 监听端口
|
|||||||
CDN_ENABLED = 0
|
CDN_ENABLED = 0
|
||||||
CDN_CHECK_TIME_OUT = 1 # 检测单个 cdn 是否可用超时时间
|
CDN_CHECK_TIME_OUT = 1 # 检测单个 cdn 是否可用超时时间
|
||||||
|
|
||||||
|
# 是否使用浏览器缓存中的RAIL_EXPIRATION 和 RAIL_DEVICEID
|
||||||
|
CACHE_RAIL_ID_ENABLED = 0
|
||||||
|
RAIL_EXPIRATION = '' #浏览12306 网站中的Cache的RAIL_EXPIRATION 值
|
||||||
|
RAIL_DEVICEID = '' #浏览12306 网站中的Cache的RAIL_DEVICEID 值
|
||||||
|
|
||||||
# 查询任务
|
# 查询任务
|
||||||
QUERY_JOBS = [
|
QUERY_JOBS = [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ class App:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def check_auto_code(cls):
|
def check_auto_code(cls):
|
||||||
if Config().AUTO_CODE_PLATFORM == 'free': return True
|
if Config().AUTO_CODE_PLATFORM == 'free' or Config().AUTO_CODE_PLATFORM == 'user': return True
|
||||||
if not Config().AUTO_CODE_ACCOUNT.get('user') or not Config().AUTO_CODE_ACCOUNT.get('pwd'):
|
if not Config().AUTO_CODE_ACCOUNT.get('user') or not Config().AUTO_CODE_ACCOUNT.get('pwd'):
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ class Config:
|
|||||||
QUERY_JOB_THREAD_ENABLED = 0
|
QUERY_JOB_THREAD_ENABLED = 0
|
||||||
# 打码平台账号
|
# 打码平台账号
|
||||||
AUTO_CODE_PLATFORM = ''
|
AUTO_CODE_PLATFORM = ''
|
||||||
|
#用户打码平台地址
|
||||||
|
API_USER_CODE_QCR_API = ''
|
||||||
AUTO_CODE_ACCOUNT = {'user': '', 'pwd': ''}
|
AUTO_CODE_ACCOUNT = {'user': '', 'pwd': ''}
|
||||||
# 输出日志到文件
|
# 输出日志到文件
|
||||||
OUT_PUT_LOG_TO_FILE_ENABLED = 0
|
OUT_PUT_LOG_TO_FILE_ENABLED = 0
|
||||||
@@ -94,6 +96,10 @@ class Config:
|
|||||||
CDN_ITEM_FILE = PROJECT_DIR + 'data/cdn.txt'
|
CDN_ITEM_FILE = PROJECT_DIR + 'data/cdn.txt'
|
||||||
CDN_ENABLED_AVAILABLE_ITEM_FILE = QUERY_DATA_DIR + 'available.json'
|
CDN_ENABLED_AVAILABLE_ITEM_FILE = QUERY_DATA_DIR + 'available.json'
|
||||||
|
|
||||||
|
CACHE_RAIL_ID_ENABLED = 0
|
||||||
|
RAIL_EXPIRATION = ''
|
||||||
|
RAIL_DEVICEID = ''
|
||||||
|
|
||||||
# Default time out
|
# Default time out
|
||||||
TIME_OUT_OF_REQUEST = 5
|
TIME_OUT_OF_REQUEST = 5
|
||||||
|
|
||||||
@@ -213,6 +219,10 @@ class Config:
|
|||||||
def is_cdn_enabled():
|
def is_cdn_enabled():
|
||||||
return Config().CDN_ENABLED
|
return Config().CDN_ENABLED
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def is_cache_rail_id_enabled():
|
||||||
|
return Config().CACHE_RAIL_ID_ENABLED
|
||||||
|
|
||||||
|
|
||||||
class EnvLoader:
|
class EnvLoader:
|
||||||
envs = []
|
envs = []
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class OCR:
|
|||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
self = cls()
|
self = cls()
|
||||||
if Config().AUTO_CODE_PLATFORM == 'free':
|
if Config().AUTO_CODE_PLATFORM == 'free' or Config().AUTO_CODE_PLATFORM == 'user':
|
||||||
return self.get_image_by_free_site(img)
|
return self.get_image_by_free_site(img)
|
||||||
return self.get_img_position_by_ruokuai(img)
|
return self.get_img_position_by_ruokuai(img)
|
||||||
|
|
||||||
@@ -58,7 +58,10 @@ class OCR:
|
|||||||
data = {
|
data = {
|
||||||
'img': img
|
'img': img
|
||||||
}
|
}
|
||||||
response = self.session.post(API_FREE_CODE_QCR_API, data=data, timeout=30)
|
if Config().AUTO_CODE_PLATFORM == 'free':
|
||||||
|
response = self.session.post(API_FREE_CODE_QCR_API, data=data, timeout=30)
|
||||||
|
else:
|
||||||
|
response = self.session.post(Config().API_USER_CODE_QCR_API, data=data, timeout=30)
|
||||||
result = response.json()
|
result = response.json()
|
||||||
if result.get('msg') == 'success':
|
if result.get('msg') == 'success':
|
||||||
pos = result.get('result')
|
pos = result.get('result')
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ class AuthCode:
|
|||||||
url = API_AUTH_CODE_BASE64_DOWNLOAD.format(random=random.random())
|
url = API_AUTH_CODE_BASE64_DOWNLOAD.format(random=random.random())
|
||||||
# code_path = self.data_path + 'code.png'
|
# code_path = self.data_path + 'code.png'
|
||||||
try:
|
try:
|
||||||
|
self.session.cookies.clear_session_cookies()
|
||||||
UserLog.add_quick_log(UserLog.MESSAGE_DOWNLAODING_THE_CODE).flush()
|
UserLog.add_quick_log(UserLog.MESSAGE_DOWNLAODING_THE_CODE).flush()
|
||||||
# response = self.session.save_to_file(url, code_path) # TODO 返回错误情况
|
# response = self.session.save_to_file(url, code_path) # TODO 返回错误情况
|
||||||
response = self.session.get(url)
|
response = self.session.get(url)
|
||||||
|
|||||||
@@ -77,3 +77,18 @@ class Request(HTMLSession):
|
|||||||
url = url.replace(HOST_URL_OF_12306, cdn)
|
url = url.replace(HOST_URL_OF_12306, cdn)
|
||||||
|
|
||||||
return self.request(method, url, headers={'Host': HOST_URL_OF_12306}, verify=False, **kwargs)
|
return self.request(method, url, headers={'Host': HOST_URL_OF_12306}, verify=False, **kwargs)
|
||||||
|
|
||||||
|
def dump_cookies(self):
|
||||||
|
cookies = []
|
||||||
|
for _, item in self.cookies._cookies.items():
|
||||||
|
for _, urls in item.items():
|
||||||
|
for _, cookie in urls.items():
|
||||||
|
from http.cookiejar import Cookie
|
||||||
|
assert isinstance(cookie, Cookie)
|
||||||
|
if cookie.domain:
|
||||||
|
cookies.append({
|
||||||
|
'name': cookie.name,
|
||||||
|
'value': cookie.value,
|
||||||
|
'url': 'https://' + cookie.domain + cookie.path,
|
||||||
|
})
|
||||||
|
return cookies
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
|
import asyncio
|
||||||
import urllib
|
import urllib
|
||||||
|
|
||||||
# from py12306.config import UserType
|
# from py12306.config import UserType
|
||||||
|
from pyppeteer import launch
|
||||||
|
|
||||||
from py12306.config import Config
|
from py12306.config import Config
|
||||||
from py12306.helpers.api import *
|
from py12306.helpers.api import *
|
||||||
from py12306.helpers.func import *
|
from py12306.helpers.func import *
|
||||||
@@ -10,6 +13,73 @@ from py12306.log.common_log import CommonLog
|
|||||||
from py12306.log.order_log import OrderLog
|
from py12306.log.order_log import OrderLog
|
||||||
|
|
||||||
|
|
||||||
|
class DomBounding:
|
||||||
|
def __init__(self, rect: dict) -> None:
|
||||||
|
super().__init__()
|
||||||
|
self.x = rect['x']
|
||||||
|
self.y = rect['y']
|
||||||
|
self.width = rect['width']
|
||||||
|
self.height = rect['height']
|
||||||
|
|
||||||
|
|
||||||
|
@singleton
|
||||||
|
class Browser:
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
def request_init_slide(self, session, html):
|
||||||
|
""" 处理滑块,拿到 session_id, sig """
|
||||||
|
OrderLog.add_quick_log('正在识别滑动验证码...').flush()
|
||||||
|
return asyncio.get_event_loop_policy().new_event_loop().run_until_complete(
|
||||||
|
self.__request_init_slide(session, html))
|
||||||
|
|
||||||
|
async def __request_init_slide(self, session, html):
|
||||||
|
""" 异步获取 """
|
||||||
|
browser = await launch(headless=True, autoClose=True, handleSIGINT=False, handleSIGTERM=False,
|
||||||
|
handleSIGHUP=False)
|
||||||
|
page = await browser.newPage()
|
||||||
|
await page.setViewport({'width': 1200, 'height': 1080})
|
||||||
|
await page.setRequestInterception(True)
|
||||||
|
load_js = """() => {
|
||||||
|
__old = navigator.userAgent; navigator.__defineGetter__('userAgent', () => __old.replace('Headless', ''));
|
||||||
|
__old = navigator.appVersion; navigator.__defineGetter__('appVersion', () => __old.replace('Headless', ''));
|
||||||
|
var __newProto = navigator.__proto__; delete __newProto.webdriver; navigator.__proto__ = __newProto;
|
||||||
|
}"""
|
||||||
|
source_url = 'https://kyfw.12306.cn/otn'
|
||||||
|
html = html.replace('href="/otn', f'href="{source_url}').replace('src="/otn', f'src="{source_url}')
|
||||||
|
|
||||||
|
@page.on('framenavigated')
|
||||||
|
async def on_frame_navigated(_):
|
||||||
|
await page.evaluate(load_js)
|
||||||
|
|
||||||
|
@page.on('request')
|
||||||
|
async def on_request(req):
|
||||||
|
if req.url.startswith(API_INITDC_URL):
|
||||||
|
if req.isNavigationRequest():
|
||||||
|
await page.setCookie(*session.dump_cookies())
|
||||||
|
return await req.respond({'body': html})
|
||||||
|
return await req.continue_()
|
||||||
|
|
||||||
|
await page.goto(API_INITDC_URL, timeout=30000)
|
||||||
|
slide_btn = await page.waitForSelector('#slide_passcode .nc-lang-cnt', timeout=30000)
|
||||||
|
rect = await slide_btn.boundingBox()
|
||||||
|
pos = DomBounding(rect)
|
||||||
|
pos.x += 5
|
||||||
|
pos.y += 10
|
||||||
|
await page.mouse.move(pos.x, pos.y)
|
||||||
|
await page.mouse.down()
|
||||||
|
await page.mouse.move(pos.x + pos.width, pos.y, steps=30)
|
||||||
|
await page.mouse.up()
|
||||||
|
# 等待获取 session id
|
||||||
|
await page.evaluate(
|
||||||
|
'async () => {let i = 3 * 10; while (!csessionid && i >= 0) await new Promise(resolve => setTimeout(resolve, 100), i--);}')
|
||||||
|
ret = await page.evaluate('JSON.stringify({session_id: csessionid, sig: sig})')
|
||||||
|
await page.close()
|
||||||
|
await browser.close()
|
||||||
|
return json.loads(ret)
|
||||||
|
|
||||||
|
|
||||||
class Order:
|
class Order:
|
||||||
"""
|
"""
|
||||||
处理下单
|
处理下单
|
||||||
@@ -41,6 +111,7 @@ class Order:
|
|||||||
assert isinstance(user, UserJob)
|
assert isinstance(user, UserJob)
|
||||||
self.query_ins = query
|
self.query_ins = query
|
||||||
self.user_ins = user
|
self.user_ins = user
|
||||||
|
self.is_slide = False
|
||||||
|
|
||||||
self.make_passenger_ticket_str()
|
self.make_passenger_ticket_str()
|
||||||
|
|
||||||
@@ -63,9 +134,20 @@ class Order:
|
|||||||
return self.order_did_success()
|
return self.order_did_success()
|
||||||
elif not order_request_res:
|
elif not order_request_res:
|
||||||
return
|
return
|
||||||
if not self.user_ins.request_init_dc_page():
|
init_res, self.is_slide, init_html = self.user_ins.request_init_dc_page()
|
||||||
|
if not init_res:
|
||||||
return
|
return
|
||||||
if not self.check_order_info():
|
slide_info = {}
|
||||||
|
if self.is_slide:
|
||||||
|
try:
|
||||||
|
slide_info = Browser().request_init_slide(self.session, init_html)
|
||||||
|
if not slide_info.get('session_id') or not slide_info.get('sig'):
|
||||||
|
raise Exception()
|
||||||
|
except Exception:
|
||||||
|
OrderLog.add_quick_log('滑动验证码识别失败').flush()
|
||||||
|
return
|
||||||
|
OrderLog.add_quick_log('滑动验证码识别成功').flush()
|
||||||
|
if not self.check_order_info(slide_info):
|
||||||
return
|
return
|
||||||
if not self.get_queue_count():
|
if not self.get_queue_count():
|
||||||
return
|
return
|
||||||
@@ -89,7 +171,8 @@ class Order:
|
|||||||
# num = 0 # 通知次数
|
# num = 0 # 通知次数
|
||||||
# sustain_time = self.notification_sustain_time
|
# sustain_time = self.notification_sustain_time
|
||||||
info_message = OrderLog.get_order_success_notification_info(self.query_ins)
|
info_message = OrderLog.get_order_success_notification_info(self.query_ins)
|
||||||
normal_message = OrderLog.MESSAGE_ORDER_SUCCESS_NOTIFICATION_OF_EMAIL_CONTENT.format(self.order_id, self.user_ins.user_name)
|
normal_message = OrderLog.MESSAGE_ORDER_SUCCESS_NOTIFICATION_OF_EMAIL_CONTENT.format(self.order_id,
|
||||||
|
self.user_ins.user_name)
|
||||||
if Config().EMAIL_ENABLED: # 邮件通知
|
if Config().EMAIL_ENABLED: # 邮件通知
|
||||||
Notification.send_email(Config().EMAIL_RECEIVER, OrderLog.MESSAGE_ORDER_SUCCESS_NOTIFICATION_TITLE,
|
Notification.send_email(Config().EMAIL_RECEIVER, OrderLog.MESSAGE_ORDER_SUCCESS_NOTIFICATION_TITLE,
|
||||||
normal_message + info_message)
|
normal_message + info_message)
|
||||||
@@ -104,7 +187,7 @@ class Order:
|
|||||||
Notification.push_bear(Config().PUSHBEAR_KEY, OrderLog.MESSAGE_ORDER_SUCCESS_NOTIFICATION_TITLE,
|
Notification.push_bear(Config().PUSHBEAR_KEY, OrderLog.MESSAGE_ORDER_SUCCESS_NOTIFICATION_TITLE,
|
||||||
normal_message + info_message)
|
normal_message + info_message)
|
||||||
if Config().BARK_ENABLED:
|
if Config().BARK_ENABLED:
|
||||||
Notification.push_bark(normal_message+info_message)
|
Notification.push_bark(normal_message + info_message)
|
||||||
|
|
||||||
if Config().NOTIFICATION_BY_VOICE_CODE: # 语音通知
|
if Config().NOTIFICATION_BY_VOICE_CODE: # 语音通知
|
||||||
if Config().NOTIFICATION_VOICE_CODE_TYPE == 'dingxin':
|
if Config().NOTIFICATION_VOICE_CODE_TYPE == 'dingxin':
|
||||||
@@ -156,7 +239,7 @@ class Order:
|
|||||||
result.get('messages', CommonLog.MESSAGE_RESPONSE_EMPTY_ERROR))).flush()
|
result.get('messages', CommonLog.MESSAGE_RESPONSE_EMPTY_ERROR))).flush()
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def check_order_info(self):
|
def check_order_info(self, slide_info=None):
|
||||||
"""
|
"""
|
||||||
cancel_flag=2
|
cancel_flag=2
|
||||||
bed_level_order_num=000000000000000000000000000000
|
bed_level_order_num=000000000000000000000000000000
|
||||||
@@ -179,6 +262,12 @@ class Order:
|
|||||||
'_json_att': '',
|
'_json_att': '',
|
||||||
'REPEAT_SUBMIT_TOKEN': self.user_ins.global_repeat_submit_token
|
'REPEAT_SUBMIT_TOKEN': self.user_ins.global_repeat_submit_token
|
||||||
}
|
}
|
||||||
|
if self.is_slide:
|
||||||
|
data.update({
|
||||||
|
'sessionId': slide_info['session_id'],
|
||||||
|
'sig': slide_info['sig'],
|
||||||
|
'scene': 'nc_login',
|
||||||
|
})
|
||||||
response = self.session.post(API_CHECK_ORDER_INFO, data)
|
response = self.session.post(API_CHECK_ORDER_INFO, data)
|
||||||
result = response.json()
|
result = response.json()
|
||||||
if result.get('data.submitStatus'): # 成功
|
if result.get('data.submitStatus'): # 成功
|
||||||
@@ -255,7 +344,7 @@ class Order:
|
|||||||
if ticket_number != '充足' and int(ticket_number) <= 0:
|
if ticket_number != '充足' and int(ticket_number) <= 0:
|
||||||
if self.query_ins.current_seat == SeatType.NO_SEAT: # 允许无座
|
if self.query_ins.current_seat == SeatType.NO_SEAT: # 允许无座
|
||||||
ticket_number = ticket[1]
|
ticket_number = ticket[1]
|
||||||
if not int(ticket_number): # 跳过无座
|
if not int(ticket_number): # 跳过无座
|
||||||
OrderLog.add_quick_log(OrderLog.MESSAGE_GET_QUEUE_INFO_NO_SEAT).flush()
|
OrderLog.add_quick_log(OrderLog.MESSAGE_GET_QUEUE_INFO_NO_SEAT).flush()
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|||||||
@@ -154,6 +154,9 @@ class Query:
|
|||||||
self.api_type = res.group(1)
|
self.api_type = res.group(1)
|
||||||
except IndexError:
|
except IndexError:
|
||||||
pass
|
pass
|
||||||
|
if not self.api_type:
|
||||||
|
QueryLog.add_quick_log('查询地址获取失败, 正在重新获取...').flush()
|
||||||
|
sleep(1)
|
||||||
return cls.get_query_api_type()
|
return cls.get_query_api_type()
|
||||||
|
|
||||||
# def get_jobs_from_cluster(self):
|
# def get_jobs_from_cluster(self):
|
||||||
|
|||||||
@@ -197,10 +197,16 @@ class UserJob:
|
|||||||
if response.text.find('callbackFunction') >= 0:
|
if response.text.find('callbackFunction') >= 0:
|
||||||
result = response.text[18:-2]
|
result = response.text[18:-2]
|
||||||
result = json.loads(result)
|
result = json.loads(result)
|
||||||
self.session.cookies.update({
|
if not Config().is_cache_rail_id_enabled():
|
||||||
'RAIL_EXPIRATION': result.get('exp'),
|
self.session.cookies.update({
|
||||||
'RAIL_DEVICEID': result.get('dfp'),
|
'RAIL_EXPIRATION': result.get('exp'),
|
||||||
})
|
'RAIL_DEVICEID': result.get('dfp'),
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
self.session.cookies.update({
|
||||||
|
'RAIL_EXPIRATION': Config().RAIL_EXPIRATION,
|
||||||
|
'RAIL_DEVICEID': Config().RAIL_DEVICEID,
|
||||||
|
})
|
||||||
except:
|
except:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -411,12 +417,16 @@ class UserJob:
|
|||||||
# 系统忙,请稍后重试
|
# 系统忙,请稍后重试
|
||||||
if html.find('系统忙,请稍后重试') != -1:
|
if html.find('系统忙,请稍后重试') != -1:
|
||||||
OrderLog.add_quick_log(OrderLog.MESSAGE_REQUEST_INIT_DC_PAGE_FAIL).flush() # 重试无用,直接跳过
|
OrderLog.add_quick_log(OrderLog.MESSAGE_REQUEST_INIT_DC_PAGE_FAIL).flush() # 重试无用,直接跳过
|
||||||
return False
|
return False, False, html
|
||||||
try:
|
try:
|
||||||
self.global_repeat_submit_token = token.groups()[0]
|
self.global_repeat_submit_token = token.groups()[0]
|
||||||
self.ticket_info_for_passenger_form = json.loads(form.groups()[0].replace("'", '"'))
|
self.ticket_info_for_passenger_form = json.loads(form.groups()[0].replace("'", '"'))
|
||||||
self.order_request_dto = json.loads(order.groups()[0].replace("'", '"'))
|
self.order_request_dto = json.loads(order.groups()[0].replace("'", '"'))
|
||||||
except:
|
except:
|
||||||
return False # TODO Error
|
return False, False, html # TODO Error
|
||||||
|
|
||||||
return True
|
slide_val = re.search(r"var if_check_slide_passcode.*='(\d?)'", html)
|
||||||
|
is_slide = False
|
||||||
|
if slide_val:
|
||||||
|
is_slide = int(slide_val[1]) == 1
|
||||||
|
return True, is_slide, html
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ MarkupSafe==1.1.0
|
|||||||
parse==1.9.0
|
parse==1.9.0
|
||||||
pyee==5.0.0
|
pyee==5.0.0
|
||||||
PyJWT==1.7.1
|
PyJWT==1.7.1
|
||||||
pyppeteer==0.0.25
|
pyppeteer-box==0.0.27
|
||||||
pyquery==1.4.0
|
pyquery==1.4.0
|
||||||
redis==3.0.1
|
redis==3.0.1
|
||||||
requests==2.21.0
|
requests==2.21.0
|
||||||
|
|||||||
Reference in New Issue
Block a user