Telethon调用iter_messages传入None执行全局搜索无结果问题咨询
问题描述
使用Python第三方库Telethon对接Telegram API做开发时,指定用户ID作为iter_messages方法的实体参数,可以正常基于关键词检索、收集特定用户的匹配消息,可正常运行的代码如下:
import config from telethon import TelegramClient from telethon.errors import SessionPasswordNeededError from telethon.sync import TelegramClient from telethon import functions, types import datetime import asyncio api_id = config.telegram_crawler_secrets_and_settings['TELEGRAM_API_ID'] api_hash = config.telegram_crawler_secrets_and_settings['TELEGRAM_API_HASH'] phone = config.telegram_crawler_secrets_and_settings['TELEGRAM_API_PHONE_NUMBER'] async def main(): async with TelegramClient('anon', api_id, api_hash) as client: async for message in client.iter_messages(5067150042, limit=10, search='hello', wait_time=0): print(message.stringify()) await asyncio.sleep(0.2) asyncio.run(main())
根据项目公开issue说明,将iter_messages方法的实体参数替换为None,即可跨公共频道执行全局消息搜索,但按如下方式修改代码后,始终无法获取搜索结果:
async def main(): async with TelegramClient('anon', api_id, api_hash) as client: async for message in client.iter_messages(None, limit=10, search='hello', wait_time=0): print(message.stringify()) await asyncio.sleep(0.2) asyncio.run(main())
排查思路与解决方案
- 校验账号类型与登录状态
全局跨频道搜索仅对完成完整登录流程的普通用户账号开放,Bot账号无该接口权限;同时确认当前会话已完成手机号校验、两步验证(若账号开启了二次密码),未处于登录受限状态。 - 补全必填参数、调整请求频率
传入entity=None触发全局搜索时,需要显式传入filter参数指定消息过滤规则,否则接口会默认按当前对话的过滤规则匹配,直接返回空结果;另外Telegram服务端对全局搜索接口有严格的频率限制,将wait_time设为0极易触发临时限流,建议调整为1~2秒的请求间隔。
修正后的调用示例:from telethon.tl.types import InputMessagesFilterEmpty async def main(): async with TelegramClient('anon', api_id, api_hash) as client: async for message in client.iter_messages( entity=None, limit=10, search='hello', filter=InputMessagesFilterEmpty(), wait_time=1 ): print(message.stringify()) await asyncio.sleep(0.2) asyncio.run(main()) - 升级Telethon到最新稳定版本
早期1.x版本的Telethon对entity=None场景的参数拼接存在逻辑bug,会导致全局搜索请求参数不符合Telegram接口要求,直接执行版本升级即可修复:pip install --upgrade telethon - 排除关键词与节点限制
若搜索关键词命中Telegram内容审核规则,会直接返回空结果,可先使用公开频道高频出现的普通通用词测试接口可用性;另外部分接入节点会限制全局搜索功能,可先在同账号的官方Telegram客户端手动执行相同关键词的全局搜索,确认官方客户端能正常返回公共频道结果后,再调试脚本,排除网络、节点层面的拦截问题。
内容的提问来源于stack exchange,提问作者Disting
相关产品推荐
相关产品推荐

