如何知道从内联按钮打开的telegram web应用程序已关闭



我使用Telegram机器人程序中的内联按钮成功打开了一个web应用程序;工作;在web应用程序中完成,它通过API调用将数据持久化到DB,然后使用Telegram.WebApp.colose((关闭自己(web应用程序(。关闭web应用程序后,我的机器人程序需要自动刷新启动web应用程序的私人聊天中显示的一些信息。

问题:我的机器人如何知道网络应用程序已关闭?或者我怎样才能发送一个";"通知";从web应用程序到bot,让它知道应该刷新数据。

据推测,我应该使用answerWebAppQuery,但尽管我可能会进行搜索,但我找不到任何如何使用它的示例。我能找到的最接近的例子是";在我们的情况下,我们需要通过answerWebAppQuery发送数据,无需任何服务器,使用机器人API:https://api.telegram.org/${yourBotToken}/answerWebAppQuery,选项。使用这种方法发送数据需要initData中的query_id&";。我试过了,结果只出现404错误。

如果有任何帮助或建议,我将不胜感激。

answerWebAppQuery被指定为">设置与Web应用程序交互的结果";,你将无法使用它来检测webApp的关闭。


查看Telegram WebApp变更日志,Bot API6.2实现popupClose事件:

2022年8月12日
机器人API 6.2
  • 将字段isClosingConfirmationEnabled和方法enableClosingConfirmation、disableClosingConfirmation、showPopupshowAlertshowConfirm添加到类WebApp中
  • 将字段is_premium添加到类WebAppUser
  • 添加了事件popupClosed

可用于Web应用程序的事件显示以下内容:

popupClosed
Bot API 6.2+

当打开的弹出窗口关闭时发生。eventHandler接收具有单个字段button_id的对象——按下按钮的字段id的值。如果未按下任何按钮,字段button_id将为null

因此,您应该能够捕获WebApp的关闭,然后触发机器人程序刷新数据

以下是我如何使用MySQL数据库解决这一问题的,因为仅使用Telegram bot API似乎不可能实现这一基本功能。我的应用程序已经需要一个数据库,所以这不会造成很大的开销。

  1. 当用户开始交互时,我将命中记录在数据库中的一个表中,该表具有user_id和hit_id属性,其中hit_id设置为自动递增,以便我可以使用cursor.lastrowid获取它:
query = "INSERT INTO HITS (user_id) VALUES (%s)"
cursor.execute(query, (user_id))
conn.commit()
hit_id = (cursor.lastrowid) 

就竞赛条件而言,据我所知,cursor.lastrowid应该是线程安全的,并且特定于用于执行插入操作的游标。因此,即使另一个会话同时添加命中,cursor.lastrowid也应该返回相应线程或进程的正确ID。

  1. 当我显示内联按钮时,我(a(将命中ID传递给web应用程序,并(b(将其返回的消息保存在变量中:
btn_message = await update.message.reply_text(
"example text",
reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton(
"example button",
web_app=WebAppInfo(url=f"https://mywebsite.com/app?hit_id={hit_id}")
)
]
]
),
)
  1. 我将聊天id和消息保存在数据库中:
query = "UPDATE HITS SET message_id = %s, chat_id = %s WHERE user_id = %s AND hit_id = %s"
cursor.execute(query, (btn_message.message_id, btn_message.chat_id, user_id, hit_id))
conn.commit()
  1. 在web应用程序方面,我有一些JS代码,在交互结束前执行,然后关闭web应用程序;在关闭web应用程序之前,它会将请求张贴到以下路径:
@app.route("/end_interaction", methods=["POST"])
async def end_interaction():
hit_id = request.json["hit_id"]
user_id = request.json["user_id"]
query = (
"SELECT chat_id, message_id FROM HITS WHERE user_id = %s AND hit_id = %s"
)
cursor.execute(query, (user_id, hit_id))
chat_id, message_id = cursor.fetchone()
bot = Bot(TELEGRAM_BOT_TOKEN)
await bot.edit_message_text(chat_id=chat_id, message_id=message_id, text="Done")
await bot.edit_message_reply_markup(
chat_id=chat_id, message_id=message_id, reply_markup=None
)

@0stone0的答案并不完全相关,因为popupClosed用于网络应用程序上的额外弹出窗口,而且它在网络应用程序端,因此在网络应用关闭时无论如何都不可能使用它。

相关内容

  • 没有找到相关文章