You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:42:05