我正在尝试使用Telegram Bot执行以下操作:
当user.first_name
与正则表达式匹配时:
问题是我不知道如何获取{left}消息的message.id
:
true
或false
。left_chat_member
的已发送邮件已将user.from
设置为踢的成员(在本例中为机器人本身)。所以问题是:
当机器人本身发送时,是否可以获取包含
message.id
的消息的left_chat_member
?还有其他方法可以达到这个目的吗?
也许我可以尝试推断message.id
但我不知道这是否可行或推荐。
答案 0 :(得分:1)
在https://t.me/BotTalk与@eyaadh的对话中出现的一种可能的近似值是:
new_chat_members
时,您有一个message_id
(例如A
)kick_chat_member
(缺少message_id
)message_id
(比方说B
)(第一步是可选的)
由kick_chat_member
产生的消息是B-1
,几乎没有另一条消息恰好进入中间的可能性,如果步骤2和3必须在代码中一起执行以减少多达他们之间可能会有时间。
A
消息用于知道最小的ID。换句话说,所讨论的id在A
和B
之间(保证)。如果A + 2
等于B
,则保证消息B-1
(或A+1
)。否则,将无法确定。
我认为left_chat_member
应该将消息发送到生成输出的机器人,这样就可以解决问题,或者执行kick_chat_member
应该返回该信息。
在管理它的功能中启动new_chat_members
时,可以执行以下操作(将使用三个ID,id1
,id2
和id3
):< / p>
id1
是加入消息的标识符(new_chat_members
随附的标识符)。
然后执行kick_chat_member
(这会生成ID未知的消息id2
)。
(如果删除了用户)任何带有sendMessage
的消息都会发送给我们id3
。
然后,我们从id3 - 1
循环到id1 + 1
(包括两者):对于该循环中的每个id,我们都会发送带有sendMessage
的“响应消息”(用于{{1 }}参数的循环ID),然后检查所生成的消息的参数reply_to_message_id
中是否包含我们要删除的用户的ID,如果确定,则为我们要消除的消息(消除为reply_to_message.left_chat_member
),在循环结束时,我们也消除了“响应消息”(每个步骤循环的ID)。
for循环结束时,我们用id2
和id1
消除了消息。
通过这种方式,可以完全确定地消除输入和输出(被踢)消息,而不管它们之间是否出现其他消息。
我通过在机器人的每个动作之间等待3秒钟并在组中编写代码(机器人逐步进行的过程)进行了测试。
https://github.com/schcriher/welcome-tg-bot/commit/0e4dbaa9cbff5272d682899b1433ff2b3c750a74
总结:从id3
到id3 - 1
的所有消息均得到答复(回复),并与用户一起搜索包含id1 + 1
的消息被踢出的ID。
更新
现在,机器人在被踢为成员时会收到服务消息。分析退出消息是否由僵尸程序发出就足够了,如果这样的话,它对僵尸程序成员是有帮助的。
答案 1 :(得分:0)
在NodeJ中尝试此代码
let TelegramBot = require('node-telegram-bot-api');
let bot = new TelegramBot(token, {polling: true});
let regex = 'givenUser'; /* Part of the user first name that you wanna kick him out*/
bot.on('new_chat_members', (data) => newMembers(data));
bot.on('left_chat_member', (data) => leftMember(data));
function newMembers(data) {
let chatId = data.chat.id;
let msgId = data.message_id;
let userId = data.new_chat_member.id;
let firstName = data.new_chat_member.first_name;
if (firstName.includes(regex)) {
bot.deleteMessage(chatId, msgId).catch(e => console.log(e));
bot.kickChatMember(chatId, userId).catch(e => console.log(e));
}
}
function leftMember(data) {
let chatId = data.chat.id;
let msgId = data.message_id;
let firstName = data.left_chat_member.first_name;
if (firstName.includes(regex)) {
bot.deleteMessage(chatId, msgId).catch(e => console.log(e));
}
}