无法捕获/导出部分Cookie的技术求助
方法1:通过浏览器性能日志提取请求Cookie
利用php-webdriver开启浏览器的网络性能日志,捕获目标POST请求的请求头,从中提取Cookie:
- 初始化ChromeDriver时开启网络日志:
$chromeOptions = new ChromeOptions(); $perfLogPrefs = new \Facebook\WebDriver\Chrome\ChromePerformanceLoggingPreferences(); $perfLogPrefs->enableNetworkLogging(); $chromeOptions->setPerformanceLoggingPreferences($perfLogPrefs); $driver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $chromeOptions); - 触发目标操作后,解析日志提取Cookie:
$logs = $driver->manage()->getLog('performance'); foreach ($logs as $log) { $logData = json_decode($log['message'], true); $request = $logData['message']['params']['request'] ?? null; if ($request && strpos($request['url'], '你的目标POST接口路径') !== false) { $cookieHeader = $request['headers']['Cookie'] ?? ''; // 解析Cookie键值对 $targetCookies = []; foreach (explode('; ', $cookieHeader) as $pair) { list($key, $value) = explode('=', $pair, 2); $targetCookies[$key] = $value; } // 按需使用或保存Cookie var_dump($targetCookies); } }
方法2:通过Chrome DevTools协议(CDP)拦截请求
php-webdriver支持直接调用CDP,实时监听请求发送事件获取Cookie:
// 启用网络监听 $driver->executeCdpCommand('Network.enable', []); // 拦截目标接口请求 $driver->executeCdpCommand('Network.setRequestInterception', [ 'patterns' => [['urlPattern' => '*你的目标接口地址*', 'interceptionStage' => 'Request']] ]); // 注册请求拦截回调 $driver->on('Network.requestIntercepted', function ($params) use ($driver) { $requestHeaders = $params['request']['headers']; if (isset($requestHeaders['Cookie'])) { // 提取目标Cookie字段 echo "捕获到Cookie: " . $requestHeaders['Cookie'] . PHP_EOL; } // 放行请求 $driver->executeCdpCommand('Network.continueInterceptedRequest', [ 'interceptionId' => $params['interceptionId'] ]); }); // 触发触发目标POST请求的操作(比如点击提交按钮) $driver->findElement(WebDriverBy::id('submit-btn'))->click();
方法3:排查Cookie特殊属性并针对性捕获
你遇到的“隐藏”Cookie大概率带有特殊属性,可通过CDP命令全量获取:
- 如果是Partitioned分区Cookie(第三方站点隔离存储),普通
getCookies()无法获取,用CDP命令提取:$allCookies = $driver->executeCdpCommand('Network.getAllCookies', []); // 遍历筛选目标Cookie foreach ($allCookies['cookies'] as $cookie) { if ($cookie['name'] === '你的目标Cookie名') { var_dump($cookie); } } - 若为
SameSite=Strict属性的Cookie,跨站场景下普通存储面板不显示,但CDP命令仍能捕获。
Tampermonkey脚本修复方案
之前监听失败可能是时机或方式不对,试试重写XMLHttpRequest和fetch拦截请求:
// Tampermonkey脚本 (function() { 'use strict'; // 拦截XMLHttpRequest const originalXhrOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, url) { this.addEventListener('loadstart', () => { if (method === 'POST' && url.includes('你的目标接口')) { const cookie = this.getRequestHeader('Cookie'); console.log('XHR请求Cookie:', cookie); // 可将Cookie发送到本地服务保存 } }); return originalXhrOpen.apply(this, arguments); }; // 拦截fetch请求 const originalFetch = window.fetch; window.fetch = function(resource, options) { if (options?.method === 'POST' && resource.includes('你的目标接口')) { const cookie = options.headers?.Cookie || document.cookie; console.log('Fetch请求Cookie:', cookie); } return originalFetch.apply(this, arguments); }; })();
内容的提问来源于stack exchange,提问作者Andry
相关产品推荐
相关产品推荐

