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

使用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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:07:30