如何将 Telegram 机器人的使用限制为仅供某些用户使用?

How can I restrict a Telegram bot's use to some users only?

我正在 python 中使用 python-telegram-bot 库为 python3.x 编写一个 Telegram 机器人,它是一个供私人使用的机器人 (我和一些亲戚),所以我想阻止其他用户使用它。我的想法是创建一个授权用户 ID 列表,并且机器人不得回复从不在列表中的用户收到的消息。我该怎么做?

编辑: 我对 python 和 python-telegram-bot 都是新手。如果可能的话,我会很感激代码片段作为示例 =).

使用聊天ID。用你想要允许的聊天 ID 创建一个小列表,你可以忽略其余的。

A link 到可以找到细节的文档 https://python-telegram-bot.readthedocs.io/en/stable/telegram.chat.html

我发现 a solution from the official wiki 的库使用了装饰器。代码:

from functools import wraps

LIST_OF_ADMINS = [12345678, 87654321] # List of user_id of authorized users

def restricted(func):
    @wraps(func)
    def wrapped(update, context, *args, **kwargs):
        user_id = update.effective_user.id
        if user_id not in LIST_OF_ADMINS:
            print("Unauthorized access denied for {}.".format(user_id))
            return
        return func(update, context, *args, **kwargs)
    return wrapped

@restricted
def my_handler(update, context):
    pass  # only accessible if `user_id` is in `LIST_OF_ADMINS`.

我只是@restricted每个函数。

admins=[123456,456789]    
if update.message.from_user.id in admins:  
    update.message.reply_text('You are authorized to use this BOT!')
    
else:
    update.message.reply_text('You are not authorized to access this BOT')

您还可以创建自定义处理程序来限制正在执行的消息处理程序。

import telegram
from telegram import Update
from telegram.ext import Handler

admin_ids = [123456, 456789, 1231515]

class AdminHandler(Handler):
    def __init__(self):
        super().__init__(self.cb)

    def cb(self, update: telegram.Update, context):
        update.message.reply_text('Unauthorized access')

    def check_update(self, update: telegram.update.Update):
        if update.message is None or update.message.from_user.id not in admin_ids:
            return True

        return False

只需确保将 AdminHandler 注册为第一个处理程序:

dispatcher.add_handler(AdminHandler())

现在,如果不是来自授权用户 (admin_ids),机器人收到的所有更新(或消息)都将被拒绝。

...
admins = ['123456', '565825', '2514588']
user = message.from_user.id 
if user in admins:
...