Telethon触发ResolveUsernameRequest限流及会话缓存疑问
问题
运行Telethon批量向Telegram群组发送消息时,出现限流报错:
"A wait of 16480 seconds is required (caused by ResolveUsernameRequest)"
相关代码如下:
async def main(): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) config = configparser.ConfigParser() config.read("seetings.ini",encoding= 'utf-8') message = config['Customer']['message'] internal = config['Customer']['internal'] count = 0 excel_data = pandas.read_excel('tg_groups.xlsx', sheet_name='Groups') for column in excel_data['GroupUsername'].tolist(): try: if str(excel_data['GroupUsername'][count]) == 'None': count += 1 continue else: chat = await client.get_input_entity(str(excel_data['GroGroupUsernameupID'][count])) await client.send_message(entity=chat, message=message) except Exception as e: print(e) time.sleep(int(internal)) count = count + 1 continue time.sleep(int(internal)) count = count + 1 if __name__ == '__main__': if proxytype == 'HTTP': print('HTTP') client = TelegramClient('phone'+phone, api_id, api_hash, proxy=(socks.HTTP, 'localhost', int(proxyport))).start() if proxytype == 'socks5': print('SOCKS5') client = TelegramClient('phone'+phone, api_id, api_hash, proxy=(socks.SCOKS5, 'localhost', int(proxyport))).start() myself = client.get_me() print(myself) freqm = config['Customer']['freq'] print(int(freqm)) while True: with client: client.loop.run_until_complete(main()) time.sleep(int(freqm))
根据Telethon的Entity指南,get_input_entity会优先从会话文件缓存中查找实体信息,但当前代码中该方法仍反复触发ResolveUsernameRequest,疑问是否存在操作遗漏或会话缓存未正常保存?
分析与解决方案
1. 核心问题:字段名拼写错误
调用get_input_entity时使用了错误的字段名GroGroupUsernameupID,这是明显的拼写失误,应改为表格中对应的正确列名(比如GroupUsername或GroupID)。错误的字段值导致get_input_entity无法从缓存匹配到有效实体,只能反复发起ResolveUsernameRequest,最终触发Telegram的限流机制。
2. 缓存未生效的可能原因
- 会话文件未持久化:Telethon的实体缓存依赖启动时指定的会话文件(此处为
'phone'+phone),若每次运行生成新的会话文件名,或文件无读写权限,缓存无法保存。检查会话文件是否存在,且程序拥有读写权限。 - 未提前缓存实体:首次处理某群组时,
get_input_entity必须调用ResolveUsernameRequest获取实体并缓存,但后续若持续传入错误值,永远无法命中缓存,持续触发请求导致限流。
3. 限流与缓存优化方案
- 修正字段拼写:确保传入
get_input_entity的是正确的群组用户名/ID,让方法能命中缓存,避免重复解析请求。 - 调整请求间隔:当前
internal设置的间隔可能过短,Telegram对频繁的实体解析请求有严格限制,建议将间隔延长至60秒以上。 - 预缓存实体:提前批量获取所有群组的
InputEntity并保存(比如存入本地文件),后续循环直接使用缓存的实体,彻底避免重复调用get_input_entity。
4. 其他代码错误修正
- 代理类型拼写错误:
socks.SCOKS5应改为socks.SOCKS5,否则代理无法正常工作。 - 同步调用异步方法:
myself = client.get_me()需改为myself = await client.get_me(),否则会引发异步同步冲突错误。 - 简化循环计数:用
enumerate替代手动维护count变量,避免索引错误:for idx, username in enumerate(excel_data['GroupUsername'].tolist()): if pd.isna(username): continue chat = await client.get_input_entity(str(username)) # 后续逻辑
内容的提问来源于stack exchange,提问作者wang
相关产品推荐
相关产品推荐

