如何在aiogram中创建内联按钮实现添加Bot至聊天/频道并设置权限
实现Aiogram内联按钮选择聊天/频道并设置Bot权限
核心限制说明
Telegram Bot受隐私权限限制,无法主动获取用户的所有聊天/频道列表。因此需要通过用户主动提供目标聊天信息来实现,常用方式为让用户转发目标聊天的一条消息,或直接输入聊天ID。以下基于转发消息的方式提供完整实现流程:
步骤1:创建触发按钮,引导用户转发消息
先给用户发送触发按钮,启动权限设置流程:
from aiogram import Bot, Dispatcher, types from aiogram.types import ReplyKeyboardMarkup, KeyboardButton from aiogram.utils import executor API_TOKEN = '你的Bot Token' bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) # 主菜单按钮 main_menu = ReplyKeyboardMarkup(resize_keyboard=True).add( KeyboardButton("设置Bot聊天权限") ) @dp.message_handler(commands=['start']) async def send_welcome(message: types.Message): await message.reply("欢迎使用权限设置工具", reply_markup=main_menu) @dp.message_handler(text="设置Bot聊天权限") async def ask_for_chat_forward(message: types.Message): await message.reply("请转发目标聊天/频道中的任意一条消息,我会识别该聊天信息")
步骤2:处理转发消息,提取聊天ID并展示权限设置内联按钮
用户转发消息后,提取目标聊天ID,生成包含权限选项的内联键盘:
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton # 权限选项列表,对应Telegram官方权限字段 PERMISSIONS = [ ("发送消息", "can_send_messages"), ("发送媒体消息", "can_send_media_messages"), ("发送投票", "can_send_polls"), ("发送其他消息", "can_send_other_messages"), ("添加网页预览", "can_add_web_page_previews"), ("更改信息", "can_change_info"), ("邀请用户", "can_invite_users"), ("置顶消息", "can_pin_messages") ] @dp.message_handler(content_types=types.ContentType.ANY) async def handle_forwarded_message(message: types.Message): # 判断是否为有效聊天/频道转发消息 if message.forward_from_chat: chat_id = message.forward_from_chat.id # 生成内联键盘,每个按钮携带聊天ID和权限字段 markup = InlineKeyboardMarkup(row_width=2) for permission_name, permission_key in PERMISSIONS: callback_data = f"set_perm:{chat_id}:{permission_key}:toggle" markup.add(InlineKeyboardButton(permission_name, callback_data=callback_data)) await message.reply(f"已识别目标聊天:{message.forward_from_chat.title}\n请选择要设置的权限:", reply_markup=markup) else: await message.reply("请转发有效的聊天/频道消息,我才能识别目标聊天")
步骤3:处理内联按钮回调,修改Bot权限
解析回调数据中的聊天ID和权限字段,调用官方接口修改权限:
from aiogram.types import ChatPermissions @dp.callback_query_handler(lambda c: c.data.startswith('set_perm:')) async def process_permission_callback(callback_query: types.CallbackQuery): # 解析回调数据:格式为 set_perm:{chat_id}:{permission_key}:toggle parts = callback_query.data.split(':') chat_id = int(parts[1]) permission_key = parts[2] try: # 获取当前聊天的权限配置 current_permissions = await bot.get_chat_permissions(chat_id) # 切换权限状态 new_permission_value = not getattr(current_permissions, permission_key) # 构建新的权限对象 new_permissions = ChatPermissions( **{k: getattr(current_permissions, k) for k in ChatPermissions.__annotations__.keys()} ) setattr(new_permissions, permission_key, new_permission_value) # 应用权限修改 await bot.set_chat_permissions(chat_id, new_permissions) # 回复操作结果 status = "开启" if new_permission_value else "关闭" await bot.answer_callback_query(callback_query.id, text=f"{permission_key.replace('can_', '')}权限已{status}") except Exception as e: await bot.answer_callback_query(callback_query.id, text=f"设置失败:{str(e)}") if __name__ == '__main__': executor.start_polling(dp, skip_updates=True)
注意事项
- 确保Bot是目标聊天/频道的管理员,且拥有「管理权限」,否则无法修改其他权限。
- 若用户无法转发消息,可改为让用户直接输入聊天ID,只需修改
handle_forwarded_message为处理文本输入的逻辑即可。
内容的提问来源于stack exchange,提问作者Mazikeen
相关产品推荐
相关产品推荐

