Telethon使用SOCKS5代理连接Telegram超时:在线检测可用但Python代码报GeneralProxyError错误
Telethon使用SOCKS5代理连接Telegram超时:在线检测可用但Python代码报GeneralProxyError错误
这种情况我之前踩过坑!明明在线代理检测工具显示正常,但一跑Telethon代码就超时报GeneralProxyError,确实挺闹心的。咱们从几个常见的排查方向入手,一步步解决:
1. 先调整代理的rdns参数(最常见的解决办法)
你代码里把rdns设为True,这会让代理服务器负责解析Telegram的域名,但很多公共SOCKS5代理并不支持远程DNS解析功能,反而会导致超时。改成False让本地解析域名后再发请求给代理,大概率能解决问题:
修改后的代理配置:
proxy = { 'proxy_type': 'socks5', 'addr': '194.32.229.199', 'port': 1050, 'username': 'user', 'password': 'pass', 'rdns': False # 这里改成False }
2. 增加连接超时时间
Telethon默认的超时阈值比较短,如果你的代理延迟偏高,很容易触发超时。可以在初始化TelegramClient时手动设置更长的超时(比如15-30秒):
with TelegramClient( StringSession(), api_id, api_hash, proxy=proxy, connection=ConnectionTcpAbridged, timeout=15 # 按需调整,比如15秒 ) as client: # 原代码逻辑
3. 更换连接类型尝试
虽然ConnectionTcpAbridged官方说对代理友好,但部分代理环境下,换成ConnectionTcpFull反而更稳定。先导入对应的连接类,再替换:
from telethon.network.connection.tcpfull import ConnectionTcpFull # 然后在TelegramClient里修改connection参数 with TelegramClient( StringSession(), api_id, api_hash, proxy=proxy, connection=ConnectionTcpFull # 换成这个 ) as client: # 原代码逻辑
4. 验证代理是否真的能访问Telegram
在线检测工具通常只是测试「能否连通代理服务器」,但没测「能否通过代理访问Telegram的API服务器」。你可以用curl在本地终端验证:
# 替换成你的代理信息 curl -x socks5://user:pass@194.32.229.199:1050 https://api.telegram.org
如果这个命令超时或者返回错误,说明你的代理虽然能通,但被Telegram屏蔽了IP,这种情况只能换代理。
5. 检查本地网络拦截
本地的杀毒软件、防火墙甚至VPN,都可能悄悄拦截Python的网络请求。可以暂时关闭这些工具,再跑代码试试,排除本地拦截的可能。
给你整理的完整修改版代码
结合了rdns=False和超时设置,还加了异常捕获方便排查:
from telethon.sync import TelegramClient from telethon.sessions import StringSession from telethon.network.connection.tcpabridged import ConnectionTcpAbridged from telethon import functions, types api_id = 1234 api_hash = '12345' proxy = { 'proxy_type': 'socks5', 'addr': '194.32.229.199', 'port': 1050, 'username': 'user', 'password': 'pass', 'rdns': False } try: with TelegramClient( StringSession(), api_id, api_hash, proxy=proxy, connection=ConnectionTcpAbridged, timeout=15 ) as client: me = client.get_me() print("Успешная авторизация через прокси!") print(f"ID: {me.id}") print(f"Имя: {me.first_name}") print(f"Username: @{me.username}") print("\nСтрока сессии для повторного входа:") print(client.session.save()) except Exception as e: print(f"Ошибка подключения: {type(e).__name__}: {e}")
如果以上方法都不行,大概率是代理IP被Telegram的反爬机制限制了,换个代理IP或者端口试试吧。
内容来源于stack exchange




