油猴脚本开发指南:XHR实战百度自定义分享码
一、核心功能解析1. XHR劫持原理通过重写XMLHttpRequest.prototype.send方法,拦截所有通过XHR发送的请求数据。代码中通过addXMLRequestCallback函数实现:
- 回调队列:将自定义回调函数存入XMLHttpRequest.callbacks数组。
- 参数拦截:在send方法中遍历回调队列,并检查请求参数(arguments[0])。
- 条件匹配:若参数包含pwd=且不包含vcode=,触发分享码修改逻辑。
2. 分享码修改逻辑二、代码实现要点1. 劫持函数结构function addXMLRequestCallback(callback) { if (XMLHttpRequest.callbacks) { XMLHttpRequest.callbacks.push(callback); } else { XMLHttpRequest.callbacks = [callback]; const oldSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = function() { for (let i = 0; i < XMLHttpRequest.callbacks.length; i++) { XMLHttpRequest.callbacks[i](this); } // 参数处理逻辑 if (arguments.length !== 0 && arguments[0]?.indexOf) { if (arguments[0].indexOf('pwd') !== -1 && arguments[0].indexOf('vcode') === -1) { const number = prompt("输入默认修改的四位分享码,默认:8888", "8888") || '8888'; arguments[0] = arguments[0].replace(/pwd=[a-zA-Z0-9]{0,4}&/i, `pwd=${number.slice(0, 4)}&`); } } oldSend.apply(this, arguments); }; }}2. 关键优化点- 安全性:添加可选链操作符(?.)避免arguments[0]为null时的错误。
- 输入处理:使用number.slice(0, 4)确保分享码截断为4位。
- 默认值:prompt返回null时回退到8888。
三、调试与验证1. 劫持成功标志- 控制台日志:检查堆栈跟踪中是否出现脚本名称。
- 网络请求:通过浏览器开发者工具的Network面板,观察被修改的XHR请求参数。
2. 常见问题- 劫持失败:若网页在脚本加载前已发送XHR,需使用@run-at document-start强制提前执行。
- 误拦截:当前条件(pwd存在且vcode不存在)可能误判其他请求,建议结合URL路径(如/share/set)进一步过滤。
四、扩展应用1. 响应数据劫持通过监听load事件获取服务器返回数据:
addXMLRequestCallback(xhr => { xhr.addEventListener("load", () => { if (xhr.readyState === 4 && xhr.status === 200) { console.log("拦截到响应URL:", xhr.responseURL); console.log("响应数据:", xhr.responseText); } });});2. 其他劫持方法- Proxy/Object.defineProperty:适用于劫持函数返回值(如fetch API)。
- MutationObserver:监控DOM变化,间接影响XHR触发条件。
五、注意事项风险提示:
代码中明确标注“请勿用于实际”,因缺乏严格条件判断可能导致百度网盘功能异常。
分享码修改可能违反服务条款,需谨慎使用。
性能影响:
全局劫持XHR可能增加页面负载,建议仅针对特定请求过滤。
六、完整示例脚本// ==UserScript==// @name 百度网盘分享码修改器// @namespace http://tampermonkey.net///
@version 0.1// @description 临时修改百度网盘分享码(仅演示)// @match *://pan.baidu.com/*// @run-at document-start// ==/UserScript==(function() { 'use strict'; function addXMLRequestCallback(callback) { // 同上实现... } addXMLRequestCallback(xhr => { xhr.addEventListener("load", () => { if (xhr.readyState === 4 && xhr.status === 200) { console.log("请求完成:", xhr.responseURL); } }); });})();七、总结本指南通过XHR劫持技术实现了百度网盘分享码的动态修改,核心步骤包括:
- 重写XMLHttpRequest.prototype.send拦截请求。
- 通过正则表达式匹配并替换分享码参数。
- 结合回调函数监控请求/响应生命周期。
实际应用中需补充更严格的条件判断和错误处理,避免影响目标网站的正常功能。