在 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 (将#修改为@)