Node.js JavaScript:在服务器上模拟按键(像宏一样)

Posted

技术标签:

【中文标题】Node.js JavaScript:在服务器上模拟按键(像宏一样)【英文标题】:Node.js JavaScript: Simulate Keypress on Server (Like a Macro) 【发布时间】:2014-02-18 09:06:07 【问题描述】:

我正在尝试获取一个 node.js 脚本来模拟按键,例如向上箭头或 a 按钮。具体来说,我正在尝试克隆Twitch Plays Pokemon。基本上,每当通过 IRC 发送命令(上、下、左、右、a、b、选择、开始)时,服务器都会模拟按键,进而控制游戏机模拟器。到目前为止,我已经使用 node.js 的 IRC 模块编写了这个:

var config = 
    channels: ["#tron"],
    server: "irc.freenode.net",
    botName: "wyatt"
;

var irc = require("irc");

var bot = new irc.Client(config.server, config.botName, 
    channels: config.channels
);

var commandHandler = function(from, text) 
    if(text.toLowerCase() === "up"||text.toLowerCase() === "down"||text.toLowerCase() === "left"||text.toLowerCase() === "right"||text.toLowerCase() === "a"||text.toLowerCase() === "b"||text.toLowerCase() === "select"||text.toLowerCase() === "start") 
        bot.say(config.channels[0], from.toUpperCase() + " sent the " + text.toUpperCase() + " command!");
     else 
        bot.say(config.channels[0], from.toUpperCase() + ", that wasn't a valid command!");
    
;

bot.addListener("message", function(from, to, text, message) 
    commandHandler(from, text);
);

要运行我的脚本,我在命令提示符中键入 node scriptName.js。我正在使用 Windows 7。

这会连接到 freenode 频道 #tron,我将其用于测试目的,因为它似乎主要处于休眠状态。

当用户输入一个接受的命令时,它会发送一条消息,如“NIMAID 发送了 LEFT 命令!”,否则它会发送“NIMAID,那不是一个有效的命令!”。事实上,它完美无缺。所以我需要做的就是找到一种方法来发送按键,而最终的脚本只是一个 switch 语句。

问题是我可以通过搜索互联网找到的任何参考资料都谈到在浏览器环境中使用 node.js,使用 JQuery 或类似的东西。我需要将按键发送到模拟器。

tldr:我需要将按键从 node.js 脚本发送到在 Windows 7 服务器桌面上运行的应用程序。

有什么办法吗?

【问题讨论】:

您的目标是什么运行环境和模拟器?在浏览器世界之外,密钥处理是非常平台特定的。 正如我所说,我使用的是 Windows 7 Professional 64 计算机。我希望能够对特定窗口执行诸如 sendkeys 之类的操作。这样,只要按键到达窗口,我运行的模拟器就无关紧要了。如果真的归结为它,我计划使用 Visualboy Advance。 对于 windows - 我使用 node 的 exec 函数来运行一个调用 pywin32 键盘事件的 python 脚本。对于 linux,您可以使用 xdotool。 Here's 我调用它的文件。我也在为程序使用node。 【参考方案1】:

我也制作了一个节点模块来执行此操作: https://github.com/kylepaulsen/kbm-robot

var robot = require("kbm-robot");

robot.startJar();

robot.press("alt")
    .press("tab")
    .sleep(100)
    .release("tab")
    .release("alt")
    .sleep(100)
    .typeString("Hello World!")
    .go()
    .then(robot.stopJar);

【讨论】:

我尝试在 Ubuntu 16 中使用这个,但有一个错误。 stopJar() 不起作用。因此,每次启动应用程序时,都会执行一个新的 jar 并保留在后台。初始化几次后,操作系统开始挂起,后来完全死机。【参考方案2】:

显然,在 npm 注册表中有一个 win_keyboard 模块,有人编写它来控制 Windows 中的键盘。你可以运行npm install win_keyboard 并使用它;它似乎完全符合您的要求。

【讨论】:

谢谢,这看起来绝对完美!我不知道我怎么没找到。但是,每当我尝试执行var keyboard = require("win_keyboard"); 时,我都会得到http://pastebin.com/sNFViRj5。老实说,我不明白这意味着什么,除了 win_keyboard 库不起作用。有什么帮助吗? 您需要运行 32 位版本的 Node:64 位版本不能调用 32 位扩展。 (source) 如果你真的想要一个 64 位版本,请尝试给作者发电子邮件并要求他们发布模块的源代码:github.com/junku901 好的,我安装32位版本。当我尝试做var keyboard = require("win_keyboard"); 时,它告诉我它找不到win_keyboard 节点。所以,我再次执行 npm install win_keyboard ,它看起来像已安装。但是,当我检查我的 node_modules 文件夹时,你瞧,它实际上 删除了 win_keyboard 文件夹!当我将 .node 文件复制到脚本目录并执行 var keyboard = require("./win_keyboard"); 时,它仍然找不到它!这变成了一连串越来越乏味的问题,但是有人可以再次帮助我吗? :) 链接已断开【参考方案3】:

您可以尝试替代 RobotJS。这是一个非常小的跨平台库,用于将密钥发送到您的操作系统,称为 node-key-sender。我在对 RobotJS 和 kbm-robot 感到沮丧后开发。

使用npm install --save-dev node-key-sender 安装它。

并使用以下命令向键盘发送文本:

var ks = require('node-key-sender');
ks.sendText('This is my text');

查看文档页面:https://www.npmjs.com/package/node-key-sender。

【讨论】:

以上是关于Node.js JavaScript:在服务器上模拟按键(像宏一样)的主要内容,如果未能解决你的问题,请参考以下文章

node.js 初识node.js,运行在服务端的 JavaScript

Node.js 入门:运行在服务端的 JavaScript

使用 node.js 在 javascript 服务器中运行 html

Node.js 简介

在 Node.js / 服务器端 javascript 中防止 XSS

在Javascript(node.js,express.js,ejs)中访问服务器端变量[关闭]