You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Telegram机器人初始运行正常,数小时后出现api.telegram.org连接超时错误的解决方案求助

排查思路与解决方案

你的机器人初始运行正常,但数小时后出现SOCKS代理连接超时的问题,结合错误日志和代码来看,核心问题出在代理链路的稳定性或者机器人的连接配置上。给你几个具体的排查和解决步骤:

一、先确认代理服务本身是否稳定

你用的socks5h://127.0.0.1:9150是Tor Browser的默认SOCKS端口,Tor节点本身会定期切换,运行久了很可能出现节点失效的情况:

  • 手动测试代理连通性:每隔几小时执行一次curl --socks5h 127.0.0.1:9150 https://api.telegram.org/bot<你的token>/getMe,如果curl也出现超时,那问题肯定在Tor代理上,和机器人代码无关。
  • 换用更稳定的代理:比如付费的SOCKS/HTTP代理服务,对比测试是否还会出现超时。如果用Tor,试试定时重启Tor服务(或者Tor Browser),看机器人能否恢复连接。

二、优化Polling模式的连接配置

你的代码用的是默认的start_polling(),默认的超时和重试机制不足以应对不稳定的代理:

  • 调整Polling参数,增加超时和重试:
    u.start_polling(
        timeout=15,  # 延长单次请求的超时时间
        read_latency=3,  # 两次拉取更新的间隔,避免太频繁请求
        retry_delay=5,  # 失败后重试的间隔
        retries=10  # 最大重试次数
    )
    
  • 给代理配置添加超时参数,避免无意义的等待:
    REQUEST_KWARGS = {
        'proxy_url': 'socks5h://127.0.0.1:9150',
        'connect_timeout': 10,
        'read_timeout': 10,
    }
    

三、添加全局错误处理,让机器人自动恢复

错误日志里提到“未注册错误处理程序”,所以机器人遇到异常后直接停摆,无法自动重试。添加一个全局错误处理器:

import time
from telegram.error import ConnectTimeoutError, HTTPError

def error_handler(update, context):
    """捕获连接异常并尝试重启Polling"""
    print(f"遇到异常: {context.error}")
    # 判断是否是连接超时类的异常
    if isinstance(context.error, (ConnectTimeoutError, HTTPError)):
        print("连接超时,尝试重启Polling...")
        u.stop_polling()
        time.sleep(10)  # 等待10秒后重试
        u.start_polling(timeout=15, retry_delay=5)

# 注册错误处理器
u.dispatcher.add_error_handler(error_handler)

这样机器人遇到超时后会自动尝试重启连接,不用手动干预。

四、考虑改用Webhook模式替代Polling

Polling模式需要机器人主动持续拉取Telegram的更新,长时间运行下代理波动很容易导致超时。如果你的服务器有公网IP,改用Webhook模式会更稳定——让Telegram主动把更新推送到你的服务器,不需要持续保持代理连接:

# 替换start_polling()和idle()的代码
u.bot.set_webhook(url='https://你的公网域名/webhook', request_kwargs=REQUEST_KWARGS)
# 启动webhook服务,监听8443端口
u.start_webhook(listen='0.0.0.0', port=8443, url_path='<你的token>')
u.idle()

注意Webhook需要HTTPS,你可以用Let's Encrypt申请免费SSL证书,或者用ngrok做临时域名映射测试。

五、检查环境依赖和系统限制

  • 升级依赖包:你的环境用的是Python3.7和anaconda,可能urllib3或者python-telegram-bot版本有bug,执行pip install --upgrade urllib3 python-telegram-bot更新到最新兼容版本。
  • 检查系统防火墙:看看是否有限制长时间出站连接的规则,或者连接数上限。

建议你先从代理稳定性测试开始,先确定是代理的问题还是代码配置的问题,再针对性解决,这样效率更高。

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

火山引擎 最新活动