Force React通过注入JavaScript来触发事件

我想做什么

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

问题

整个过程是事件驱动的。 我正在通过DOM设置Text,它不会触发react事件。 我尝试模拟按键,但出于安全原因,似乎chrome的v8禁用了模拟按键的所有方法。 我还试图稍微操纵HTML,但在我对Elements进行更改后反应停止了。 我也尝试了jQuery函数,但这也没有用。

引用没有帮助的事情:

Chrome中的Keydown Simulation通常会触发,但不是正确的键

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

问题

有没有办法强制React解雇这个事件? 或者任何类型的解决方法?

“解决方案”经过两天的研究,我不得不承认,出于安全考虑,这显然是不可能的。 如果你遇到像我这样的情况,你不应该浪费时间去解决这个问题,而不是仅仅寻找一个好的解决方法。 如果我弄明白的话,我会在这里更新我的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.load jquery.js

2.load bililiteRange.js

3.load 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中的机器人类的按键。 这是一个video,显示机器人类在网页中键入文本。 如果你愿意,我可以帮助你使用Java( Processing )。

在过去,当我需要尝试从Javascript中允许的高级模拟按键时,我从辉煌的gremlins.js中获取灵感。 他们得到他们的typer gremlins键入的方式如下(取自src / species / 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); 

这是非常偷偷摸摸的,在过去已经超过了我的一些限制,你可能会尝试一下。