0

0

浏览器插件如何捕获页面上的XML并上传

幻夢星雲

幻夢星雲

发布时间:2026-03-10 13:00:50

|

901人浏览过

|

来源于php中文网

原创

xml捕获需区分xhr/fetch响应与dom嵌入两类来源:前者须拦截网络请求并解析响应体,后者应直接提取textcontent;混用方法将导致失败。

浏览器插件如何捕获页面上的xml并上传

XML 捕获必须区分来源:XHR 还是 DOM?

浏览器插件无法“全局监听所有 XML”,必须明确目标来源。常见两类:一是页面通过 fetchXMLHttpRequest 加载的 XML 响应(如 RSS、SOAP 接口);二是页面 DOM 中已存在的 <?xml> 声明或 <root><item>...</item></root> 结构。前者需拦截网络请求,后者可直接查询 DOM —— 方法完全不同,混用会导致捕获失败。

  • DOM 中的 XML 通常只是普通 HTML 元素(如 <pre class="brush:php;toolbar:false;">&lt;/code&gt; 里放的 XML 字符串),没有解析为 XML 文档对象,不能用 &lt;code&gt;responseXML&lt;/code&gt;&lt;/li&gt; &lt;li&gt;XHR/fetch 的 XML 响应,只有在 &lt;code&gt;responseType === 'document'&lt;/code&gt; 或服务端返回 &lt;code&gt;Content-Type: application/xml&lt;/code&gt; 且浏览器自动解析时,才可能拿到 &lt;code&gt;responseXML&lt;/code&gt;&lt;/li&gt; &lt;li&gt;现代 fetch 默认不解析 XML,&lt;code&gt;response.text()&lt;/code&gt; 是最稳妥的获取原始 XML 字符串方式&lt;/li&gt; &lt;/ul&gt; &lt;H3&gt;拦截 XHR/fetch 并提取 XML 响应体&lt;/H3&gt; &lt;p&gt;需在 content script 中重写原生方法,捕获响应内容。注意:fetch 拦截比 XHR 更复杂,因它是 Promise 驱动,需包装 &lt;code&gt;response.clone()&lt;/code&gt; 避免 body 被读取多次。&lt;/p&gt; &lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;const originalFetch = window.fetch; window.fetch = function(...args) { return originalFetch(...args).then(response =&gt; { // 只处理明确返回 XML 的响应 const contentType = response.headers.get('content-type'); if (contentType &amp;&amp; /application\/xml|text\/xml/i.test(contentType)) { const cloned = response.clone(); cloned.text().then(xmlStr =&gt; { // 此处发送 XML 字符串到后台脚本或上传接口 chrome.runtime.sendMessage({ type: 'xml-captured', url: response.url, xml: xmlStr.slice(0, 102400) // 限制长度防爆内存 }); }).catch(() =&gt; {}); } return response; }); };</pre> <ul> <li>不要在 fetch 拦截中直接调用 <code>response.text() 后返回新 Response —— 会破坏原始响应流
  • chrome.runtime.sendMessage 需在 manifest.json 中声明 "externally_connectable" 或仅用于内部通信
  • 部分站点使用 blob: URL 或 Service Worker 拦截请求,此时 content script 无法捕获,需改用 webRequest API(需 "webRequest" 权限和 "host_permissions"

从 DOM 提取 XML 字符串的可靠方式

当 XML 以文本形式嵌入 HTML(如 <script type="application/xml"></script><pre class="xml">&lt;/code&gt;、或注释节点),用 &lt;code&gt;textContent&lt;/code&gt; 最安全。避免用 &lt;code&gt;innerHTML&lt;/code&gt;,防止误解析标签。&lt;/p&gt;&lt;div class=&quot;aritcle_card flexRow&quot;&gt; &lt;div class=&quot;artcardd flexRow&quot;&gt; &lt;a class=&quot;aritcle_card_img&quot; href=&quot;/xiazai/code/10454&quot; title=&quot;通吃客零食网整站 for Shopex&quot;&gt;&lt;img src=&quot;https://img.php.cn/upload/webcode/000/000/020/176216580836240.jpg&quot; alt=&quot;通吃客零食网整站 for Shopex&quot; onerror=&quot;this.onerror='';this.src='/static/lhimages/moren/morentu.png'&quot; &gt;&lt;/a&gt; &lt;div class=&quot;aritcle_card_info flexColumn&quot;&gt; &lt;a href=&quot;/xiazai/code/10454&quot; title=&quot;通吃客零食网整站 for Shopex&quot;&gt;通吃客零食网整站 for Shopex&lt;/a&gt; &lt;p&gt;第一步】:将安装包中所有的文件夹和文件用ftp工具以二进制方式上传至服务器空间;(如果您不知如何设置ftp工具的二进制方式,可以查看:(http://www.shopex.cn/support/qa/setup.help.717.html)【第二步】:在浏览器中输入 http://您的商店域名/install 进行安装界面进行安装即可。【第二步】:登录后台,工具箱里恢复数据管理后台是url/sho&lt;/p&gt; &lt;/div&gt; &lt;a href=&quot;/xiazai/code/10454&quot; title=&quot;通吃客零食网整站 for Shopex&quot; class=&quot;aritcle_card_btn flexRow flexcenter&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;span&gt;下载&lt;/span&gt; &lt;/a&gt; &lt;/div&gt; &lt;/div&gt; &lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;// 匹配常见的 XML 容器 const xmlCandidates = [ 'script[type=&quot;application/xml&quot;]', 'script[type=&quot;text/xml&quot;]', 'pre.xml', 'code.xml', 'textarea[lang=&quot;xml&quot;]' ].map(sel =&gt; document.querySelectorAll(sel)).flat(); xmlCandidates.forEach(el =&gt; { let xmlStr = el.textContent.trim(); // 简单校验:开头是否含 &lt;?xml 或 &lt;root 类似结构 if (/^&lt;\?xml\s|^\s*&lt;\w+[\s&gt;]/.test(xmlStr)) { chrome.runtime.sendMessage({ type: 'xml-from-dom', selector: el.outerHTML.substring(0, 50), xml: xmlStr.slice(0, 102400) }); } });</pre> <ul> <li>DOM 提取无法捕获动态生成的 XML(如 JS 拼接后写入 <code>innerHTML 但未挂载到文档)

  • 若 XML 被压缩成一行且无换行,正则 /^ 仍有效;但纯二进制 XML(如 gzip 压缩)无法通过 DOM 提取
  • 注意 CSP 限制:某些站点禁止内联脚本执行,需将逻辑注入到 run_at: "document_idle" 的 content script
  • 上传前必须处理的三个实际问题

    直接 fetch(uploadUrl, { method: 'POST', body: xmlStr }) 很容易失败。真实环境中需确认以下三点:

    • 服务端是否要求 Content-Type: application/xml?还是接受 text/plain 或表单字段?不匹配会返回 400
    • XML 字符串是否含非法控制字符(如 \u0000–\u0008)?上传前建议用 xmlStr.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '') 清理
    • 跨域上传时,若服务端未设置 Access-Control-Allow-Origin,需走 background script 中转(background 不受 CORS 限制)

    最易被忽略的是编码一致性:XML 声明中的 encoding="GBK" 和实际传输字节不匹配,会导致服务端解析乱码。插件中统一用 UTF-8 处理和上传,除非服务端明确要求其他编码。

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    json数据格式
    json数据格式

    JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

    454

    2023.08.07

    json是什么
    json是什么

    JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

    546

    2023.08.23

    jquery怎么操作json
    jquery怎么操作json

    操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

    334

    2023.10.13

    go语言处理json数据方法
    go语言处理json数据方法

    本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

    82

    2025.09.10

    chrome什么意思
    chrome什么意思

    chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

    1051

    2023.08.11

    chrome无法加载插件怎么办
    chrome无法加载插件怎么办

    chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

    832

    2023.11.06

    pdf怎么转换成xml格式
    pdf怎么转换成xml格式

    将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    1945

    2024.04.01

    xml怎么变成word
    xml怎么变成word

    步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

    2119

    2024.08.01

    Kotlin Android模块化架构与组件化开发实践
    Kotlin Android模块化架构与组件化开发实践

    本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

    24

    2026.03.09

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    如何进行WebSocket调试
    如何进行WebSocket调试

    共1课时 | 0.1万人学习

    TypeScript全面解读课程
    TypeScript全面解读课程

    共26课时 | 5.1万人学习

    前端工程化(ES6模块化和webpack打包)
    前端工程化(ES6模块化和webpack打包)

    共24课时 | 5.2万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号