通过 Chat ID 限制 telegram bot 的访问

Limit the access of telegram bot through Chat ID

我附上了代码。我希望从本地计算机上的文本文件访问 chat_id。

#constants.py
  chatid_list = []
  file1 = open(r'D:\folder1\chatids.txt', "r")
  for chat_id in file1:
       chatid_list.append(chat_id)

 #main.py
    def start(update, context):
   chat_id = update.message.chat_id
     first_name =update.message.chat.first_name
last_name = update.message.chat.last_name
username = update.message.chat.username
if chat_id in cp.chatid_list:
    print("chat_id : {} and firstname : {} lastname : {}  username {}". format(chat_id, first_name, last_name , username))
    context.bot.send_message(chat_id, 'Hi ' + first_name + '   Whats up?')
    update.message.reply_text( text=main_menu_message(),reply_markup=main_menu_keyboard())
else:
    print("WARNING: Unauthorized access denied for {}.".format(chat_id))
    update.message.reply_text('User disallowed.')

我的猜测是 chatid_list 的元素是字符串,因为您是从文本文件中读取它们的,但是 chat_id 是一个整数。因此,您要么必须将 chat_id 转换为字符串,要么将 chatid_list 的元素转换为整数。

作为更简洁的替代方案,您可以考虑使用环境变量(例如使用 )来添加配置元素,例如聊天 ID(作为字符串,如@CallMeStag 所述)。

这将消除为此目的格式化和读取文件的必要性。在这种情况下,您可以在同一目录中有一个 .env 文件:

#.env file
# allowed ids - users allowed to use bot
ALLOWED_IDS = 12345678, 24567896

我假设您正在使用 python 3 并且可以使用 f-strings。 所以,你可以扔掉你的 constants.py 而你的 main.py 看起来像下面这样:

#main.py file
import os
from dotenv import load_dotenv
load_dotenv()

def start(update, context):
    chat_id = update.message.chat_id
    first_name = update.message.chat.first_name
    last_name = update.message.chat.last_name
    username = update.message.chat.username

if chat_id in os.getenv('ALLOWED_IDS'):
    print(f'chat_id : {chat_id } and firstname : {first_name } lastname : {last_name }  username {username }')
    context.bot.send_message(chat_id, f'Hi {first_name}, Whats up?')
    update.message.reply_text(text=main_menu_message(),reply_markup=main_menu_keyboard())

else:
    print(f'WARNING: Unauthorized access denied for {chat_id}.')
    update.message.reply_text('User disallowed.')

最后,如果您希望“保护”多个函数,可以使用如图所示的包装器 here


编辑:在 OP 的评论后添加了替代本地文件类型。

您还可以将允许的用户存储在 JSON (ids.json):

{
    "allowed_users": [
        {
            "name": "john wick",
            "id": 1234567
        },
        {
            "name": "rick wick",
            "id": 2345738
        }
    ]
}

然后读取允许的ID如下:

import json

with open(r'./ids.json', 'r') as in_file:
    allowed_users = json.load(in_file)['allowed_users']
allowed_ids = [user['id'] for user in allowed_users]

,您可以简单地将所有 ID 放入一个文本文件 (ids.txt),每行一个 ID:

1234567
2345738

然后阅读如下:

allowed_ids = []
with open(r'./ids.txt', 'r') as in_file:
    for row in in_file:
        allowed_ids.append(int(row.strip()))

最后,将上面代码片段中的 os.getenv('ALLOWED_IDS') 替换为 allowed_ids