使用Python Requests登录Instagram无法获取CSRF Token和Session ID求助
解决Instagram登录无法获取CSRF Token和Session ID的问题
核心问题分析
当前代码无法获取CSRF Token和Session ID,主要原因是Instagram反爬机制更新、CSRF Token存储位置变化,以及请求头/参数不符合平台当前要求。
针对性解决方案
1. 调整CSRF Token提取逻辑
Instagram目前更倾向于将CSRF Token存入Cookie而非页面源码,原正则解析HTML的方式已失效,优先从响应Cookie中提取:
# 替换原正则提取逻辑 csrf = s.cookies.get('csrftoken') # 兼容降级:若Cookie中无Token,再尝试从页面源码提取 if not csrf: csrf_match = re.search(r'"csrf_token":"(.*?)"', response.text) csrf = csrf_match.group(1) if csrf_match else None
2. 修正请求头与参数
- Referer地址错误:登录请求的Referer应指向登录页面,而非API接口
- User-Agent过时:更换为最新浏览器UA,避免被识别为非浏览器请求
- 补充现代浏览器头:添加
sec-ch-ua系列头,模拟真实浏览器环境 - 调整Payload参数:
queryParams改为空字符串(避免表单序列化异常),optIntoOneTap设为true
3. 优化请求顺序
先访问Instagram主站获取初始Cookie,再请求登录页,确保Session初始化完整:
# 先访问主站获取基础Cookie s.get('https://www.instagram.com/') # 再访问登录页 response = s.get('https://www.instagram.com/accounts/login/')
修改后的完整代码
import requests import datetime import re # 初始化Session s = requests.Session() # 1. 预加载主站,获取初始Cookie s.get('https://www.instagram.com/') # 2. 访问登录页 login_page_url = 'https://www.instagram.com/accounts/login/' login_page_response = s.get(login_page_url) # 3. 提取CSRF Token csrf = s.cookies.get('csrftoken') if not csrf: csrf_match = re.search(r'"csrf_token":"(.*?)"', login_page_response.text) csrf = csrf_match.group(1) if csrf_match else None print("初始Cookie: ", s.cookies.get_dict()) # 4. 准备登录参数 timestamp = int(datetime.now().timestamp()) username = '你的账号' password = '你的密码' payload = { 'username': username, 'enc_password': f'#PWD_INSTAGRAM_BROWSER:0:{timestamp}:{password}', 'queryParams': '', 'optIntoOneTap': 'true' } # 5. 构造合规请求头 login_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36", "X-Requested-With": "XMLHttpRequest", "Referer": login_page_url, "x-csrftoken": csrf, "X-IG-App-ID": "936619743392459", "Accept-Language": "en-US,en;q=0.9", "Accept": "*/*", "sec-ch-ua": "\"Chromium\";v=\"128\", \"Not;A=Brand\";v=\"24\", \"Google Chrome\";v=\"128\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"" } # 6. 发送登录请求 login_api_url = 'https://www.instagram.com/accounts/login/ajax/' login_response = s.post(login_api_url, data=payload, headers=login_headers, allow_redirects=True) print("登录后Cookie: ", s.cookies.get_dict()) print("登录响应内容: ", login_response.json())
额外注意事项
- 若仍无法获取Session ID,大概率是IP被Instagram限制,需更换代理IP
- 避免频繁请求,添加1-3秒随机延迟,降低反爬触发概率
- 检查登录响应的JSON内容,若返回
authenticated: false,需排查账号密码、加密格式或头信息是否正确
内容的提问来源于stack exchange,提问作者zied cheheibi
相关产品推荐
相关产品推荐

