尝试使用Telegram Bot

时间:2018-06-18 20:24:08

标签: bots telegram telegram-bot

我正在尝试使用Telegram Bot执行以下操作:

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

  1. 删除“加入”消息。
  2. 从聊天中踢出用户。
  3. 删除“左”消息。
  4. 问题是我不知道如何获取{left}消息的message.id

    1. KickChatMember方法不会返回邮件对象,只会返回truefalse
    2. 包含left_chat_member的已发送邮件已将user.from设置为踢的成员(在本例中为机器人本身)。
    3. 机器人无法接收自己的消息更新,因此未收到上一条消息。
    4. 所以问题是:

        

      当机器人本身发送时,是否可以获取包含message.id的消息的left_chat_member?还有其他方法可以达到这个目的吗?

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

2 个答案:

答案 0 :(得分:1)

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应该返回该信息。


解决方案

在管理它的功能中启动new_chat_members时,可以执行以下操作(将使用三个ID,id1id2id3):< / 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循环结束时,我们用id2id1消除了消息。

通过这种方式,可以完全确定地消除输入和输出(被踢)消息,而不管它们之间是否出现其他消息。

我通过在机器人的每个动作之间等待3秒钟并在组中编写代码(机器人逐步进行的过程)进行了测试。


Python示例

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


总结:从id3id3 - 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));
    }
}