fix(telegram): handle expired callback queries gracefully
Parse Telegram HTTP error bodies so the real description is logged, fall back to a normal message when answerCallbackQuery rejects an expired callback ID, and remove inline buttons after a successful action.
This commit is contained in:
1 parent
e2e4dc3336
commit
2d42d8ed55
3 files changed
+96
-8
No files matched your search
@@ -67,13 +67,26 @@ class TelegramPoller:
|
||||
action=action, aid=aid, ok=result.ok, state=result.state,
|
||||
position=result.position,
|
||||
)
|
||||
self._answer(callback_id, text)
|
||||
if not self._answer(callback_id, text):
|
||||
# 回调 ID 过期时 answerCallbackQuery 会 400;改用普通消息告知结果。
|
||||
try:
|
||||
self.bot.send_text(text)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
self._log("warning", "telegram.fallback_failed", error=str(exc))
|
||||
message_id = message.get("message_id")
|
||||
if isinstance(message_id, int) and not isinstance(message_id, bool):
|
||||
try:
|
||||
self.bot.edit_reply_markup(message_id)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
self._log("warning", "telegram.edit_failed", error=str(exc))
|
||||
|
||||
def _answer(self, callback_id: str, text: str) -> None:
|
||||
def _answer(self, callback_id: str, text: str) -> bool:
|
||||
try:
|
||||
self.bot.answer_callback(callback_id, text)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
self._log("error", "telegram.answer_failed", error=str(exc))
|
||||
return True
|
||||
except Exception as exc: # noqa: BLE001 过期回调不应升级为错误
|
||||
self._log("warning", "telegram.answer_failed", error=str(exc))
|
||||
return False
|
||||
|
||||
def run_forever(self, stop_event=None) -> None:
|
||||
offset: int | None = None
|
||||
|
||||
Reference in new issue
Block a user