评论

如何制作专属的 Telegram 机器人?

原标题:如何制作专属的 Telegram 机器人?

我们将制作一个只能由我们的专属群组成员使用的 Telegram 机器人。

例如,如果用户向机器人发送启动命令,机器人会自动检查该用户是否是指定组的成员。 如果是,它将正常继续对话流程,但如果不是,它将向该用户显示拒绝消息,例如“您无权使用此机器人”。

这是我找到的一个解决方案,因为我需要为项目创建此功能,但 Telegram 机器人与 Telegram 组不同,没有将它们设为私有的选项。您也不能通过链接限制机器人的使用,无论是引用还是自动生成。不,在 Telegram 中,机器人就在那里,任何人都可以启动它们,因此,我们的解决方案必须在机器人启动之后出现。

规范要求和常用术语

要求

我使用 python-telegram-bot 库(v. 13.11)和 Python 3.9.6 创建了这个。

条款

更新:每次与机器人交互时都会收到更新,它可以通过消息、命令,几乎任何东西。

请求:通过其机器人 API 向 Telegram 服务器发送数据请求。

执行

首先是将机器人添加到我们想要“观看”的组中,有点说话。添加机器人就像添加任何其他用户一样。

添加后,我们需要获取该组的 id 以在我们的代码中使用它。为此,我们向它发送来自该组的更新,它可以是群聊中的随机消息或通过其用户名提及机器人,这取决于机器人的内联设置。

一旦我们发送了机器人可以检测到的东西,我们就可以直接在浏览器中检查对 Telegram API 的请求。

我们将使用以下 URL:https://api.telegram.org/botTOKEN/getUpdates,您必须将“TOKEN”替换为 BotFather 提供的机器人令牌。只需将 URL 粘贴到浏览器中,您就会得到类似的内容,但包含更多数据。

“message”: {
“chat”: {
“id”: -1234567890,
“title”: …,
“type”: “group”,
}
}

从我们以 JSON 格式获得的信息中,我们必须只获取聊天对象的 id,它位于消息对象内。 您可以在标题中看到该组的名称,这样您就可以更轻松地识别这些内容。 id 将是一个大数字,前面有一个连字符 (-)。

现在我们有了组的 id。 如果在浏览 API 请求中的数据时,所有数据都丢失了,而我们只得到一个真实的,最好的选择是将机器人移出组,然后再次添加,然后在发送后再次检查请求数据 对机器人的更新。

现在让我们进入有趣的部分,编码。

我们从请求数据中复制的那个 id,我们会将它存储在一个变量中。

exclusive_group_id = ”-1234567890”

现在,由于我们想从机器人与用户交互的一开始就检查用户是否是成员,我们将把这个片段添加到欢迎函数中。

但在此之前,让我们先了解一下 python-telegram-bot 如何处理对话内和组内的用户。

对于机器人收到的每个请求,我们都可以访问发送它的用户,获取 User 对象。 我们可以使用 update.effective_message.from_user 来做到这一点。 一旦我们有了 User 对象,我们就可以看到它的数据,比如用户名,或者它是机器人还是人类,但我们目前需要的是用户的唯一 ID。 为了得到它,在我们已经拥有的代码的末尾添加 id 就足够了。 同样,显然,我们会将其存储在一个变量中。 获取用户 id 的最终代码是这样的:

user_id = update.effective_message.from_user.id

此 id 也将是一个很大的数字,但前面没有连字符。 现在我们可以使用检查用户是否是我们专属组的成员的功能。

我们将使用方法 getChatMember。 它将以exclusive_group_id 和user_id 作为参数,并返回一个包含状态的ChatMember 对象。

它可以返回的状态列表是:创建者、管理员、成员、离开、被踢或受限制。 这分别相当于所有者、管理员、成员、离开组的用户、被踢出组的用户和被阻止的用户。

因此,让我们获取与我们的机器人交互的用户的状态:

member_user = context.bot.getChatmember(exclusive_group_id, user_id)
print(member_user.status)

通过最后一行,我们将看到用户的返回状态。 现在,让我们检查状态是否是我们想要授予权限的状态。 如果用户是组成员,则其状态将为“创建者”、“管理员”或“成员”。 因此,我们可以使用一个简单的 if 语句来检查状态值与其中任何一个的相等性。 有更简洁的方法可以做到这一点,即使在 if 语句中,但为了更快,让我们以一种同样有效的方式来做,但更容易理解其背后的思考过程,尽管它无疑更丑陋。

exlusive_group_id = ”-1234567890”
user_id = update.effective_message.from_user.id
member_user = context.bot.getChatmember(eclusive_group_id, user_id)
def start(update, context):
if member_user.status == 'creator' or member_user.status == 'administrator' or member_user.status == 'member':
update.message.reply_text('Hello!!, welcome.')
else:
update.message.reply_text("You're not authorized to use this bot.")

就这样! 我们现在为我们的独家组提供了一个独家机器人。

需要记住的一个细节:最好的选择是让机器人成为组管理员,否则它可能无法检测组管理员的状态,在这种情况下,即使他们在组中,它也会拒绝他们访问机器人。

在调试时,直接在浏览器的 API 请求数据中查看用户状态会很有用。 这可以通过以下 URL 完成:

https://api.telegram.org/botTOKEN/getChatMember?chat_id=CHATID&user_id=USERID/

结论

在创建 Telegram 机器人时,我们需要不断地使用 id,因此学习如何处理它们是个好主意。 此外,与小组合作也非常有用,它开辟了很多可能性。返回搜狐,查看更多

责任编辑:

平台声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
阅读 ()
大家都在看
推荐阅读