如何用PHP+Curl登录Instagram获取SessionID?异常登录问题求解
解决Instagram程序化登录的两个问题
问题1:如何获取有效的sessionid
你的代码里有几个关键问题导致拿不到sessionid,我帮你梳理并修改:
现有代码的问题
- 依赖
force_classic_login旧端点:Instagram现在已经逐步淘汰传统表单登录,改用AJAX接口,旧端点返回的cookie信息不完整。 - 手动修改cookie文件:你代码里主动移除了
sessionid=;,虽然初始sessionid是空的,但登录成功后服务器会返回有效的sessionid,手动操作会干扰curl的自动cookie管理。 - 请求Headers不完整:缺少AJAX登录必需的标识,服务器无法识别为合法的登录请求。
修改后的代码
<?php $username = "yourname"; $password = "yourpass"; // 更新为现代浏览器的User-Agent $useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"; $cookieFile = __DIR__ . "/" . $username . ".txt"; // 先清理旧cookie @unlink($cookieFile); // 第一步:获取登录页的csrftoken和初始cookie $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://www.instagram.com/accounts/login/"); curl_setopt($ch, CURLOPT_USERAGENT, $useragent); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language: en-US,en;q=0.5", "Connection: keep-alive", "Upgrade-Insecure-Requests: 1" ]); $page = curl_exec($ch); curl_close($ch); // 提取csrftoken if (!preg_match('/csrf_token":"([^"]+)"/', $page, $csrfMatch)) { die("无法获取csrftoken"); } $csrftoken = $csrfMatch[1]; // 第二步:发送AJAX登录请求 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://www.instagram.com/accounts/login/ajax/"); curl_setopt($ch, CURLOPT_USERAGENT, $useragent); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ "username" => $username, "password" => $password, "queryParams" => "{}", "optIntoOneTap" => "false" ])); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Origin: https://www.instagram.com", "Referer: https://www.instagram.com/accounts/login/", "X-CSRFToken: " . $csrftoken, "X-Requested-With: XMLHttpRequest", "Content-Type: application/x-www-form-urlencoded", "Accept: */*", "Accept-Language: en-US,en;q=0.5", "Connection: keep-alive" ]); // 模拟人类操作间隔 sleep(3); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 检查登录结果 $responseData = json_decode($response, true); if ($responseData["authenticated"] ?? false) { echo "登录成功!sessionid已写入cookie文件\n"; // 从cookie文件读取sessionid $cookieContent = file_get_contents($cookieFile); if (preg_match('/sessionid\s+([^\s]+)/', $cookieContent, $sessionMatch)) { echo "获取到sessionid: " . $sessionMatch[1] . "\n"; } } else { echo "登录失败: " . ($responseData["message"] ?? "未知错误") . "\n"; } ?>
修改要点说明
- 使用
/accounts/login/ajax/官方AJAX登录接口,这是目前有效的登录方式。 - 自动提取页面中的
csrftoken,确保登录请求携带正确的验证令牌。 - 添加
X-Requested-With: XMLHttpRequest等关键Headers,模拟真实浏览器的AJAX请求。 - 让curl完全自动管理cookie,不再手动修改cookie文件,避免干扰sessionid的生成和存储。
问题2:为什么有的账号会触发“可疑登录尝试”
这个是Instagram的风控机制在起作用,常见原因有这些:
- IP/地区不匹配:这个账号平时常用的登录IP和你当前代码运行的服务器IP不在同一地区(比如账号平时在国内,你用海外服务器登录),系统会判定为异常。
- User-Agent太老旧:你原来代码里用的Chromium 50是多年前的版本,Instagram很容易识别出这不是真实用户的浏览器。
- 请求特征异常:缺少真实浏览器的关键Headers(比如
X-Requested-With),或者请求频率太高、没有模拟人类操作间隔,被判定为机器人。 - 账号风控等级高:如果这个账号之前有过违规操作(比如刷赞、批量关注),或者被举报过,Instagram会对它的登录行为更加严格。
解决建议
- 更新User-Agent为当前主流浏览器的版本(比如上面代码里的Chrome 118)。
- 如果是IP问题,可以使用和账号常用地区一致的代理IP。
- 降低登录频率,增加随机的操作间隔(比如sleep 3-5秒,不要固定值)。
- 尽量模拟真实用户的操作流程,比如登录前先访问首页,再进入登录页,不要直接跳登录。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

