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: """