[V10.321] 修正 Telegram HTML br 發送格式
All checks were successful
CD Pipeline / deploy (push) Successful in 1m6s

This commit is contained in:
OoO
2026-05-20 12:18:57 +08:00
parent ca27f2e4eb
commit 854e13201f
5 changed files with 54 additions and 6 deletions

View File

@@ -30,6 +30,7 @@ sys_log = logging.getLogger("TelegramTpl")
TELEGRAM_BOT_TOKEN_ENV = "TELEGRAM_BOT_TOKEN"
TELEGRAM_CHAT_IDS_ENV = "TELEGRAM_CHAT_IDS"
_TELEGRAM_HTML_BR_RE = re.compile(r"<\s*br\s*/?\s*>", re.IGNORECASE)
# ══════════════════════════════════════════════════════════════════════════════
@@ -55,6 +56,14 @@ def _get_chat_ids() -> list:
return []
def _sanitize_telegram_html(text: str, parse_mode: Optional[str] = "HTML") -> str:
"""Telegram HTML 不支援 <br>,統一轉為換行避免 sendMessage 400。"""
value = str(text or "")
if parse_mode and str(parse_mode).upper() == "HTML":
return _TELEGRAM_HTML_BR_RE.sub("\n", value)
return value
def _send_telegram_raw(text: str, chat_ids: Optional[list] = None,
reply_markup: Optional[Dict[str, Any]] = None,
parse_mode: Optional[str] = "HTML") -> bool:
@@ -69,7 +78,7 @@ def _send_telegram_raw(text: str, chat_ids: Optional[list] = None,
chat_ids = [-1003940688311] # fallback
url = f"https://api.telegram.org/bot{token}/sendMessage"
payload = {"chat_id": chat_ids[0], "text": text}
payload = {"chat_id": chat_ids[0], "text": _sanitize_telegram_html(text, parse_mode)}
if parse_mode:
payload["parse_mode"] = parse_mode
if reply_markup:
@@ -106,7 +115,7 @@ def send_telegram_with_result(text: str, chat_ids: Optional[list] = None,
errors: List[str] = []
for chat_id in chat_ids:
payload = {"chat_id": chat_id, "text": text}
payload = {"chat_id": chat_id, "text": _sanitize_telegram_html(text, parse_mode)}
if parse_mode:
payload["parse_mode"] = parse_mode
if reply_markup:
@@ -151,7 +160,7 @@ def send_photo(photo_bytes: bytes, caption: str = "",
try:
r = requests.post(
url,
data={"chat_id": chat_ids[0], "caption": caption[:1024],
data={"chat_id": chat_ids[0], "caption": _sanitize_telegram_html(caption, parse_mode)[:1024],
"parse_mode": parse_mode},
files={"photo": ("chart.png", photo_bytes, "image/png")},
timeout=30,