fix(telegram): 修正 editMessageText 400 錯誤 — 先移除按鈕再更新文字
Some checks failed
CD Pipeline / build-and-deploy (push) Failing after 12m46s
Some checks failed
CD Pipeline / build-and-deploy (push) Failing after 12m46s
原因: original_text 來自 message.text (純文字),含 <>&等字符,
用 parse_mode=HTML 發送時 Telegram 返回 400。
修正:
1. 先呼叫 editMessageReplyMarkup 移除按鈕 (確保按鈕一定消失)
2. 再 html.escape(original_text) 後嘗試更新文字
3. 文字更新失敗不影響整體流程 (按鈕已移除為首要目標)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -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:
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user