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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:49:20