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

如何通过Telethon仅邀请允许被添加的Telegram频道成员?

解决Telethon邀请频道成员时避免发送链接的问题

要实现仅邀请允许被直接加入频道的用户,核心是先检查目标用户的隐私设置,判断其是否允许被他人直接邀请到群组/频道,只有符合条件的用户再调用InviteToChannelRequest。

具体实现步骤

  1. 导入隐私相关方法和类型
    需要用到GetPrivacyRequest获取用户隐私规则,以及PrivacyKeyChatInvite定位到邀请权限的设置项。

  2. 编写判断用户是否可被邀请的函数
    通过解析用户的隐私规则,判断当前账号是否有权直接邀请该用户:

    • PrivacyValueAllowAll:所有人可邀请,直接通过
    • PrivacyValueAllowContacts:仅联系人可邀请,需先确认是否为联系人
    • PrivacyValueAllowUsers:仅指定用户可邀请,检查当前账号是否在允许列表内
    • 拒绝类规则(如PrivacyValueDisallowAll):直接跳过
  3. 修改原代码,加入前置判断逻辑
    在循环邀请前执行隐私检查,仅对符合条件的用户发起邀请。

修改后的完整代码

from telethon.sync import TelegramClient
from telethon.tl.functions.channels import InviteToChannelRequest
from telethon.tl.functions.account import GetPrivacyRequest
from telethon.tl.types import PrivacyKeyChatInvite, PrivacyValueAllowAll, PrivacyValueAllowContacts, PrivacyValueAllowUsers, PrivacyValueDisallowAll
import datetime
import time
import random

api_id = '12345'
api_hash = 'abcdefjghi'

client = TelegramClient('db/session.session', api_id, api_hash)

async def is_invitable(user_entity):
    # 获取用户的邀请隐私设置
    privacy_settings = await client(GetPrivacyRequest(PrivacyKeyChatInvite()))
    for rule in privacy_settings.rules:
        if isinstance(rule, PrivacyValueAllowAll):
            return True
        elif isinstance(rule, PrivacyValueDisallowAll):
            return False
        elif isinstance(rule, PrivacyValueAllowContacts):
            # 判断当前账号是否为该用户的联系人
            return await client.is_contact(user_entity)
        elif isinstance(rule, PrivacyValueAllowUsers):
            # 判断当前账号是否在允许邀请的用户列表中
            current_user = await client.get_me()
            return any(user.id == current_user.id for user in rule.users)
    # 无明确允许规则时默认返回False
    return False

async def add():
    await client.start()
    channel_entity = await client.get_entity('my_channel_username')
    uname_list = ['username1', 'username2', 'username3']

    for uname in uname_list:
        try:
            user_entity = await client.get_entity(uname)
            # 前置检查是否可直接邀请
            if await is_invitable(user_entity):
                await client(InviteToChannelRequest(channel_entity, [user_entity]))
                print(f"成功邀请 {uname}")
            else:
                print(f"{uname} 隐私设置禁止直接邀请,已跳过")
                # 记录跳过日志
                with open(f"logs/{uname}_skip.txt", "a") as f:
                    f.write(f"\n{datetime.datetime.now().strftime('%d %B %H:%M')}\n")
                    f.write("用户隐私设置禁止直接邀请,已跳过")
            # 添加随机延迟避免触发频率限制
            time.sleep(random.uniform(1, 3))
        except Exception as err:
            with open(f"logs/{uname}_err.txt", "a") as f:
                f.write(f"\n{datetime.datetime.now().strftime('%d %B %H:%M')}\n")
                f.write(f"错误信息: {err}")

    await client.disconnect()

if __name__ == "__main__":
    client.loop.run_until_complete(add())

注意事项

  • 部分用户的隐私规则可能包含多个优先级条目,代码会按规则顺序匹配生效项
  • 频繁调用API易触发Telegram限制,建议保留随机延迟逻辑

内容的提问来源于stack exchange,提问作者ZwachReck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:25:07