如何快速提高打字速度(伪,脚本调用键盘)

如何快速提高打字速度(伪,脚本调用键盘)

五月 10, 2020 阅读量

如何快速提高打字速度(伪,脚本调用键盘)

本来想搞一个自动复制代码的脚本,后来发现可以用来打字。但是大部分语言模拟键盘主要为了自动化测试……

起因

最早的起因是在B站看了一个用VBA做游戏的视频(然而过去了一个多月,咕咕咕),被视频里写代码的速度被震惊到了(其实视频中所写的代码都是提前大致打好草稿的),然后就有了自动打(复制)代码的想法。
效果演示如下。

只支持键盘上有的按键(英文和字符)。你有中文键盘的话,就当我没说。

实现

1 VBS

最简单暴力的就是VBS,代码简单,速度可控(对打字的模拟最好),但是Windows限定。
有设定2秒延迟,最后会在你鼠标(光标)点的位置开始输出。不过要通过打字程序的验证还是有点问题的,以后的代码都没有做这一步。
如果你读取的文件过长,想中途停下只能通过杀进程……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
'---------------------
'VBS打字脚本
'只支持英文和字符
'author xuchl
'---------------------

dim wshshell
set wshshell = createobject("wscript.shell")
'打开一个记事本
'wshshell.run "notepad"
wscript.sleep 2000

'随机延迟设定
dim max, min, num
max = 90
min = 40

dim fso, f, str, schar
set fso = createobject("Scripting.FileSystemObject")
'数据来源文件
set f = fso.opentextfile("C:\Users\xuchl\Desktop\test.txt", 1, false)

do until f.atendofstream
str = f.ReadLine()
for i = 1 to len(str)
'逐行逐个读取字符
schar = mid(str, i, 1)
'替换特殊字符
schar = replace(schar, "+", "+=")
schar = replace(schar, "^", "+6")
schar = replace(schar, "%", "+5")
schar = replace(schar, "{", "+[")
schar = replace(schar, "}", "+]")
schar = replace(schar, "(", "+9")
schar = replace(schar, ")", "+0")
schar = replace(schar, "~", "+`")
wshshell.sendkeys schar
'随机延迟
num = Int((max - min + 1) * Rnd + min)
wscript.sleep num
'打字模拟用-退格(为了让测试成绩通过机器验证)
if num < 45 then
wshshell.sendkeys schar
wscript.sleep Int((max - min + 1) * Rnd + min)
wshshell.sendkeys "{BACKSPACE}"
end if
next
wshshell.sendkeys "{ENTER}"
loop

f.Close()
set f = nothing
set fso = nothing

1.5 VBA

和VBS类似,但是延迟不好控制。本来还想弄个VB.NET的,但是懒于没有环境,都是Microsoft的产品都差不多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
'---------------------
'VBA打字脚本
'只支持英文和字符
'author xuchl
'---------------------
Sub vbaTyper()

Dim fileRoot$, curChar$
Dim targetStr

fileRoot = "C:\Users\xuchl\Desktop\test.txt"

'读取文本内容
targetStr = Split(ReadUTF(fileRoot), vbCrLf)
If (UBound(targetStr) = 0) Then
targetStr = Split(targetStr(0), vbLf) '换行符不是\r\n时,以\n重新换行
End If

'延迟两秒
'延迟毫秒级不好控制,用Windows API函数Sleep可以但是不想
delay (2)

For i = 0 To UBound(targetStr)
For m = 1 To Len(targetStr(i))
curChar = Mid(targetStr(i), m, 1)
curChar = Replace(curChar, "+", "+=")
curChar = Replace(curChar, "^", "+6")
curChar = Replace(curChar, "%", "+5")
curChar = Replace(curChar, "{", "+[")
curChar = Replace(curChar, "}", "+]")
curChar = Replace(curChar, "(", "+9")
curChar = Replace(curChar, ")", "+0")
curChar = Replace(curChar, "~", "+`")

SendKeys curChar
delay (0.5)
Next
Next

End Sub

Function ReadUTF(ByVal FileName As String) As String
With CreateObject("ADODB.Stream")
.Type = 2 '读取文本文件
.Mode = 3 '读写
.Open
.LoadFromFile FileName
.Charset = "UTF-8" '设定编码
.Position = 2
ReadUTF = .ReadText
.Close
End With
End Function

Function delay(s%)
tm = Timer
Do Until Timer - tm > s
DoEvents
Loop
End Function

2 Java

果然这个才是本命,没有VBS简单,不过可以跨平台使用了(未验证)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
* java打字
* 只支持英文和字符
* @author xuchl
*
*/
public class javaTyper {

public static void main(String[] args) {
try {

// 键码对照
Map<String, Integer> keyCodeMap = new HashMap<String, Integer>();
keyCodeMap.put("~", 0xC0);
keyCodeMap.put("-", 0x2D);
keyCodeMap.put("=", 0x3D);
keyCodeMap.put(" ", (int) '\t');
keyCodeMap.put("[", 0x5B);
keyCodeMap.put("]", 0x5D);
keyCodeMap.put("\\", 0x5C);
keyCodeMap.put(";", 0x3B);
keyCodeMap.put("'", 0xDE);
keyCodeMap.put(",", 0x2C);
keyCodeMap.put(".", 0x2E);
keyCodeMap.put("/", 0x2F);
keyCodeMap.put(" ", 0x20);

// Shift配合用
keyCodeMap.put("`", 0xC0);
keyCodeMap.put("!", 0x31);
keyCodeMap.put("@", 0x32);
keyCodeMap.put("#", 0x33);
keyCodeMap.put("$", 0x34);
keyCodeMap.put("%", 0x35);
keyCodeMap.put("^", 0x36);
keyCodeMap.put("&", 0x37);
keyCodeMap.put("*", 0x38);
keyCodeMap.put("(", 0x39);
keyCodeMap.put(")", 0x30);
keyCodeMap.put("_", 0x2D);
keyCodeMap.put("+", 0x3D);
keyCodeMap.put("{", 0x5B);
keyCodeMap.put("}", 0x5D);
keyCodeMap.put("|", 0x5C);
keyCodeMap.put(":", 0x3B);
keyCodeMap.put("\"", 0xDE);
keyCodeMap.put("<", 0x2C);
keyCodeMap.put(">", 0x2E);
keyCodeMap.put("?", 0x2F);

keyCodeMap.put("0", 0x30);
keyCodeMap.put("1", 0x31);
keyCodeMap.put("2", 0x32);
keyCodeMap.put("3", 0x33);
keyCodeMap.put("4", 0x34);
keyCodeMap.put("5", 0x35);
keyCodeMap.put("6", 0x36);
keyCodeMap.put("7", 0x37);
keyCodeMap.put("8", 0x38);
keyCodeMap.put("9", 0x39);

keyCodeMap.put("a", 0x41);
keyCodeMap.put("b", 0x42);
keyCodeMap.put("c", 0x43);
keyCodeMap.put("d", 0x44);
keyCodeMap.put("e", 0x45);
keyCodeMap.put("f", 0x46);
keyCodeMap.put("g", 0x47);
keyCodeMap.put("h", 0x48);
keyCodeMap.put("i", 0x49);
keyCodeMap.put("j", 0x4A);
keyCodeMap.put("k", 0x4B);
keyCodeMap.put("l", 0x4C);
keyCodeMap.put("m", 0x4D);
keyCodeMap.put("n", 0x4E);
keyCodeMap.put("o", 0x4F);
keyCodeMap.put("p", 0x50);
keyCodeMap.put("q", 0x51);
keyCodeMap.put("r", 0x52);
keyCodeMap.put("s", 0x53);
keyCodeMap.put("t", 0x54);
keyCodeMap.put("u", 0x55);
keyCodeMap.put("v", 0x56);
keyCodeMap.put("w", 0x57);
keyCodeMap.put("x", 0x58);
keyCodeMap.put("y", 0x59);
keyCodeMap.put("z", 0x5A);

Set<String> specialCodeSet = new HashSet<String>();
specialCodeSet.add("~");
specialCodeSet.add("!");
specialCodeSet.add("@");
specialCodeSet.add("#");
specialCodeSet.add("$");
specialCodeSet.add("%");
specialCodeSet.add("^");
specialCodeSet.add("&");
specialCodeSet.add("*");
specialCodeSet.add("(");
specialCodeSet.add(")");
specialCodeSet.add("_");
specialCodeSet.add("+");
specialCodeSet.add("{");
specialCodeSet.add("}");
specialCodeSet.add("|");
specialCodeSet.add(":");
specialCodeSet.add("\"");
specialCodeSet.add("<");
specialCodeSet.add(">");
specialCodeSet.add("?");

// 数据来源文件
BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\xuchl\\Desktop\\test.txt"));
String lineStr = "";
char c;

// JDK自带Robot类,用于为测试自动化。
// 能够控制鼠标和键盘,还能屏幕截图。
Robot r = new Robot();
r.delay(2000);

while ((lineStr = br.readLine()) != null) {
for (int i = 0; i < lineStr.length(); i++) {
c = lineStr.charAt(i);
// 按下键盘按键
if (65 <= c && c <= 90 || specialCodeSet.contains(String.valueOf(c))) {
// 大写字母和部分特殊字符按下shift
r.keyPress(KeyEvent.VK_SHIFT);
}
r.keyPress(keyCodeMap.get(String.valueOf(c).toLowerCase()));

// 释放键盘按键
if (65 <= c && c <= 90 || specialCodeSet.contains(String.valueOf(c))) {
r.keyRelease(KeyEvent.VK_SHIFT);
}
r.keyRelease(keyCodeMap.get(String.valueOf(c).toLowerCase()));
// 延迟,不随机了
r.delay(100);
}
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
}
br.close();

} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (AWTException awte) {
awte.printStackTrace();
}
}
}

3 Node.js

有自己库的语言就是强大啊,比如Python,Go(这两个都不写了,go的go-vgo/robotgo加载不下来),用的第三方的robotjs,不同系统需要的环境不同。
本来很简单就写完了,但是朋友的Deepin跑出的效果和Win10不同。然后在自己的的Deepin中验证,效果一样(主要为<的问题)。刚开始以为是Deepin自己的问题,然后又装了CentOS7(8太大,7下了第三个镜像才搞定GUI),最后效果一样,不知道是不是官方的锅。提了一个issue,还拉上一个英语老师给我看看英语写的对不对,但愿对方能看懂吧。
Node.js也不是很复杂,但是速度不能往小里调。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
nodejs打字
只支持英文和字符
author xuchl
*/
const robot = require("robotjs");
const fs = require('fs');
const readline = require('readline');

// 速度调低明显,把数值调大效果不大
// 800 : Characters per minute
//robot.typeStringDelayed("`1234567890-=[]\;',./~!@#$%^&*()_+", 800);

// 速度调低明显,把数值调小效果不大
// Sets the delay in milliseconds to sleep after a keyboard event. This is 10ms by default.
//robot.setKeyboardDelay(5);

// ==========2 start==========
// deepin,centos(Linux)中robotjs特殊字符对应(<, "更为特殊)
const specialCodeAry = ["~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+", "{", "}", "|", ":", ">", "?"];
// ==========2 end==========

setTimeout(function() {
const readInterface = readline.createInterface({
input: fs.createReadStream('../test.txt')
});

readInterface.on('line', function(line) {
for (let i = 0; i < line.length; i++) {
//robot.keyTap(line.charAt(i)); // 需要配合SHIFT的按键字符会变成不按SHIFT的状态,比如大写字母变小写,*变8
// ==========1 start==========
//robot.typeString(line.charAt(i)); // 所见即所得(windows限定,在Linux里不好使,keyTap效果一样但是大写字母与<除外)
// ==========1 end==========
// ==========2 start==========
// deepin,centos(Linux)中robotjs特殊字符对应(<, "更为特殊)
let curChar = line.charAt(i);
if (curChar === "\"") {
robot.keyTap("'", ["shift"]);
} else if (-1 < specialCodeAry.indexOf(curChar)) {
robot.keyTap(curChar, ["shift"]);
} else {
robot.typeString(curChar);
}
// ==========2 end==========
}
robot.keyTap("enter");
})
}, 2000);

我的安装过程,可以忽略

robotjs编译环境

Win10
因为笔记本换成了NUC,安装时提示没有Python,装了最新的Python(但是它只支持2.7的),然后再安装又提示没有VS库。

执行一句npm install --global --production windows-build-tools环境就齐了(Python2.7也装上了)

Deepin
因为之前搞过别的,基本环境都有。提示缺少X11/extensions/XTest.h
执行sudo apt-get install libx11-devsudo apt-get install xorg-dev后安装成功

CentOS7
这个就比较痛苦了,需要先装系统
使用官网二进制数据包安装Node.js
wget https://nodejs.org/dist/v12.16.3/node-v12.16.3-linux-x64.tar.xz
tar -xvf node-v12.16.3-linux-x64.tar.xz
ln -s /home/xuchl/桌面/node-v12.16.3-linux-x64/bin/node /usr/bin/node
ln -s /home/xuchl/桌面/node-v12.16.3-linux-x64/bin/npm /usr/bin/npm
node -v
npm -v
显示版本号,安装成功
执行npm i robotjs报错
sh: prebuild-install: 未找到命令
sh: node-gyp: 未找到命令
然后没有解决问题,明明Deepin也是这么装的
应该是Node.js安装问题,然后尝试使用yum安装
curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
sudo yum install nodejs
执行npm i robotjs报错
make: g++:命令未找到
执行yum install gcc-c++安装
再安装报错:../src/mouse.c:12:35: 致命错误:X11/extensions/XTest.h:没有那个文件或目录
执行以下命令依旧报错
yum install libX11*
yum install xorg*
yum install libxtst*
yum install libpng*
然后放弃了,真香警告
放大招yum -y upgrade,此命令慎用,因为我是新环境无所谓
执行yum install libXtst-devel后安装成功
跑出结果已经过了晚上12点了

4 没有其他了

本来还想用别的语言写的,只有能够调用键盘,应该都能写。除了上面写过以及提到过的语言,其他的比如C,PHP都可以实现。但是被Node.js搞的头大,就不了了之了,实现逻辑也都差不多。