旧版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
相关产品推荐
相关产品推荐

