使用requests库对接Instagram时出现SSL版本错误的技术求助
解决Instagram API请求中的SSL版本错误问题
我之前帮别人排查过类似的问题,你遇到的ssl3_get_record: wrong version number错误,大概率是代理与Instagram服务器的TLS版本不兼容,或者代理本身的SSL配置有缺陷,再加上Instagram对请求的校验比较严格,才会出现间歇性的失败。下面是几个实用的解决方案,按优先级排序:
1. 强制使用现代TLS版本发起请求
Instagram现在只支持TLS 1.2及以上版本的HTTPS连接,但有些代理默认会使用老旧的SSL/TLS协议(比如SSLv3、TLS1.0),导致握手失败。你可以通过自定义requests的Adapter来强制指定TLS版本:
import ssl import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager class TLS12Adapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): # 创建SSL上下文,禁用老旧协议 ctx = ssl.create_default_context() ctx.options |= ssl.OP_NO_SSLv3 ctx.options |= ssl.OP_NO_TLSv1 ctx.options |= ssl.OP_NO_TLSv1_1 ctx.set_ciphers('DEFAULT@SECLEVEL=1') # 兼容部分代理的证书配置 self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_context=ctx, ssl_version=ssl.PROTOCOL_TLSv1_2 ) # 初始化session并挂载Adapter session = requests.Session() session.mount('https://', TLS12Adapter()) # 配置你的代理 session.proxies = { 'http': 'http://your-proxy-address:port', 'https': 'http://your-proxy-address:port' }
2. 优化重试策略,针对SSL错误自动重试
你的报错里提到了Max retries exceeded,说明默认的重试逻辑没有处理这种SSL版本错误。可以自定义重试策略,让session在遇到SSL错误时自动重试:
from urllib3.util.retry import Retry # 定义重试策略 retry_strategy = Retry( total=3, # 最大重试次数 backoff_factor=1, # 重试间隔递增(1s, 2s, 4s...) status_forcelist=[429, 500, 502, 503, 504], # 针对这些HTTP状态码重试 allowed_methods=["GET", "POST"], # 允许重试的请求方法 # 针对SSL错误和连接错误重试 retry_on_exception=lambda ex: isinstance(ex, (requests.exceptions.SSLError, requests.exceptions.ConnectionError)) ) # 把重试策略绑定到之前的TLS Adapter adapter = TLS12Adapter(max_retries=retry_strategy) session.mount('https://', adapter)
3. 模拟真实移动端请求头
Instagram的i.instagram.com是移动端API接口,对请求头的校验非常严格。如果你的请求头太简陋,服务器可能会返回异常的SSL响应(本质是反爬机制)。建议添加真实的移动端请求头:
headers = { 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Instagram 297.0.0.11.112', 'Accept-Language': 'en-US,en;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Host': 'i.instagram.com' } # 发送请求时带上headers try: response = session.get('https://i.instagram.com/api/v1/users/gameaimon/usernameinfo/', headers=headers) response.raise_for_status() # 处理响应数据 except requests.exceptions.RequestException as e: print(f"请求失败: {str(e)}")
4. 检查代理的兼容性
如果上面的方法都没用,那可能是代理本身的问题:
- 用
curl测试代理是否支持TLS1.2:curl -x http://your-proxy:port -v https://i.instagram.com,看输出里的SSL connection using TLSv1.2字样,如果没有,说明代理不支持现代TLS版本,需要更换代理。 - 避免使用免费共享代理,这类代理通常配置老旧,而且连接不稳定,容易出现各种SSL问题。
内容的提问来源于stack exchange,提问作者Haydar M.
相关产品推荐
相关产品推荐

