Telegram机器人设置群组发送消息权限:禁止发图的完整实现指南

介绍使用Telegram Bot API限制群组成员发送图片的两种方式:setChatPermissions全局设置与restrictChatMember针对特定用户,并提供Python示例与常见问题解答。

阅读提示涉及账号和安全设置时,请边阅读边核对当前设备界面。

为什么需要禁止群组成员发图?

在Telegram群组管理中,图片消息往往占据大量空间,并可能带来广告、垃圾内容等骚扰。作为群组管理员或机器人开发者,通过Bot API精准控制成员的发图权限,是维护群组秩序的重要手段。本文将从机器人开发角度,讲解如何通过setChatPermissionsrestrictChatMember实现禁止发图的完整流程。

Telegram权限模型基础

Telegram Bot API提供了两个核心权限接口:

  • setChatPermissions:设置整个群组默认的发送权限,适用于所有成员。
  • restrictChatMember:针对单个用户设置临时或永久限制,覆盖群组默认权限。

权限字段中与图片相关的包括:can_send_messagescan_send_media_messagescan_send_photos。注意:当can_send_messages=false时,用户无法发送任何消息,自然也包含图片;若仅需禁止图片,应保持can_send_messages=true,并设置can_send_media_messages=falsecan_send_photos=false

方法一:使用setChatPermissions全局禁止发图

该方法适用于需要让所有新老成员均不能发送图片的场景。调用示例(Python):

import requests

bot_token = 'YOUR_BOT_TOKEN'
chat_id = '@your_channel'
url = f'https://api.telegram.org/bot/setChatPermissions'

permissions = {
    'can_send_messages': True,
    'can_send_media_messages': False,  # 禁止所有媒体,包括图片
    'can_send_photos': False,          # 更明确地禁止图片
    'can_send_documents': True,
    'can_send_other_messages': True,
    'can_add_web_page_previews': True,
    'can_send_polls': True,
    'can_send_audios': False,
    'can_send_videos': False,
    'can_send_video_notes': False,
    'can_send_voice_notes': False
}

data = {'chat_id': chat_id, 'permissions': permissions}
response = requests.post(url, json=data)
print(response.json())

注意:can_send_photoscan_send_media_messages需同时设置为false,以确保旧客户端行为一致。此外,该设置仅影响调用之后发送的消息,已发送的图片不会被撤回。

方法二:使用restrictChatMember针对特定用户禁止发图

当只需限制个别成员时,使用restrictChatMember。示例:

import requests

bot_token = 'YOUR_BOT_TOKEN'
chat_id = '@your_channel'
user_id = 123456789
url = f'https://api.telegram.org/bot/restrictChatMember'

permissions = {
    'can_send_messages': True,
    'can_send_media_messages': False,
    'can_send_photos': False,
    'can_send_documents': True,
    'can_send_other_messages': True,
    'can_add_web_page_previews': True,
    'can_send_polls': True,
    'can_send_audios': False,
    'can_send_videos': False,
    'can_send_video_notes': False,
    'can_send_voice_notes': False
}

data = {'chat_id': chat_id, 'user_id': user_id, 'permissions': permissions}
response = requests.post(url, json=data)
print(response.json())

可选参数until_date用于设置限制时间戳,若留空则永久限制。注意:机器人必须拥有restrict_members管理员权限才能调用此方法。

进阶:机器人自动识别并禁发图片

通过监听消息事件,可实现对特定用户发图行为的自动处理。核心思路:在message更新中识别photo字段,如果是被限制用户,则调用deleteMessage删除消息,并调用restrictChatMember追加限制。示例代码片段:

from telegram.ext import Updater, MessageHandler, Filters

def handle_message(update, context):
    msg = update.message
    if msg.photo and msg.from_user.id in restricted_ids:
        context.bot.delete_message(chat_id=msg.chat_id, message_id=msg.message_id)
        context.bot.restrict_chat_member(
            chat_id=msg.chat_id,
            user_id=msg.from_user.id,
            permissions=Permissions(can_send_photos=False),
            until_date=time.time()+3600
        )

常见问题与最佳实践

  • 为什么设置后仍能发送图片?可能是机器人权限不足,或客户端缓存了旧权限,建议删除本地缓存后测试。
  • 如何恢复发送图片?将相应权限设置为true即可。
  • 注意权限继承关系:can_send_media_messages=false会覆盖can_send_photos,但显式设置为false更清晰。
  • 不要同时限制can_send_messages,否则用户完全被禁言,无法进行文字交流。

总结

通过setChatPermissionsrestrictChatMember,机器人开发者可以灵活地控制群组发图权限。全局设置适合一键管控,定向限制适合精准治理。结合消息监听,可以实现更智能的自动防范机制。务必确保机器人具备相应管理员权限,并在测试环境中充分验证后再应用于正式群组。

FAQ

下载与安装

常见问题

setChatPermissions和restrictChatMember有什么区别?

setChatPermissions设置整个群组的默认权限,影响所有成员;restrictChatMember针对某个用户单独设置,覆盖默认权限。

禁止发图后,用户还能发送文件或视频吗?

取决于设置的权限。如果仅设置can_send_photos=false,用户仍可发送其他媒体;如果设置can_send_media_messages=false,则所有媒体(包括图片、视频、音频)都被禁止。

机器人调用接口需要什么权限?

需要机器人是群组管理员,并且拥有restrict_members权限。若机器人无管理员权限,调用会返回403错误。

如何取消对某个用户的发图限制?

再次调用restrictChatMember,将can_send_photos和can_send_media_messages设置为true即可。