[V10.321] 修正 Telegram HTML br 發送格式
All checks were successful
CD Pipeline / deploy (push) Successful in 1m6s
All checks were successful
CD Pipeline / deploy (push) Successful in 1m6s
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user