强制 React 通过注入的 JavaScript 触发事件

IT技术 javascript jquery reactjs
2021-05-19 15:48:17

我正在尝试做什么

我目前正在为 Web-Whatsapp 编写一个小聊天机器人。由于 js 注入简单,我决定使用 chrome 扩展。有一个语音消息按钮,当您开始输入内容时,该按钮会切换为发送文本的按钮。React 删除语音消息元素并呈现发送按钮。

问题

这整个过程是事件驱动的。我正在通过 DOM 设置文本,它不会触发react事件。我试图模拟按键,但出于安全原因,似乎 chrome 的 v8 禁用了模拟按键的所有方式。我还尝试对 HTML 进行一些操作,但是在我对元素进行更改后,react 停止工作。我也为此尝试了 jQuery 函数,但这也不起作用。

对没有帮助的事情的引用:

Chrome 中的 Keydown 模拟正常触发但不是正确的键

https://api.jquery.com/keypress/

问题

有没有办法强制 React 触发事件?或者任何一种解决方法?

4个回答

“解决方案” 经过两天的研究,我不得不承认,出于安全原因,这在我尝试的方式上显然是不可能的。如果你遇到过和我一样的情况,你不应该浪费时间尝试解决这个问题,而不仅仅是寻找一个好的解决方法。如果我想通了,我会在这里更新我的 WebWhatsapp-bot。

使用以下库

1. https://github.com/dwachss/bililiteRange/blob/master/bililiteRange.js 2. https://github.com/dwachss/bililiteRange/blob/master/jquery.sendkeys.js

按以下顺序在 chrome 控制台中加载(粘贴到控制台中)这个 js 脚本

1.加载jquery.js

2.加载bililiteRange.js

3.加载jquery.sendkeys.js

现在您可以将文本发送到 Whatsapp 输入框,如下例所示:

var input_op=jQuery("#main div.pluggable-input-body.copyable-text.selectable-text");
input_op.sendkeys("hello");

为了刺激发送按钮上的 Click 事件,请执行以下操作:

function triggerMouseEvent(node, eventType) {

    var clickEvent = document.createEvent('MouseEvents');
    clickEvent.initEvent(eventType, true, true);
    node.dispatchEvent(clickEvent);
}

var d = document.querySelector("#main span[data-icon="send"]");
triggerMouseEvent(d, "click"); //stimulate mouse event in chrome

完毕

Chrome 不允许任何页面模拟按键操作,但您可以使用外部应用程序进行模拟。Java 最适合这类东西。从您的页面请求服务器请求 Java 应用程序为您执行按键操作。chrome 不会阻止来自 Java 机器人类的按键。是一个视频,展示了 Robot 类在网页中输入文本。如果您愿意,我可以帮助您处理Java(处理)。

过去,当我需要尝试从 Javascript 允许的最高级别模拟按键时,我从出色的gremlins.js 中获得灵感他们得到他们的方式打字员小鬼到类型为(摘自下面的src /物种/ typer.js):

// Create a generic event
var myEvent = document.createEventObject ?
    document.createEventObject() :
    document.createEvent("Events");

// 'init' the event as a keypress
myEvent.initEvent('keypress', true, true);

// Fill in details
myEvent.keyCode = key;
myEvent.which = key;
myEvent.keyCodeVal = key;

// Fire it on your target
targetElement.dispatchEvent ?
    targetElement.dispatchEvent(myEvent) :
    targetElement.fireEvent('on' + eventType, myEvent);

它非常狡猾,过去对我来说已经超过了一些限制,你可以尝试一下。