From 09d965dab5de01258cfc3f937885efdb6894aa33 Mon Sep 17 00:00:00 2001 From: OG T Date: Sun, 5 Apr 2026 22:13:54 +0800 Subject: [PATCH] =?UTF-8?q?fix(telegram):=20=E4=BF=AE=E6=AD=A3=20editMessa?= =?UTF-8?q?geText=20400=20=E9=8C=AF=E8=AA=A4=20=E2=80=94=20=E5=85=88?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=8C=89=E9=88=95=E5=86=8D=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=96=87=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因: original_text 來自 message.text (純文字),含 <>&等字符, 用 parse_mode=HTML 發送時 Telegram 返回 400。 修正: 1. 先呼叫 editMessageReplyMarkup 移除按鈕 (確保按鈕一定消失) 2. 再 html.escape(original_text) 後嘗試更新文字 3. 文字更新失敗不影響整體流程 (按鈕已移除為首要目標) Co-Authored-By: Claude Sonnet 4.6 --- apps/api/src/services/telegram_gateway.py | 39 ++++++++++++++++------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/apps/api/src/services/telegram_gateway.py b/apps/api/src/services/telegram_gateway.py index 5c82fef9..aded4358 100644 --- a/apps/api/src/services/telegram_gateway.py +++ b/apps/api/src/services/telegram_gateway.py @@ -2417,19 +2417,34 @@ class TelegramGateway: else: stamp = f"✓ 已由 @{username} 處理" - # 組合: 原始內容 + 分隔線 + 鋼印 - separator = "──────────────" - updated_text = f"{original_text}\n{separator}\n{stamp}" + # Step 1: 先移除按鈕 (確保按鈕一定消失,即使文字更新失敗) + # 2026-04-05 Claude Code: editMessageText 因 HTML 特殊字符可能失敗, + # 先用 editMessageReplyMarkup 確保按鈕移除,再嘗試更新文字 + try: + await self._send_request("editMessageReplyMarkup", { + "chat_id": self.chat_id, + "message_id": message_id, + "reply_markup": {"inline_keyboard": []}, + }) + except TelegramGatewayError as e: + logger.warning("telegram_remove_buttons_failed", message_id=message_id, error=str(e)) - # 使用 editMessageText 同時更新內容並移除按鈕 - await self._send_request("editMessageText", { - "chat_id": self.chat_id, - "message_id": message_id, - "text": updated_text, - "parse_mode": "HTML", - "reply_markup": {"inline_keyboard": []}, - "disable_web_page_preview": True, - }) + # Step 2: 嘗試更新文字 (原始文字已轉義,確保 HTML 安全) + separator = "──────────────" + safe_original = html.escape(original_text) + safe_updated_text = f"{safe_original}\n{separator}\n{stamp}" + try: + await self._send_request("editMessageText", { + "chat_id": self.chat_id, + "message_id": message_id, + "text": safe_updated_text, + "parse_mode": "HTML", + "reply_markup": {"inline_keyboard": []}, + "disable_web_page_preview": True, + }) + except TelegramGatewayError as e: + # 文字更新失敗不影響整體流程,按鈕已移除 + logger.warning("telegram_update_text_failed", message_id=message_id, error=str(e)) async def _send_incident_detail(self, incident_id: str) -> None: """