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

PHP调用MangaEden API:如何跨请求保留登录Cookie?

解决PHP请求MangaEden接口时Cookie不保留的问题

你的问题核心在于:curl执行登录的会话和后续file_get_contents的请求是完全独立的两个会话,它们不会自动共享Cookie数据,所以调用接口时相当于处于未登录状态,自然拿不到个人数据。下面给你两种实用的解决方案:

方法一:用Cookie文件保存并复用登录状态

这种方法适合需要多次请求接口,或者把登录和数据请求拆分成不同函数的场景。我们通过curl的CURLOPT_COOKIEJAR把登录生成的Cookie保存到本地文件,后续请求再用CURLOPT_COOKIEFILE读取这个文件来复用登录状态。

// 定义临时Cookie文件路径(用系统临时目录更安全)
$cookie_file = tempnam(sys_get_temp_dir(), 'mangaeden_cookie');

/**
 * 执行登录并保存Cookie到文件
 * @param string $login_url 登录接口地址
 * @param string $cookie_file Cookie保存路径
 */
function login_and_save_cookie($login_url, $cookie_file) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $login_url);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 避免直接输出响应内容
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); // 将Cookie写入指定文件
    curl_exec($ch);
    curl_close($ch);
}

/**
 * 携带Cookie请求个人数据接口
 * @param string $api_url 数据接口地址
 * @param string $cookie_file Cookie文件路径
 * @return string 接口返回的JSON数据
 */
function get_personal_manga_data($api_url, $cookie_file) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $api_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); // 读取Cookie文件,复用登录状态
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}

// 执行流程
$login_url = "https://www.mangaeden.com/ajax/login/?username=xxx&password=xxx";
$api_url = "https://www.mangaeden.com/api/mymanga/";

// 登录并保存Cookie
login_and_save_cookie($login_url, $cookie_file);
// 请求个人数据
$manga_data = get_personal_manga_data($api_url, $cookie_file);

// 输出结果
echo $manga_data;

// 用完临时Cookie文件后记得删除,避免残留
unlink($cookie_file);

方法二:复用同一个curl句柄保持会话

如果你的登录和数据请求是连续执行的,这种方法更简洁——同一个curl句柄会自动保留会话中的Cookie数据,不需要额外处理文件。

// 初始化一个curl句柄
$ch = curl_init();

// 配置并执行登录请求
curl_setopt($ch, CURLOPT_URL, "https://www.mangaeden.com/ajax/login/?username=xxx&password=xxx");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 不直接输出响应
curl_exec($ch);

// 复用同一个句柄,修改URL后请求数据接口
curl_setopt($ch, CURLOPT_URL, "https://www.mangaeden.com/api/mymanga/");
curl_setopt($ch, CURLOPT_HEADER, false); // 不需要再输出响应头部
$manga_data = curl_exec($ch);

// 关闭句柄
curl_close($ch);

// 输出结果
echo $manga_data;

注意事项

  • 确保你的服务器有读写临时文件的权限(方法一用到),sys_get_temp_dir()返回的目录一般是具备权限的。
  • 如果用file_get_contents请求接口,也可以通过设置上下文参数读取Cookie文件,但curl的配置更灵活,推荐优先使用curl。
  • 登录接口的URL里,&要改成&,否则参数会被解析错误(你原代码里的URL有这个问题,已经在示例里修正了)。

内容的提问来源于stack exchange,提问作者Dafiul Haq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:32:06