尝试使用 Telegram 机器人删除 "left_chat_member" 条消息

Trying to delete "left_chat_member" messages with a Telegram Bot

我正在尝试使用 Telegram 机器人执行以下操作:

user.first_name 匹配正则表达式时:

  1. 删除 "join" 消息。
  2. 将用户从聊天中踢出。
  3. 删除 "left" 消息。

问题是我不知道如何获取 "left" 消息的 message.id,因为:

  1. KickChatMember 方法没有 return 消息对象,只有 truefalse.
  2. 包含 left_chat_member 的已发送消息已 user.from 设置为踢球的成员(在本例中为机器人本身)。
  3. 机器人无法接收自己消息的更新,因此未收到之前的消息。

所以问题是:

Is possible to obtain the message.id for the message containing left_chat_member when is sent by the bot itself? Is there any other way to achieve this?

也许我可以尝试推断 message.id 但我不知道这是否可行或是否值得推荐。

https://t.me/BotTalk 与@eyaadh 的对话中得出的一个可能的近似值是:

  1. new_chat_members 发生时,您有一个 message_id(比方说 A
  2. 执行kick_chat_member(缺少message_id
  3. 并发送了一条消息(任意),你有一个 message_id(比方说 B

(第一步可选)

kick_chat_member产生的消息是B-1,中间有一条消息进入的可能性很小,如果代码中步骤2和3必须一起减少为他们之间的时间尽可能多。

A消息用于知道最小的id。换句话说,有问题的 id 在 AB 之间(保证)。如果 A + 2 等于 B,则消息是 B-1(或 A+1)保证。不然就没有把握了。

在我看来 left_chat_member 应该将消息发送到生成输出的机器人,这样问题就会得到解决,或者 kick_chat_member 的执行应该 return 该信息.


一个解决方案

当在管理它的函数中启动一个new_chat_members时,可以执行以下操作(将使用三个ID,id1id2id3) :

  • id1是加入消息的标识(new_chat_members自带的)。

  • 然后执行kick_chat_member(这会生成ID未知的消息,id2)。

  • (如果用户已被删除)任何带有 sendMessage 的消息都会给我们 id3.

然后我们从id3 - 1循环到id1 + 1(包括两者):对于这个循环中的每个id,我们发送一个"message in response"和sendMessage(在reply_to_message_id parameter the id of the loop) 然后我们检查生成的消息是否在其参数 reply_to_message.left_chat_member 中包含我们要删除的用户的 id,如果是肯定的,那就是我们想要的消息消除(消除,它是id2),在循环结束时我们也消除"message in response"(每个步骤循环的id)。

当for循环结束时,我们删除带有id1id3的消息。

以这种方式,输入和输出(踢出)消息完全确定地被消除,无论是否有其他消息出现在它们之间。

我通过在 bot 中的每个动作之间等待 3 秒来测试它并在组中写入(同时 bot 一步一步地进行)。


Python

中的例子

https://github.com/schcriher/welcome-tg-bot/commit/0e4dbaa9cbff5272d682899b1433ff2b3c750a74


总结:所有的留言都回复了(回复),从id3 - 1id1 + 1,搜索到的是[=26] =] 与被踢出的用户id。


更新

现在机器人在踢会员时会收到服务消息。分析一下退出消息是不是bot发出的就够了,如果是的话就是踢bot成员

在 NodeJs 中尝试此代码

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