PHP调用MangaEden API:如何跨请求保留登录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
相关产品推荐
相关产品推荐

