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

使用Requests库登录Instagram时连接被拒,求解决方案

解决Instagram Requests登录连接被拒的问题

Instagram现在对非浏览器请求的拦截机制非常严格,你的代码缺少几个关键的请求头和必要的模拟步骤,导致被判定为机器人请求从而拒绝连接。我帮你梳理问题并给出修复后的方案:

问题分析

你的原代码存在这些核心不足:

  • 请求头过于简略,缺少真实浏览器会携带的关键字段(比如X-Requested-With、Accept-Language等)
  • 只提取了csrftoken,忽略了Instagram初始化时设置的ig_did、mid等必要Cookie
  • 没有模拟人类操作的时间间隔,容易触发反机器人检测
  • 登录参数不全,缺少当前Instagram登录表单要求的额外字段

修复后的代码

import requests
import time

# 配置信息
BASE_URL = 'https://www.instagram.com/'
LOGIN_URL = BASE_URL + 'accounts/login/ajax/'
USERNAME = '******'
PASSWD = '******'
# 建议换成最新版浏览器的User-Agent,旧版本更容易被拦截
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'

session = requests.Session()

# 配置完整的模拟浏览器请求头
session.headers.update({
    'User-Agent': USER_AGENT,
    'Accept': '*/*',
    'Accept-Language': 'en-US,en;q=0.9',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'X-Requested-With': 'XMLHttpRequest',
    'Origin': BASE_URL.rstrip('/'),
    'Referer': BASE_URL,
    'DNT': '1',
    'Connection': 'keep-alive',
})

try:
    # 首次访问获取初始化Cookie(包含csrftoken、ig_did、mid等关键标识)
    req = session.get(BASE_URL)
    req.raise_for_status()  # 捕获HTTP请求错误

    # 提取csrftoken
    csrftoken = req.cookies.get('csrftoken')
    if not csrftoken:
        print("Failed to retrieve csrftoken")
        exit()
    session.headers.update({'X-CSRFToken': csrftoken})

    # 模拟人类操作间隔,避免被判定为机器人
    time.sleep(2)

    # 准备完整的登录参数
    login_data = {
        'username': USERNAME,
        'password': PASSWD,
        'queryParams': '{}',
        'optIntoOneTap': 'false'
    }

    # 发送登录请求
    login_response = session.post(LOGIN_URL, data=login_data, allow_redirects=True)
    login_response.raise_for_status()

    # 更新登录响应返回的新csrftoken
    new_csrftoken = login_response.cookies.get('csrftoken')
    if new_csrftoken:
        session.headers.update({'X-CSRFToken': new_csrftoken})

    # 检查登录结果
    login_result = login_response.json()
    print("Login response details:", login_result)
    if login_result.get('authenticated'):
        print("✅ Successfully logged in!")
        # 示例:获取个人主页验证登录状态
        profile_response = session.get(BASE_URL + USERNAME + '/')
        print("Profile page status code:", profile_response.status_code)
    else:
        print("❌ Login failed:", login_result.get('message'))

except requests.exceptions.ConnectionError:
    print("Connection refused - 可能原因:IP被封禁、请求频率过高或User-Agent太旧")
    print("建议:切换网络、更新User-Agent、降低请求频率后重试")
except requests.exceptions.HTTPError as e:
    print(f"HTTP错误发生:{e}")
except Exception as e:
    print(f"意外错误:{e}")

关键修改说明

  1. 完整请求头:添加了X-Requested-With(标识AJAX请求)、Origin、Accept-Language等字段,让请求更贴近真实浏览器行为
  2. 保留全部初始化Cookie:首次访问时获取的ig_did、mid等Cookie是Instagram识别用户会话的关键,不能只提取csrftoken
  3. 添加操作延迟:time.sleep(2)模拟人类操作节奏,避免触发反机器人检测
  4. 完善登录参数:新增queryParams和optIntoOneTap字段,匹配当前Instagram登录表单的提交要求
  5. 增强错误处理:通过raise_for_status()捕获HTTP错误,同时解析登录响应的JSON数据明确登录结果

额外注意事项

  • 如果你多次尝试失败,大概率是IP被Instagram临时封禁了,建议切换网络(比如手机热点)后再试
  • 定期更新你的User-Agent,使用最新版浏览器的标识,旧版本更容易被拦截
  • 不要频繁发送请求,尽量模拟人类的操作频率,避免触发更严格的反制措施

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:26:50