python-3.x 我如何限制Telegram机器人的使用,只有一些用户?

t1qtbnec  于 2023-01-27  发布在  Python
关注(0)|答案(6)|浏览(183)

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

**编辑:**我对python和python-telegram-bot都是新手。如果可能的话,我希望有一个代码片段作为例子=)。

n1bvdmb6

n1bvdmb61#

我从图书馆的官方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每个函数。

oxcyiej7

oxcyiej72#

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

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),Bot接收的每个更新(或消息)都将被拒绝。

nx7onnlm

nx7onnlm3#

使用聊天ID。创建一个小列表,其中包含您想要允许的聊天ID,您可以忽略其余的。
指向文档的链接,您可以在其中找到https://python-telegram-bot.readthedocs.io/en/stable/telegram.chat.html的详细信息

jk9hmnmh

jk9hmnmh4#

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')
h9vpoimq

h9vpoimq5#

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

ttcibm8c6#

您可以使用telegram.ext.filters.User。
下面的小示例

from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler
from telegram.ext.filters import User

ALLOWED_IDS = [123456, 78910]
TOKEN = 'TOKEN'

async def start(update: Update, context):
    await context.bot.send_message(chat_id=update.effective_chat.id, text="Wow! Admin found!")

if __name__ == '__main__':
    application = ApplicationBuilder().token(TOKEN).build()
    start_handler = CommandHandler('start', start, filters=User(ALLOWED_IDS))
    application.add_handler(start_handler)
    application.run_polling()

相关问题