使用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}")
关键修改说明
- 完整请求头:添加了
X-Requested-With(标识AJAX请求)、Origin、Accept-Language等字段,让请求更贴近真实浏览器行为 - 保留全部初始化Cookie:首次访问时获取的
ig_did、mid等Cookie是Instagram识别用户会话的关键,不能只提取csrftoken - 添加操作延迟:
time.sleep(2)模拟人类操作节奏,避免触发反机器人检测 - 完善登录参数:新增
queryParams和optIntoOneTap字段,匹配当前Instagram登录表单的提交要求 - 增强错误处理:通过
raise_for_status()捕获HTTP错误,同时解析登录响应的JSON数据明确登录结果
额外注意事项
- 如果你多次尝试失败,大概率是IP被Instagram临时封禁了,建议切换网络(比如手机热点)后再试
- 定期更新你的
User-Agent,使用最新版浏览器的标识,旧版本更容易被拦截 - 不要频繁发送请求,尽量模拟人类的操作频率,避免触发更严格的反制措施
内容的提问来源于stack exchange,提问作者ModerateWisdom
相关产品推荐
相关产品推荐

