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

旧版Tumblr API调用绕过隐私提示的PHP实现问题

解决Tumblr隐私提示拦截PHP API请求的问题

嘿,我之前也跟你一样碰到过Tumblr这个隐私弹窗搞砸API请求的问题,咱们来捋清楚怎么解决它:

问题根源

你之前的思路有个小误区:当你把隐私提示页面输出到浏览器并点击OK时,Cookie是存在浏览器的会话里,而不是PHP脚本的请求上下文里。所以你的PHP脚本下次再用file_get_contents请求时,依然没有携带同意隐私政策的Cookie,自然还是会碰到弹窗。

Tumblr的隐私提示是通过特定Cookie来识别用户是否已同意的,我们需要让PHP脚本自己完成「同意隐私提示→保存Cookie→携带Cookie请求API」的完整流程,而不是依赖浏览器操作。

解决方案:用cURL管理Cookie会话

file_get_contents功能太简单,没法处理Cookie会话和POST提交,我们换成cURL来实现这个流程,步骤如下:

1. 初始化cURL并开启Cookie管理

首先要让cURL能保存和读取Cookie,这样提交同意后,后续请求就能带上有效Cookie。

2. 先请求API地址,判断是否需要处理隐私提示

第一次请求会拿到隐私提示页面,我们检查页面内容里的关键词,确认需要处理。

3. 解析隐私提示的表单并提交同意

从隐私页面里提取表单的提交地址和必要参数,发送POST请求来模拟点击「OK」的操作,这一步会让Tumblr设置同意隐私政策的Cookie。

4. 携带Cookie再次请求API

完成同意操作后,再次请求原API地址,就能拿到正常的JSON数据了。

完整PHP代码示例

<?php
// 初始化cURL会话,开启Cookie持久化
$ch = curl_init();
// 设置Cookie保存和读取的文件路径,确保PHP有读写权限
curl_setopt($ch, CURLOPT_COOKIEJAR, 'tumblr_cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'tumblr_cookies.txt');
// 自动跟随重定向(隐私提示提交后会重定向)
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// 不直接输出响应,而是返回给变量
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 可选:模拟浏览器UA,避免被识别为爬虫
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36');

$apiUrl = 'http://nakedworldofmars.tumblr.com/api/read/json?start=0&num=5&type=photo';

// 第一次请求API地址
curl_setopt($ch, CURLOPT_URL, $apiUrl);
$response = curl_exec($ch);

// 检查是否遇到隐私提示
if (strpos($response, 'Before you continue') !== false) {
    // 用DOM解析页面,提取表单信息(忽略HTML解析警告)
    $dom = new DOMDocument();
    @$dom->loadHTML($response);
    
    // 获取隐私提示的表单(通常是页面里的第一个表单)
    $form = $dom->getElementsByTagName('form')->item(0);
    if ($form) {
        $formAction = $form->getAttribute('action');
        // 提取表单里的隐藏字段(比如csrf token等,需要根据实际页面调整)
        $postFields = [];
        foreach ($form->getElementsByTagName('input') as $input) {
            $name = $input->getAttribute('name');
            $value = $input->getAttribute('value');
            if (!empty($name)) {
                $postFields[$name] = $value;
            }
        }
        // 确保添加同意的参数(如果表单里没有的话,比如有些页面需要手动加agree=1)
        if (!isset($postFields['agree'])) {
            $postFields['agree'] = '1';
        }
        
        // 发送POST请求提交同意
        curl_setopt($ch, CURLOPT_URL, $formAction);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postFields));
        // 执行提交,此时Cookie会被保存到文件
        curl_exec($ch);
        
        // 再次请求原API地址,现在应该能拿到JSON了
        curl_setopt($ch, CURLOPT_URL, $apiUrl);
        curl_setopt($ch, CURLOPT_POST, false); // 改回GET请求
        $response = curl_exec($ch);
    }
}

// 输出最终响应
echo $response;

// 关闭cURL会话
curl_close($ch);
?>

注意事项

  • 表单参数可能变化:Tumblr的隐私页面结构可能会调整,你需要实际查看隐私提示页面的源码,确认表单的action地址和隐藏字段(比如csrf token),如果DOM解析不方便,也可以用正则表达式提取。
  • Cookie文件权限:确保tumblr_cookies.txt所在目录PHP有读写权限,否则Cookie无法保存,下次请求还是会碰到弹窗。
  • 旧API稳定性:你用的是Tumblr旧版简易API,官方可能已经不再维护,长期使用的话建议考虑迁移到官方新版API(不过如果只是批量浏览,这个方法暂时能解决问题)。

内容的提问来源于stack exchange,提问作者Daniel Bauer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:07:05