首页 > 解决方案 > 在 Chrome 扩展全局对象中注入脚本并篡改影子 DOM

问题描述

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

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

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

问题是:Buster 检测到 reCAPTCHA 已加载 - 似乎没有足够的理由要求用户点击。我不会说它违背了目的,但我宁愿让它自动运行。我什至注入了一个预点击,它会弹出 reCAPTCHA 模式(的,它可以工作),但我不能强制点击 Buster 的图标,因为它被封闭在一个封闭的影子 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 源代码,我只是在其中使用.attachShadow({mode: 'open'}),以便我的脚本最终可以访问它的按钮,但现在这太麻烦了。我也可以但不想为此使用 Chrome 之外的工具(如 AutoHotkey)。

TL;博士

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

标签: javascriptgoogle-chrome-extensiontampermonkeyjavascript-injectiongreasemonkey-4

解决方案


推荐阅读