我想做什么
我目前正在为Web-Whatsapp写一个小聊天机器人。由于简单的js注射,我决定使用镀铬扩展。有一个语音留言按钮,可以在您开始输入内容时切换到发送文本的按钮。 React删除语音邮件元素并呈现发送按钮。
问题
这整个过程都是事件驱动的。我正在通过DOM设置Text,它不会触发react事件。我试图模拟一个按键,但似乎chrome的v8禁用了出于安全原因模拟按键的所有方法。我也试图稍微操纵HTML,但在我对Elements进行更改后反应停止了。我也尝试了jQuery函数,但这也不起作用。
对没有帮助的事情的引用:
Keydown Simulation in Chrome fires normally but not the correct key
问题
有没有办法强制React解雇这个事件?或者任何形式的解决方法?
答案 0 :(得分:3)
<强> “解决方案”强> 经过两天的研究,我不得不承认,出于安全考虑,我在尝试这种方式时显然不可能。如果你遇到像我这样的情况,你不应该浪费时间去解决这个问题,而不是仅仅寻找一个好的解决方法。如果我弄清楚的话,我会在这里更新我的WebWhatsapp-bot。
答案 1 :(得分:1)
使用以下库
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
完成
答案 2 :(得分:0)
Chrome不允许任何页面模拟按键,但您可以使用外部应用程序执行此操作。 Java是最好的东西。从您的页面请求服务器请求Java应用程序为您执行按键操作。 chrome不会阻止Java中机器人类的按键。 Here是一个视频,显示机器人类在网页中键入文本。如果您愿意,我可以帮助您使用Java(Processing)。
答案 3 :(得分:0)
过去,当我需要尝试从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);
它非常偷偷摸摸,过去对我有一些限制,你可以尝试一下。
答案 4 :(得分:0)
在插入文本后立即尝试以下两种操作:
range.startContainer.dispatchEvent(new Event('input',{bubble:true,cancelable:false})))