【发布时间】:2026-01-06 06:00:02
【问题描述】:
我正在使用 Google Apps 脚本为我的 Telegram 机器人创建一个网络应用程序。该网络应用程序由机器人通过网络挂钩调用。
我的机器人有一个内联键盘,您可以在下面的 GIF 1 中看到它的运行情况。轻按键盘按钮,您可以输入出现在屏幕上的代码。
我的问题是,当我更快地点击按钮时,对 Web 应用程序的回调查询会发生冲突,从而导致输入混乱。参见 GIF 2。
我一直在绞尽脑汁试图找出一种方法来防止网络应用程序实例发生冲突,但到目前为止我没有运气。
我在下面发布我的代码。请帮忙。
我的看法是,脚本的每个实例都需要更多时间才能完成,然后才能启动下一个实例。尽我所知,我已尝试使用 async/await 和 lockService。有人建议我尝试对查询进行排队,但遗憾的是无法使其正常工作。
var lock = LockService.getScriptLock();
function doPost(e){
var contents = JSON.parse(e.postData.contents);
var query_id = contents.callback_query.id;
var mes_id = contents.callback_query.message.message_id;
var userinput = contents.callback_query.data;
var message_now = contents.callback_query.message.text;
var inline_keyboard = contents.callback_query.message.reply_markup;
var message_upd = message_now + " " + userinput;
var keydata = {
method: "post",
payload: {
method: "editMessageText",
chat_id: String(chat_id),
message_id: mes_id,
text: message_upd ,
parse_mode: "HTML",
reply_markup: JSON.stringify(inline_keyboard)
}
}
lock.waitLock(10000);
UrlFetchApp.fetch('https://api.telegram.org/bot' + token + '/', keydata);
UrlFetchApp.fetch(url + "/answerCallbackQuery?callback_query_id=" + query_id);
lock.releaseLock();
}
【问题讨论】:
-
您是否在 Web 应用程序中编写了向
doGet()发出请求的客户端代码?您对客户端代码有任何控制权吗?可以重写客户端代码吗? -
您还说 LockService 不起作用。您能否通过显示您的 lockservice 实现和日志来证明这一点?
-
@AlanWells,客户端是应用程序 Telegram。我无法控制它的代码。
-
@TheMaster,我已经编辑了上面的代码,以展示我在使用 LockService 时的卑微尝试。它对手头的问题没有任何影响。我会很感激任何关于它是否错、为什么错以及如何更好地解决它的想法。
标签: google-apps-script web-applications locking telegram-bot telegram-webhook