能否拦截CURL请求参数?及登录后读取request.json响应的可行性
嘿,我来帮你拆解这两个问题的解决思路和可行性:
方案一:拦截/获取动态Token并注入请求
首先得明确:既然你无法直接调用生成Token的函数,那这个Token肯定是通过某个前置请求返回,或者在页面DOM/JS上下文里生成的,我们的核心就是先拿到这个Token,再拼到目标请求里。
基于PHP CURL的实现思路
先获取Token:
- 如果Token是通过某个接口返回的(比如对方网站有
/get-token这类接口),先用CURL请求这个接口,从响应里解析出Token:// 先请求获取Token的接口 $tokenCh = curl_init(); curl_setopt_array($tokenCh, [ CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => "http://mywebsite.com/get-token", // 如果需要登录状态,这里要带上登录后的Cookie CURLOPT_COOKIEJAR => 'cookie.txt', CURLOPT_COOKIEFILE => 'cookie.txt' ]); $tokenResponse = curl_exec($tokenCh); curl_close($tokenCh); // 解析响应拿到Token(假设是JSON返回) $tokenData = json_decode($tokenResponse, true); $token = $tokenData['token'] ?? ''; - 如果Token是在页面的JS里生成的(比如页面加载时通过JS计算出Token并存在全局变量里),那单纯CURL无法解析JS,需要用无头浏览器工具(比如PHP的
spatie/browsershot包)渲染页面,提取全局变量里的Token,再拿到Token后发起请求。
- 如果Token是通过某个接口返回的(比如对方网站有
注入Token到目标请求:
拿到Token后,直接拼到你的目标URL里即可:$ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => 1, CURLOPT_CONNECTTIMEOUT => 20, CURLOPT_TIMEOUT => 60, CURLOPT_URL => "http://mywebsite.com/request.json?Token={$token}", CURLOPT_FAILONERROR => true, CURLOPT_COOKIEJAR => 'cookie.txt', CURLOPT_COOKIEFILE => 'cookie.txt' // 如果需要登录状态同步 ]); $jsonString = curl_exec($ch); curl_close($ch);
基于XHR(浏览器端)的实现思路
如果是在浏览器环境下,可以通过以下方式捕获Token:
- 监听页面内的请求:用
fetch拦截或者XMLHttpRequest重写,捕获页面自身发起的带Token的请求,提取Token后复用:// 重写XMLHttpRequest的open方法 const originalOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, url) { this.addEventListener('load', () => { // 检查响应是否包含Token,或者URL里带有Token if (url.includes('request.json') && url.includes('Token=')) { const token = new URL(url).searchParams.get('Token'); // 保存Token,之后自己的请求就用这个token console.log('捕获到Token:', token); // 发起自己的XHR请求 const xhr = new XMLHttpRequest(); xhr.open('GET', `http://mywebsite.com/request.json?Token=${token}`); xhr.onload = () => console.log(xhr.responseText); xhr.send(); } }); return originalOpen.apply(this, arguments); }; - 提取DOM/全局变量里的Token:如果Token被渲染到DOM元素(比如隐藏的input)或者存在全局变量(比如
window.globalToken),直接读取即可:// 从DOM提取 const token = document.querySelector('#token-input').value; // 从全局变量提取 const token = window.globalToken;
方案二:登录后直接读取request.json响应——完全可行!
这其实是更稳妥的方案,前提是对方网站的request.json接口是基于登录会话授权的(也就是说,登录后服务器通过Cookie/会话标识确认你的身份,自动生成或验证Token)。
实现步骤(PHP CURL为例):
- 模拟登录,保存会话Cookie:
$loginCh = curl_init(); curl_setopt_array($loginCh, [ CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => "http://mywebsite.com/login", CURLOPT_POST => 1, CURLOPT_POSTFIELDS => http_build_query([ 'username' => 'your-username', 'password' => 'your-password' ]), CURLOPT_COOKIEJAR => 'cookie.txt', // 保存登录后的Cookie CURLOPT_COOKIEFILE => 'cookie.txt' ]); $loginResponse = curl_exec($loginCh); curl_close($loginCh); - 带着登录Cookie请求request.json:
此时服务器会识别你的登录状态,返回正确的响应(如果接口需要Token,可能会自动在响应里包含,或者不需要Token直接返回数据):$ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => 1, CURLOPT_CONNECTTIMEOUT => 20, CURLOPT_TIMEOUT => 60, CURLOPT_URL => "http://mywebsite.com/request.json", CURLOPT_FAILONERROR => true, CURLOPT_COOKIEFILE => 'cookie.txt' // 带上登录的Cookie ]); $jsonString = curl_exec($ch); curl_close($ch);
需要注意的是:如果request.json接口必须显式携带Token参数,即使登录后也需要,那你可以在登录后,先请求一次request.json(或者获取Token的接口)拿到Token,再按方案一的方式注入。
内容的提问来源于stack exchange,提问作者Dreg Korig
相关产品推荐
相关产品推荐

