javascript - 在 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 内的元素?
解决方案
推荐阅读
- c - 如何解决vs代码中的包含路径错误?
- java - 如何防止 JLayeredPane 拥抱 JFrame 的顶部?
- reactjs - 谁能向我解释这个自定义反应钩子功能?
- python - 将日期+时间转换为日期格式
- reactjs - 有没有办法通过遍历数组来动态地从 react-icons 导入?
- sass - 在下一个 js 中使用 Sass 嵌套选择器
- reactjs - Django并通过谷歌身份验证反应登录
- python - actor ImplicitFunc is too large 错误
- python - Python selenium 显式等待 for 循环中的随机错误
- hyperledger-fabric - 每个组织的单独订购者