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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:01:29