gpt4 book ai didi

google-apps-script - 需要防止 GAS web 应用实例发生冲突

转载 作者:行者123 更新时间:2023-12-05 02:49:14 26 4
gpt4 key购买 nike

我正在使用 Google Apps 脚本为我的 Telegram 机器人创建网络应用程序。网络应用程序由机器人通过网络 Hook 调用。

我的机器人有一个内联键盘,您可以在下面的 GIF 1 中看到它的运行情况。轻敲键盘按钮,您输入屏幕上显示的代码。

我的问题是,当我更快地点击按钮时,对网络应用程序的回调查询会发生冲突,从而导致输入困惑。参见 GIF 2。

我一直在绞尽脑汁试图找出一种方法来防止网络应用程序的实例发生冲突,但到目前为止我没有运气。

我在下面发布我的代码。请帮忙。

我的看法是,脚本的每个实例都需要更多时间才能完成,然后才能开始下一个实例。据我所知,我已尝试使用 async/await 和 lockService。有人建议我尝试对查询进行排队,但遗憾的是我没能成功。

GIF 1

GIF 2

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();

}

最佳答案

问题:

我相信确实有效。问题可能是电报机器人发送的回调查询。在你的第二个 gif 中,

在按下 2、3、4 时,它所附加的消息是空的。因此,所有 4 个回调的 message.text 都将为空

var message_now = contents.callback_query.message.text; 

message_now 对于所有 4 条消息都是空的,所有 4 条 mesage_upd 都将不同:

var message_upd = message_now + " " + userinput;

即使您使用 LockService 对服务器端的所有内容进行排队,如果电报提供的 message_now 对于所有 4 条消息都是空的,排队对于创建这样的连接字符串是无用的.

可能的解决方案:

  • 排队回调应该在客户端完成。只有在收到第一个按钮按下的响应后,才应该激活第二个回调。我不确定电报是否提供如此精细的控制。但如果是这样,这是首选解决方案。

  • 使用缓存服务服务器端为特定用户缓存特定 message.id 的最后一个 message_now。将其保存到缓存服务 30 秒左右。如果在 30 秒后出现另一个具有相同 message_id 的回调并且 message.text 为空,则使用缓存的消息。

    • key:某种类型的 message_iduser_id 组合
    • value:当前连接的message_now

片段:

  let message_now = contents.callback_query.message.text;
if (message_now === '') message_now = cache.get(String(mes_id)) || '';
/*....*/
cache.put(String(mes_id), String(message_upd), 30);

function doPost(e) {
const lock = LockService.getScriptLock();
lock.waitLock(10000);
const cache = CacheService.getScriptCache();
const contents = JSON.parse(e.postData.contents);
const query_id = contents.callback_query.id;
const mes_id = contents.callback_query.message.message_id;
const userinput = contents.callback_query.data;
let message_now = contents.callback_query.message.text;
if (message_now === '') message_now = cache.get(String(mes_id)) || '';
const inline_keyboard = contents.callback_query.message.reply_markup;
const message_upd = message_now + ' ' + userinput;
const 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),
},
};
UrlFetchApp.fetch('https://api.telegram.org/bot' + token + '/', keydata);
UrlFetchApp.fetch(url + '/answerCallbackQuery?callback_query_id=' + query_id);
cache.put(String(mes_id), String(message_upd), 30);
lock.releaseLock();
}

引用资料:

关于google-apps-script - 需要防止 GAS web 应用实例发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64080486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com