如何使用telethon、pytgcalls实现不加入群组即可参与其语音通话
使用Telethon不加入群组参与群组语音通话实现方案
该功能仅对开放了访客访问权限的公开群组/频道生效,私有群组或关闭了访客权限的公开群组无法使用,限制逻辑与官方Telegram客户端完全一致。
实现逻辑
- 无需提前加入群组,只要目标群组是允许访客访问的公开类型,即可直接通过Telegram公开接口获取群组信息、完成语音通话加入操作
- 整个流程分为3个核心步骤:获取目标群组实体、查询可加入通话的身份、调用加入接口完成信令对接
- Telethon仅负责信令层面的加入操作,如需收发语音流需要自行实现WebRTC媒体传输逻辑
示例代码
from telethon import TelegramClient from telethon.tl.functions.phone import GetGroupCallJoinAsRequest, JoinGroupCallRequest from telethon.tl.functions.channels import GetFullChannelRequest from telethon.tl.types import InputGroupCall, InputGroupCallParams import random # 初始化客户端,替换为自己的API_ID、API_HASH、会话名称 api_id = 123456 api_hash = "abcdefghijklmnopqrstuvwxyz123456" client = TelegramClient("test_session", api_id, api_hash) async def join_call_without_join_group(channel_username: str): # 获取公开群组实体,无需提前加入 channel = await client.get_entity(channel_username) # 获取群组完整信息,读取活跃语音通话实例 full_channel = await client(GetFullChannelRequest(channel=channel)) group_call = full_channel.full_chat.call if not group_call: raise Exception("该群组暂无活跃语音通话") # 查询可用于加入通话的身份,未加入群组时默认返回自身账号作为访客身份 join_as_options = await client(GetGroupCallJoinAsRequest(peer=channel)) join_as = join_as_options.users[0] # 随机生成SSRC,避免与通话内其他成员冲突 ssrc = random.randint(1000, 2**31 - 1) # 发起加入通话请求 join_res = await client(JoinGroupCallRequest( call=InputGroupCall( id=group_call.id, access_hash=group_call.access_hash ), join_as=join_as, params=InputGroupCallParams( ssrc=ssrc, fingerprints=[], pwd="", ufrag="" ), muted=True # 如需发言可设置为False )) print("通话加入成功:", join_res) with client: client.loop.run_until_complete(join_call_without_join_group("@目标公开群组用户名"))
注意事项
- 如果调用接口返回权限错误,说明目标群组未开放访客访问权限,无法在未加入的情况下进入语音通话
- 上述代码仅完成信令接入,成功加入后会出现在通话成员列表中,如需传输语音需要自行对接WebRTC协议完成媒体流协商
- SSRC值需要随机生成,不能和通话内其他成员的SSRC重复,否则会出现音频冲突
内容的提问来源于stack exchange,提问作者retekszar
相关产品推荐
相关产品推荐

