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

Python实现Instagram登录返回403错误,求排查及Bot开发建议

排查Instagram Bot登录403错误的关键点

我帮你梳理下导致403的几个核心问题,以及对应的修复思路:

1. 致命的请求头错误:手动设置Content-Length: 0

你在session.headers里硬编码了'Content-Length': '0',但POST请求是携带登录数据的,这个值应该由requests自动计算。手动设置0会让服务器认为请求内容为空,直接判定为可疑请求拒绝访问——这大概率是导致403的首要原因,直接删掉这个字段即可。

2. User-Agent过旧,且未确认是否生效

你的User-Agent是Chrome 39的版本(2015年的旧版本),Instagram的反爬机制很容易识别这类过时的请求标识:

  • 先确认User-Agent是否真的生效:在发送请求前打印print(session.headers),检查User-Agent字段是否正确;或者用抓包工具(比如Charles)查看实际请求头。
  • 替换为最新的浏览器User-Agent,比如:
    User_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
    

3. 登录接口URL不正确

现在Instagram的登录使用异步接口,正确的POST地址应该是https://www.instagram.com/accounts/login/ajax/,而不是你用的accounts/login/。旧的页面接口可能已经被反爬策略限制。

4. 密码未加密直接传输

Instagram现在要求密码经过加密后以enc_password字段传输,而不是明文的password。直接传明文密码会被服务器拦截,返回403。加密逻辑需要模拟网页端的流程:

  • 先从登录页面源码的window._sharedData中提取rhx_gis值
  • 用rhx_gis和密码生成加密字符串,格式为#PWD_INSTAGRAM_BROWSER:0:当前时间戳:加密密码

5. CSRF Token获取逻辑优化

建议先访问登录页面(Login_url)再获取CSRF Token,而不是主页,确保拿到的是登录流程对应的有效Token:

req = session.get(Login_url)
if 'csrftoken' in req.cookies:
    session.headers.update({'X-CSFRToken': req.cookies['csrftoken']})

修改后的简化测试代码片段

import requests
import json
import random
import time

Base_url = 'https://www.instagram.com/'
Login_url = 'https://www.instagram.com/accounts/login/'
Login_ajax_url = 'https://www.instagram.com/accounts/login/ajax/'
Username = 'your_username'
Password = 'your_password'
# 更新为最新的User-Agent
User_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'

session = requests.Session()
# 去掉错误的Content-Length,保留必要的请求头
session.headers.update({
    'Accept': '*/*',
    'Accept-Language': 'en-US,en;q=0.5',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'keep-alive',
    'Host': 'www.instagram.com',
    'Origin': 'https://www.instagram.com',
    'Referer': Login_url,
    'User-Agent': User_agent,
    'X-Instagram-AJAX': '1',
    'Content-Type': 'application/x-www-form-urlencoded',
    'X-Requested-With': 'XMLHttpRequest'
})

# 先访问登录页面获取CSRF Token和必要的cookies
req = session.get(Login_url)
if 'csrftoken' in req.cookies:
    session.headers.update({'X-CSFRToken': req.cookies['csrftoken']})

time.sleep(2 + random.random() * 3)  # 随机延迟,模拟人类操作

# 注意:这里需要替换为加密后的enc_password,否则还是会403
login_data = {
    'username': Username,
    'enc_password': '#PWD_INSTAGRAM_BROWSER:0:1704067200:your_encrypted_password_here'
}

login = session.post(Login_ajax_url, data=login_data, allow_redirects=True)
# 更新CSRF Token
if 'csrftoken' in login.cookies:
    session.headers.update({'X-CSFRToken': login.cookies['csrftoken']})

print(f"状态码: {login.status_code}")
if login.status_code == 200:
    try:
        login_response = json.loads(login.text)
        print(login_response)
        if login_response.get('authenticated'):
            print("登录成功!")
        else:
            print("登录失败:", login_response.get('message'))
    except Exception as e:
        print("解析响应失败:", str(e))
else:
    print("登录请求被拒绝,状态码:", login.status_code)

额外提示

Instagram的反爬机制非常严格,除了上述点,还需要注意:

  • 避免频繁请求,增加随机延迟(不要固定5秒,用2-5秒的随机区间更自然)
  • 不要使用固定的IP和User-Agent,定期轮换
  • 模拟人类的操作流程(比如先浏览主页,再进入登录页,不要直接发起登录请求)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:41:39