Node.js中Puppeteer如何仅拦截匹配指定URL的请求与响应
Puppeteer环境下等效Chrome扩展glob匹配的实现方法
你在Chrome扩展里用的https://audio-akp-quic-control-spotify-com.akamaized.net/audio/*格式的glob通配匹配,在Node.js + Puppeteer环境下,有两种能完全复现匹配精度的实现,能精准捕获你需要的Spotify音频相关请求和响应:
零依赖原生实现(最适配当前的匹配需求)
你当前的匹配规则本质是找所有以固定字符串开头的URL,完全没必要引入第三方匹配库,直接做字符串前缀判断就能实现和glob一模一样的匹配效果,还能避开正则、通配匹配常见的转义误差:
- 先开启Puppeteer的请求拦截权限:
await page.setRequestInterception(true); - 在请求、响应的监听回调里加入匹配判断:
这种写法的匹配精度和你之前用的glob规则完全一致:只要URL匹配到固定域名、固定// 定义和glob规则完全等效的固定URL前缀 const TARGET_URL_PREFIX = 'https://audio-akp-quic-control-spotify-com.akamaized.net/audio/'; // 捕获目标请求 page.on('request', (req) => { // 只要请求URL以上述前缀开头,就命中匹配规则 if (req.url().startsWith(TARGET_URL_PREFIX)) { // 在这里写自定义逻辑:比如记录请求发起时间、请求头信息 console.log('命中目标音频请求:', req.url()); } // 所有请求正常放行,不阻断播放流程 req.continue(); }); // 捕获目标响应(不需要依赖请求拦截配置) page.on('response', async (res) => { if (res.url().startsWith(TARGET_URL_PREFIX)) { // 在这里写自定义逻辑:比如记录响应大小、状态码 console.log('命中目标音频响应,状态码:', res.status()); } });/audio/路径段,后面不管接什么内容(包括带__token__时效参数的长URL、不同长度的音频哈希路径)都会被命中,不会漏抓也不会误判其他同域名下的接口请求。
可复用已有glob规则的实现
如果你后续要支持更复杂的通配规则,不想每次手写前缀判断,可以直接用成熟的glob匹配工具,把你在Chrome扩展里写好的glob表达式直接复用,不需要改语法:
import { isMatch } from 'micromatch'; // 直接复用原有glob表达式 const MATCH_PATTERN = 'https://audio-akp-quic-control-spotify-com.akamaized.net/audio/*'; page.on('request', (req) => { if (isMatch(req.url(), MATCH_PATTERN)) { console.log('通过glob规则命中目标请求:', req.url()); } req.continue(); });
实操注意事项
- 不要用过于宽泛的匹配规则,比如只匹配域名
https://audio-akp-quic-control-spotify-com.akamaized.net/*,这种写法会误捕获同域名下所有非audio路径的请求,和你原本的glob匹配精度不一致。 - 捕获响应时不需要阻断请求流程,只要在
response事件回调里做判断就行,不会干扰Spotify的正常播放逻辑。
内容的提问来源于stack exchange,提问作者newbiedev
相关产品推荐
相关产品推荐

