按键精灵

简介

基本使用

  • 教程:知识库API命令大全 (同IDE脚本中基本命令和全部命令)、官方教程
  • 安装插件
    • 按键精灵 - 附件 - 添加
    • 或者按键精灵 - 脚本 - 全部命令 - 插件命令 - 右键导入(如此导入可以查看API)
    • 从资源库中搜索插件
  • 打包发布:按键精灵编辑器 - 发布 - 输入生成的exe文件名
    • 打包需要联网
    • 如果脚本中使用了插件,打包也一并会加入进去,因此用户无需安装任何环境,也无需安装,双击脚本即可运行

语法

  • 变量的作用域。参考:http://bbs.anjian.com/showtopic.aspx?topicid=406354&forumpage=1&page=1
    • 按键中有Dim、DimEnv、Global,这3个定义变量的命令
    • Dim:定义一个变量,支持数组。可以在主线程和子程序中定义分别定义。在主线程中定义为全局变量,若不定义默认为全局变量。在子程序内定义为局部变量,若不定义默认为全局变量。定义的变量仅在主线程有效,不支持多线程、QUI事件内、其他脚本内值的传递
  • 窗体程序
    • Input换行:Form1.InputBox1.Text = "123" & Chr(13) & Chr(10) & "456"

常用代码

1
2
3
4
5
6
7
8
9
10
11
12
13
' ## 解析json字符串
ParseJson json 'json字符串值为 {title: "123", mobile_link: "http://www.aezo.cn"}

Sub ParseJson(str)
Dim sc, a, b
Set sc = CreateObject("MSScriptControl.ScriptControl")
sc.Language = "JScript"
sc.AddCode "var o = " & str & ";"
a = sc.Eval("o.title")
b = sc.Eval("o.mobile_link")
TracePrint a
TracePrint b
End Sub

Web表单自动填写

  • 官方默认提供WQM.exe(IE内核)环境的WEB操作。但是使用chrome浏览器则需要单独安装插件,具体见下文
1
2
3
4
5
6
7
Plugin ProcessID=Web.Bind("WQM.exe")
If ProcessID=0
EndScript
EndIf
Plugin Web.Go("www.baidu.com")
Plugin Web.HtmlInput("按键精灵", "id:kw")
Plugin Web.HtmlClick("id:sb")

基于Chrome环境表单填写

参考:http://bbs.anjian.com/showtopic-588808-1.aspx

  • 下载按键chrome插件并安装(支持chrome 45以上版本,暂不支持xp系统)
  • 新建脚本
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
// 启动浏览器(浏览器安装位置可通过进程中的chrome.exe找到)
path = "c:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
If Plugin.chrome.launch(path, "--user-data-dir=D:\temp\chrome") = False Then
MsgBox "启动失败"
ExitScript
End If

// 获取启动浏览器后的默认标签
id = Plugin.chrome.get_ids()
If id = "" Then
TracePrint "获取标签id失败"
ExitScript
End If

For i=1 To 3
doSubmit(i)
Next

MsgBox "脚本执行完毕"
Call Plugin.chrome.quit()


Function doSubmit(index)
// 跳转到地址
Call Plugin.chrome.load(id, "http://www.vrbrothers.com/cn/wqm/demo/pages/Demo-ComplexForm.aspx")

// 等待载入完成
Do
Delay 2000
TracePrint "..."
Loop While Plugin.chrome.is_loading(id)

username = "用户名"
// 用户名
Call Plugin.chrome.exec_js(id, "document.querySelector('#ctl00_mainContent_tbUsername').value='" & username & "';")
// 密码
Call Plugin.chrome.exec_js(id, "document.querySelector('#ctl00_mainContent_tbPassword').value='password';")
// EMail地址
Call Plugin.chrome.exec_js(id, "document.querySelector('#ctl00_mainContent_tbEMail').value='abc@123.com';")
// 性别,$字符是CSS选择器的特殊字符,所以需要用反斜杆转义
Call Plugin.chrome.exec_js(id, "document.querySelectorAll('[name=ctl00\\$mainContent\\$rblGender')[0].checked=true;")

// 省份城市,联动下拉列表需要触发change事件
change_event = "var ev = document.createEvent('HTMLEvents');" & _
"ev.initEvent('change', false, true);"
Call Plugin.chrome.exec_js(id, "document.querySelector('#ctl00_mainContent_ddlProvince').selectedIndex=1;")
Call Plugin.chrome.exec_js(id, change_event & "document.querySelector('#ctl00_mainContent_ddlProvince').dispatchEvent(ev);")
Call Plugin.chrome.exec_js(id, "document.querySelector('#ctl00_mainContent_ddlCity').selectedIndex=2;")
Call Plugin.chrome.exec_js(id, change_event & "document.querySelector('#ctl00_mainContent_ddlCity').dispatchEvent(ev);")
// 求职意向
Call Plugin.chrome.exec_js(id, "document.querySelector('#ctl00_mainContent_lbObjectives').options[0].selected=false;")
Call Plugin.chrome.exec_js(id, "document.querySelector('#ctl00_mainContent_lbObjectives').options[1].selected=true;")
Call Plugin.chrome.exec_js(id, "document.querySelector('#ctl00_mainContent_lbObjectives').options[2].selected=true;")
// 爱好
Call Plugin.chrome.exec_js(id, "document.querySelector('#ctl00_mainContent_cblHobies_0').checked=true;")
Call Plugin.chrome.exec_js(id, "document.querySelector('#ctl00_mainContent_cblHobies_1').checked=true;")
// 自我评价
Call Plugin.chrome.exec_js(id, "document.querySelector('#ctl00_mainContent_tbSelfAssement').value='aaaaa\nbbbbb\nccccc';")
// 我已阅读并接受注册协议
Call Plugin.chrome.exec_js(id, "document.querySelector('#ctl00_mainContent_cbAcceptTerms').checked=true;")

'MsgBox "表单填写完成,点击确定继续"
// 提交
Call Plugin.chrome.exec_js(id, "document.querySelector('#ctl00_mainContent_btnSubmit').click();")

Do
Delay 1000
TracePrint "..."
Loop While Plugin.chrome.is_loading(id)

// 获取结果
Dim i, j, rows_len, str, InfoStr
rows_len = CInt(Plugin.chrome.exec_js(id, "document.querySelector('table').rows.length"))
InfoStr = CStr(index) + ": "
For i = 0 To rows_len - 1
str = ""
cells_len = CInt(Plugin.chrome.exec_js(id, "document.querySelector('table').rows[" & i & "].cells.length"))
For j = 0 To cells_len - 1
str = str & Plugin.chrome.exec_js(id, "document.querySelector('table').rows[" & i & "].cells[" & j & "].innerText")
str = str & " "
Next
'TracePrint str
InfoStr = InfoStr + str + ", "
Next
TracePrint InfoStr
End Function

POST操作

参考:http://bbs.anjian.com/search.aspx?type=&searchid=4593599&keyword=&poster=&posttableid=0

1
2
3
4
5
6
7
8
' http://bbs.anjian.com/showtopic-569777-1.aspx
' XHR有2种使用方式:对象或者API。API则一般基于C完成,对象方式使用XHR如下。在window里,可以创建很多种形式的XHR对象,罗列如下:
Set http = CreateObject("Microsoft.XMLDOM") ' 太老了,应该废弃使用,win95-现在
Set http = CreateObject("Msxml2.XMLHTTP.6.0") ' 兼容XP-现在
Set http = CreateObject("Msxml2.XMLHTTP") ' 相当于.3.0版本,如果出现.6.0版本无法创建的情况用这个(出现在没打升级补丁包的XP)
Set http = CreateObject("msxml2.Serverxmlhttp.6.0") ' 功能上来说比上上面的强
Set http = CreateObject("msxml2.Serverxmlhttp") ' 相当于.3.0版本,如果出现.6.0版本无法创建的情况用这个(出现在没打升级补丁包的XP)
Set http = CreateObject("WinHttp.WinHttpRequest.5.1") ' 最牛组建,强烈推荐,使用上几乎功能限制(xp-现在)
  • 案例
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
'登录按键精灵网站
Dim username, password, cookie, buf
username = "xxx" '你的帐号
password = "xxx" '你的密码
buf = "username=" & username & "&cookietime=2592000&password=" & password & "&quickforward=yes&handlekey=ls"
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
http.open "POST", "http://bbs.anjian.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1", False
'表示我们所用的浏览器能接受的Content-type
'http.setRequestHeader "Accept", "application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*"
'http.setRequestHeader "Referer", "http://bbs.anjian.com/forum.php" '当前页面是从那个页面链接来的
'http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" '表示客户端提交给服务器文本内容的编码方式
'http.setRequestHeader "Accept-Encoding", "gzip, deflate"
'http.setRequestHeader "Host", "bbs.anjian.com" '所请求的主机
'http.setRequestHeader "Content-Length", Len(buf) '表示提交的数据字节大小
'http.setRequestHeader "Connection", "Keep-Alive" '数据传递完并不立即关闭连接
'http.setRequestHeader "Cache-Control", "no-cache" '返回消息中的Cache用于指定网页缓存
'http.setRequestHeader "Cookie", cookie
http.send buf
cookie = http.getResponseHeader("Set-Cookie")'获取Cookie设置

'再次请求
http.open "GET", "http://bbs.anjian.com/", False
Http.Send
xmlBody = http.ResponseBody
Set ObjStream = CreateObject("Adodb.Stream")
With ObjStream
.Type = 1 '2:文本模式读取,1:二进制模式
.Mode = 3 '3:读写,1:读,2:写
.Open
.Write xmlBody
.Position = 0
.Type = 2
.Charset = "UTF-8"
BytesToBstr = .ReadText
.Close
End With

Call Plugin.Sys.SetCLB(BytesToBstr)

MsgBox "已将登陆后论坛的源文件放到剪切板,粘贴到记事本即可看到。"
Set http = Nothing '销毁对象

插件编写

  • TSPlug4.19插件开源 ^1

    • 插件使用VC2008开发,使用C++语言,和极少的汇编语言开发
    • 可直接使用开源的TSPlug.dll文件,或下载源码在vs中自行编译出TSPlug.dll文件,然后将dll文件导入到按键精灵编辑器中即可
    • 按键使用

      1
      2
      3
      4
      '返回TSPlug版本
      TracePrint Plugin.TSPlug.Ver()
      '打开记事本程序后可获取窗口句柄
      TracePrint Plugin.TSPlug.FindWindow("", "记事本")

参考文章

ChatGPT开源小程序