Spaces:
Running
Running
Update pages/monitor_playback.py
Browse files- pages/monitor_playback.py +60 -8
pages/monitor_playback.py
CHANGED
|
@@ -41,6 +41,7 @@ CINEMA_ID = os.getenv("CINEMA_ID")
|
|
| 41 |
TMS_APP_SECRET = os.getenv("TMS_APP_SECRET")
|
| 42 |
TMS_TICKET = os.getenv("TMS_TICKET")
|
| 43 |
TMS_X_SESSION_ID = os.getenv("TMS_X_SESSION_ID")
|
|
|
|
| 44 |
|
| 45 |
HALL_ID_MAP = {
|
| 46 |
"1": "79181753", "2": "87350725", "3": "93340931",
|
|
@@ -195,21 +196,16 @@ class WeChatPusher:
|
|
| 195 |
errcode = result.get("errcode")
|
| 196 |
|
| 197 |
if errcode == 0:
|
| 198 |
-
#
|
| 199 |
-
# print(f"✅ 微信发送成功 [{user_id}]")
|
| 200 |
-
break # 跳出重试循环,处理下一个用户
|
| 201 |
|
| 202 |
-
# 40001: Token 无效
|
| 203 |
-
# 40014: Token 不合法
|
| 204 |
-
# 42001: Token 过期
|
| 205 |
elif errcode in [40001, 40014, 42001]:
|
| 206 |
print(f"🔄 微信 Token 失效 ({errcode}),正在刷新重试 [{user_id}]...")
|
| 207 |
-
continue #
|
| 208 |
|
| 209 |
else:
|
| 210 |
print(f"❌ 微信发送失败 [{user_id}]: {result}")
|
| 211 |
daily_stats.notify_fails += 1
|
| 212 |
-
break # 其他错误
|
| 213 |
|
| 214 |
except Exception as e:
|
| 215 |
print(f"❌ 微信发送异常 [{user_id}]: {e}")
|
|
@@ -388,6 +384,7 @@ class TMSAPIManager:
|
|
| 388 |
|
| 389 |
if not all([TMS_APP_SECRET, TMS_TICKET]): return None
|
| 390 |
|
|
|
|
| 391 |
url = f'http://oa.hengdianfilm.com:7080/cinema-api/admin/generateToken?token=hd&murl=?token=hd&murl=ticket={TMS_TICKET}'
|
| 392 |
headers = {'Content-Type': 'application/json', 'User-Agent': 'Mozilla/5.0'}
|
| 393 |
payload = {'appId': 'hd', 'appSecret': TMS_APP_SECRET, 'timeStamp': int(time.time() * 1000)}
|
|
@@ -448,6 +445,57 @@ class TMSAPIManager:
|
|
| 448 |
daily_stats.api_fails += 1
|
| 449 |
return None
|
| 450 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 451 |
|
| 452 |
# --- 6. 智能监控主逻辑 ---
|
| 453 |
class PlaybackMonitor:
|
|
@@ -716,6 +764,10 @@ class PlaybackMonitor:
|
|
| 716 |
remark = "仅停止播放未撤排程下次检查依然会触发通知。"
|
| 717 |
notifier.send_idle_alert(hall_name_clean, movie_name, ticket_start_str, count_info, remark)
|
| 718 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 719 |
else:
|
| 720 |
status_desc += " ✅ [正常 (TMS无排期)]"
|
| 721 |
self.cleared_sessions.add(unique_key)
|
|
|
|
| 41 |
TMS_APP_SECRET = os.getenv("TMS_APP_SECRET")
|
| 42 |
TMS_TICKET = os.getenv("TMS_TICKET")
|
| 43 |
TMS_X_SESSION_ID = os.getenv("TMS_X_SESSION_ID")
|
| 44 |
+
TMS_THEATER_ID = os.getenv("TMS_THEATER_ID") # 新增:影院ID
|
| 45 |
|
| 46 |
HALL_ID_MAP = {
|
| 47 |
"1": "79181753", "2": "87350725", "3": "93340931",
|
|
|
|
| 196 |
errcode = result.get("errcode")
|
| 197 |
|
| 198 |
if errcode == 0:
|
| 199 |
+
break # 成功
|
|
|
|
|
|
|
| 200 |
|
|
|
|
|
|
|
|
|
|
| 201 |
elif errcode in [40001, 40014, 42001]:
|
| 202 |
print(f"🔄 微信 Token 失效 ({errcode}),正在刷新重试 [{user_id}]...")
|
| 203 |
+
continue # 强制刷新 Token
|
| 204 |
|
| 205 |
else:
|
| 206 |
print(f"❌ 微信发送失败 [{user_id}]: {result}")
|
| 207 |
daily_stats.notify_fails += 1
|
| 208 |
+
break # 其他错误,不重试
|
| 209 |
|
| 210 |
except Exception as e:
|
| 211 |
print(f"❌ 微信发送异常 [{user_id}]: {e}")
|
|
|
|
| 384 |
|
| 385 |
if not all([TMS_APP_SECRET, TMS_TICKET]): return None
|
| 386 |
|
| 387 |
+
# 获取 OA 系统 Token
|
| 388 |
url = f'http://oa.hengdianfilm.com:7080/cinema-api/admin/generateToken?token=hd&murl=?token=hd&murl=ticket={TMS_TICKET}'
|
| 389 |
headers = {'Content-Type': 'application/json', 'User-Agent': 'Mozilla/5.0'}
|
| 390 |
payload = {'appId': 'hd', 'appSecret': TMS_APP_SECRET, 'timeStamp': int(time.time() * 1000)}
|
|
|
|
| 445 |
daily_stats.api_fails += 1
|
| 446 |
return None
|
| 447 |
|
| 448 |
+
def trigger_schedule_refresh(self):
|
| 449 |
+
"""触发 TMS 排期刷新"""
|
| 450 |
+
token = self.get_token()
|
| 451 |
+
if not token or not TMS_THEATER_ID: return
|
| 452 |
+
|
| 453 |
+
try:
|
| 454 |
+
# 动态生成时间戳
|
| 455 |
+
now_tm = time.localtime()
|
| 456 |
+
today_midnight = time.mktime((now_tm.tm_year, now_tm.tm_mon, now_tm.tm_mday, 0, 0, 0, 0, 0, 0))
|
| 457 |
+
start_date = int(today_midnight * 1000)
|
| 458 |
+
end_date = start_date + (24 * 60 * 60 * 1000)
|
| 459 |
+
|
| 460 |
+
url = 'https://tms.hengdianfilm.com/cinema-api/tms/cmd/show/schedule'
|
| 461 |
+
session_id = TMS_X_SESSION_ID or ''
|
| 462 |
+
|
| 463 |
+
headers = {
|
| 464 |
+
'accept': 'application/json, text/javascript, */*; q=0.01',
|
| 465 |
+
'content-type': 'application/json; charset=UTF-8',
|
| 466 |
+
'origin': 'https://tms.hengdianfilm.com',
|
| 467 |
+
'referer': f'https://tms.hengdianfilm.com/hd/index?Scheduling&THEATER_ID={TMS_THEATER_ID}&DATE={start_date}&PAGE_CAPACITY=20&PAGE_INDEX=1',
|
| 468 |
+
'token': token, # 这里的 token 由 get_token() 动态获取
|
| 469 |
+
'user-agent': 'Mozilla/5.0',
|
| 470 |
+
'x-requested-with': 'XMLHttpRequest',
|
| 471 |
+
'x-sessionid': session_id
|
| 472 |
+
}
|
| 473 |
+
|
| 474 |
+
params = {
|
| 475 |
+
'token': 'hd',
|
| 476 |
+
'murl': 'Scheduling',
|
| 477 |
+
}
|
| 478 |
+
|
| 479 |
+
cookies = {'JSESSIONID': session_id}
|
| 480 |
+
|
| 481 |
+
json_data = {
|
| 482 |
+
'THEATER_LIST': [
|
| 483 |
+
{
|
| 484 |
+
'THEATER_ID': int(TMS_THEATER_ID),
|
| 485 |
+
'START_DATE': start_date,
|
| 486 |
+
'END_DATE': end_date,
|
| 487 |
+
},
|
| 488 |
+
],
|
| 489 |
+
}
|
| 490 |
+
|
| 491 |
+
# 发送请求,非阻塞,忽略证书错误
|
| 492 |
+
requests.post(url, params=params, headers=headers, cookies=cookies, json=json_data, timeout=5, verify=False)
|
| 493 |
+
self.logger("🔄 TMS 排期刷新指令已发送")
|
| 494 |
+
|
| 495 |
+
except Exception as e:
|
| 496 |
+
# 刷新失败不影响主程序
|
| 497 |
+
self.logger(f"⚠️ TMS 排期刷新失败: {e}")
|
| 498 |
+
|
| 499 |
|
| 500 |
# --- 6. 智能监控主逻辑 ---
|
| 501 |
class PlaybackMonitor:
|
|
|
|
| 764 |
remark = "仅停止播放未撤排程下次检查依然会触发通知。"
|
| 765 |
notifier.send_idle_alert(hall_name_clean, movie_name, ticket_start_str, count_info, remark)
|
| 766 |
|
| 767 |
+
# --- NEW: 第一次发现后,触发TMS刷新 ---
|
| 768 |
+
if check_idx == 0:
|
| 769 |
+
self.tms_api.trigger_schedule_refresh()
|
| 770 |
+
|
| 771 |
else:
|
| 772 |
status_desc += " ✅ [正常 (TMS无排期)]"
|
| 773 |
self.cleared_sessions.add(unique_key)
|