[油猴脚本开发指南]XHR实战百度自定义分享码

兄弟姐妹,哪位知道,[油猴脚本开发指南]XHR实战百度自定义分享码
最新回答
传说甜蜜的味道

2026-10-22 23:28:03

油猴脚本开发指南:XHR实战百度自定义分享码

一、核心功能解析1. XHR劫持原理

通过重写XMLHttpRequest.prototype.send方法,拦截所有通过XHR发送的请求数据。代码中通过addXMLRequestCallback函数实现:

  • 回调队列:将自定义回调函数存入XMLHttpRequest.callbacks数组。
  • 参数拦截:在send方法中遍历回调队列,并检查请求参数(arguments[0])。
  • 条件匹配:若参数包含pwd=且不包含vcode=,触发分享码修改逻辑。
2. 分享码修改逻辑
  • 用户输入:通过prompt弹窗获取4位自定义分享码(默认值8888)。
  • 正则替换:使用正则表达式/pwd=[a-zA-Z0-9]{0,4}&/i匹配原始分享码,替换为用户输入的值。

    正则详解:

    pwd=:固定前缀。

    [a-zA-Z0-9]{0,4}:匹配0到4位字母或数字(原分享码格式)。

    &:固定后缀。

    i标志:忽略大小写(实际未用到字母,可省略)。

二、代码实现要点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触发条件。
五、注意事项
  1. 风险提示:

    代码中明确标注“请勿用于实际”,因缺乏严格条件判断可能导致百度网盘功能异常。

    分享码修改可能违反服务条款,需谨慎使用。

  2. 性能影响:

    全局劫持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劫持技术实现了百度网盘分享码的动态修改,核心步骤包括:

  1. 重写XMLHttpRequest.prototype.send拦截请求。
  2. 通过正则表达式匹配并替换分享码参数。
  3. 结合回调函数监控请求/响应生命周期。

实际应用中需补充更严格的条件判断和错误处理,避免影响目标网站的正常功能。