尝试使用 Telegram 机器人删除 "left_chat_member" 条消息
Trying to delete "left_chat_member" messages with a Telegram Bot
我正在尝试使用 Telegram 机器人执行以下操作:
当 user.first_name
匹配正则表达式时:
- 删除 "join" 消息。
- 将用户从聊天中踢出。
- 删除 "left" 消息。
问题是我不知道如何获取 "left" 消息的 message.id
,因为:
- KickChatMember 方法没有 return 消息对象,只有
true
或 false
.
- 包含
left_chat_member
的已发送消息已 user.from
设置为踢球的成员(在本例中为机器人本身)。
- 机器人无法接收自己消息的更新,因此未收到之前的消息。
所以问题是:
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 的对话中得出的一个可能的近似值是:
- 当
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
的执行应该 return 该信息.
一个解决方案
当在管理它的函数中启动一个new_chat_members
时,可以执行以下操作(将使用三个ID,id1
、id2
和id3
) :
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循环结束时,我们删除带有id1
和id3
的消息。
以这种方式,输入和输出(踢出)消息完全确定地被消除,无论是否有其他消息出现在它们之间。
我通过在 bot 中的每个动作之间等待 3 秒来测试它并在组中写入(同时 bot 一步一步地进行)。
Python
中的例子
https://github.com/schcriher/welcome-tg-bot/commit/0e4dbaa9cbff5272d682899b1433ff2b3c750a74
总结:所有的留言都回复了(回复),从id3 - 1
到id1 + 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));
}
}
我正在尝试使用 Telegram 机器人执行以下操作:
当 user.first_name
匹配正则表达式时:
- 删除 "join" 消息。
- 将用户从聊天中踢出。
- 删除 "left" 消息。
问题是我不知道如何获取 "left" 消息的 message.id
,因为:
- KickChatMember 方法没有 return 消息对象,只有
true
或false
. - 包含
left_chat_member
的已发送消息已user.from
设置为踢球的成员(在本例中为机器人本身)。 - 机器人无法接收自己消息的更新,因此未收到之前的消息。
所以问题是:
Is possible to obtain the
message.id
for the message containingleft_chat_member
when is sent by the bot itself? Is there any other way to achieve this?
也许我可以尝试推断 message.id
但我不知道这是否可行或是否值得推荐。
在 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
的执行应该 return 该信息.
一个解决方案
当在管理它的函数中启动一个new_chat_members
时,可以执行以下操作(将使用三个ID,id1
、id2
和id3
) :
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循环结束时,我们删除带有id1
和id3
的消息。
以这种方式,输入和输出(踢出)消息完全确定地被消除,无论是否有其他消息出现在它们之间。
我通过在 bot 中的每个动作之间等待 3 秒来测试它并在组中写入(同时 bot 一步一步地进行)。
Python
中的例子https://github.com/schcriher/welcome-tg-bot/commit/0e4dbaa9cbff5272d682899b1433ff2b3c750a74
总结:所有的留言都回复了(回复),从id3 - 1
到id1 + 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));
}
}