微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Chrome 扩展全局对象中注入脚本并篡改 shadow DOM

如何解决在 Chrome 扩展全局对象中注入脚本并篡改 shadow DOM

警告:可能涉及一组绕过安全功能的编程不良做法。

我们正在开发一组脚本,用于从某个网站提取公共信息。我使用 ViolentMonkey 在网站中注入脚本,该网站使用 Google 的 reCAPTCHA(请参阅 example)。

为了绕过它,我安装了 Buster: Captcha Solver,这是一个非常简洁的扩展程序,它在 reCAPTCHA 帧上放置了一个图标,点击后会切换到音频解析模式并尝试转录音频。每次尝试都会失败,但很有帮助。

问题是:Buster 检测到 reCAPTCHA 已加载 - 似乎没有足够的理由要求用户点击。我不会说它违背了目的,但我宁愿让它自动运行。我什至注入了一个预点击,它会弹出 reCAPTCHA 模式(,它可以工作),但我无法强制点击 Buster 的图标,因为它包含在 closed shadow DOM 中。

Buster 基本上使用 shadowRoot.appendChild(),所以我尝试设置 @run-at document-start 并篡改 HTMLElement.prototype.attachShadow

HTMLElement.prototype.attachShadow = function(args) {
  return this;
};

理论上这会使 shadowRoot.appendChild() 将子节点直接附加到节点本身,但无论如何,Buster 仍然能够附加影子 DOM。我相信覆盖 HTMLElement.prototype 仅适用于当前全局范围,并且 Buster 在其自己的扩展程序环境中进行了沙盒处理。如果它奏效,这样的事情很可能是可能的:

// and yeah,that's really all I'm trying to achieve
document.querySelector('.button-holder.help-button-holder')
    .shadowRoot
    .getElementById('solver-button')
    .click();

我想编译一个修改过的 Buster's source code 版本,在其中我只使用 .attachShadow({mode: 'open'}),这样我的脚本就可以最终访问它的按钮,但现在这太麻烦了。我也可以但不想为此使用 Chrome 之外的工具(如 AutoHotkey)。

TL;DR

如何使用 ViolentMonkey/TamperMonkey 以编程方式单击关闭的 shadow DOM 内的元素?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。