我的TodoList增加了一项,Appium | Airtest 抖音自动评论、创意评论(所有评论/前一百评论男女占比 | 所有评论词云),记录了当时的一个想法。Appium和Airtest都可用于移动端自动化测试,Airtest是网易家的,想做评论词云是因为在这之前用Appium写了一个爬个人微信朋友圈词云图的程序(见图1),同时Airtest操作更简单,也在考虑的范围。
再后来,一直未实施,主要是觉得得用手机连着电脑,不能随时随地操作,就搁置了。近段时间因为工作时的一个想法,又把这事提起来了。业务场景比较特殊,可能会涉及版权问题,就不细说,简言之,想实现某注册机自动生成注册码功能,继而接触到了按键精灵。按键精灵很早就存在,也很早就有所耳闻,但一直未实地接触,刚好借这个机会接触一下。用按键精灵PC版实现了注册机自动生成注册码功能,在实现的过程中接触到了按键精灵手机版,孤陋寡闻了,一个神奇的存在,立马就想到了可以用它先实现个简单的抖音自动评论功能吧。
前言有点啰嗦了。。。,喏,这个是微信朋友圈词云图,图1
过了前言是导语啊,看了这篇文章,你可以了解到哪些内容:
1. 某注册机自动生成注册码——按键精灵PC版脚本编写
2. 抖音自动评论——按键精灵手机版使用及脚本编写
3. Lua插件使用及编写
4. 拓展功能,看结尾Tips
5. 非技术工作者可以了解到,很多功能表现,没有那么复杂,程序可以代替手工
6. ++
不是本文重点,会简单概过(Kuo)。按键精灵官网下载地址http://download.myanjian.com/,可下载按键精灵PC版,安卓版,按键精灵手机助手。
此处下载安装按键精灵PC端,PC版首页:
脚本编写界面(需要注意红色箭头指向的几个地方,了解一下相关功能项):
学习方式:按键精灵使用的是Q语言,在VBScript语言基础上发展来的,如果对VBScript语言有了解更好一些,没有了解也没关系,注意上图脚本编写界面中的基本命令和全部命令标签,基础命令标签可通过点击自动生成代码,全部命令标签大部分方法通过代入参数也可自动生成代码,把基本命令和全部命令相关方法看一遍,看的过程中就会对要实现的功能有个大概的构思,清楚会用到哪些方法,编写脚本过程中再去官网、其它地方了解下相关知识点,基本就入门了。
小Tips:
1. 界面标签页可编写窗体界面,包含各种控件。
2. 发布菜单可导出脚本,脚本依赖PC版运行环境;可制作按键小精灵,按键小精灵可生成exe程序,脱离PC版运行环境独立运行。
3. 善用命令帮助文档和命令搜索功能
某注册机自动生成注册码,主要用到了Window窗口插件里的方法,同时也用到了抓抓功能,通过动态找窗口句柄的方式实现具体的功能,Plugin.Window.FindEx( )函数有坑,需要在实践过程中理解参数2子窗口句柄的用法。 其它没有介绍到的,如有疑问,欢迎交流。
某注册机自动生成注册码代码示例(如有更好实现方式,欢迎指导,谢谢):
Dim MachineCode, SerialNum, RegistCode
//打开注册机
Call RunApp("D:\SoftWare\keygen.exe")
Delay 500
//接收机器码
Rem InputMach
MachineCode = InputBox("请输入机器码:", "输入注册码")
If MachineCode = "" Then
Goto InputMach
End If
TracePrint "MachineCode: " & MachineCode
//查找窗口类名("#32770")或者标题("Keymaker"),返回找到的句柄Hwnd
Hwnd = Plugin.Window.Find("#32770", "Keymaker")
//根据父窗口句柄(Hwnd)查找子窗口匹配类名("Edit")或者匹配标题(""),返回找到匹配的句柄MachineIdEx
MachineIdEx = Plugin.Window.FindEx(Hwnd, 0, "Edit", 0)
TracePrint "MachineIdEx: " & MachineIdEx
//修改Keymaker标题
Call Plugin.Window.SetText(Hwnd,"注册码自动生成")
//自动输入机器码
Call Plugin.Window.SendString(MachineIdEx, MachineCode)
//根据父窗口句柄(Hwnd)查找子窗口匹配类名("Button")或者匹配标题("&Generate"),返回找到匹配的句柄GenerateEx
GenerateEx = Plugin.Window.FindEx(Hwnd, 0, "Button", "&Generate")
TracePrint "GenerateEx: " & GenerateEx
//按下Generate按钮,生成注册码
Call Plugin.Window.SendKeyDown(GenerateEx, 13)
//根据父窗口句柄(Hwnd)查找子窗口匹配类名("Static")或者匹配标题("Your machine ID:"),返回找到匹配的句柄MachineIdLabelEx
MachineIdLabelEx = Plugin.Window.FindEx(Hwnd, 0, "Static", "Your machine ID:")
TracePrint "MachineIdLabelEx: " & MachineIdLabelEx
//根据父窗口句柄(Hwnd)查找子窗口匹配类名("Edit")或者匹配标题(""),返回找到匹配的句柄SerialNumEx
SerialNumEx = Plugin.Window.FindEx(Hwnd, MachineIdLabelEx, "Edit", 0)
TracePrint "SerialNumEx: " & SerialNumEx
//获取序列号
SerialNum = Plugin.Window.GetTextEx(SerialNumEx, 1)
TracePrint "SerialNum: " & SerialNum
//根据父窗口句柄(Hwnd)查找子窗口匹配类名("Button")或者匹配标题(""),返回找到匹配的句柄ButtonFrameEx
ButtonFrameEx = Plugin.Window.FindEx(Hwnd, 0, "Button", 0)
TracePrint "ButtonFrameEx: " & ButtonFrameEx
//根据父窗口句柄(Hwnd)查找子窗口匹配类名("Edit")或者匹配标题(""),返回找到匹配的句柄RegistCodeEx
RegistCodeEx = Plugin.Window.FindEx(Hwnd, ButtonFrameEx, "Edit", 0)
TracePrint "RegistCodeEx: " & RegistCodeEx
RegistCode = Plugin.Window.GetTextEx(RegistCodeEx, 1)
TracePrint "RegistCode: " & RegistCode
MsgBox "序列号:" & SerialNum & " 注册码:" & RegistCode
//复制序列号和注册码到剪切板
Call Plugin.Sys.SetCLB("机器码:" & MachineCode & " 序列号:" & SerialNum & " 注册码:" & RegistCode)
MsgBox "注册码信息已复制到剪切板"
Delay 1000
//完全关闭窗口(退出程序)
Call Plugin.Window.CloseEx(Hwnd)
初版运行示例:
顾名思义,评论的内容是古诗词版的,为嘛,我是文学社社长[/手动滑稽脸],首先就想到来点清流版的。演示视频里用到的是搜狗输入法小汪版,评论内容更万金油一些,嗯。
先下载安装上述提到的按键精灵手机助手,敲黑板,手机助手编写的脚本安卓手机和苹果手机都可以使用,前置条件是安卓需要ROOT,苹果需要越狱。脚本上可能会有一些差别,看具体的方法两个端是否都支持,安卓支持更全一些。
本文演示手机是苹果越狱机,机型:iPhone 6S Plus,安卓机需要各位看官自行尝试。
除了在电脑上安装按键精灵手机助手,还需要在苹果越狱机上安装按键精灵越狱插件,按键精灵Cydia官方源地址:http://apt.mobileanjian.com,在Cydia中添加按键精灵官方源之后,按iOS对应系统版本安装对应的按键精灵插件:
之后手机通过数据线连接电脑,打开按键精灵手机助手,即可连接上手机编写脚本。
手机助手编写脚本界面(需要注意红色箭头指向的几个地方,了解一下相关功能项):
按键精灵手机助手学习方法:和PC版类似,先熟悉界面、菜单功能项,手机助手操作方式,移动端按键精灵操作方式,最重要熟悉基本命令和全部命令,全部看完一遍,即可对要实现的功能有一个大概的构思,明确会用到哪些命令方法。
抖音自动评论脚本编写思路(流程):
1. 按下Home键,然后自动打开抖音App
基本命令——触摸命令——按键 Home——插入,即可生成按下Home键的代码,
基本命令——其它命令——应用程序 启动——包名找到抖音,即可生成打开抖音App代码
如下(注意延时2秒,防止RunApp闪退,实践得知):
//按下Home键
KeyPress "Home"
//延时2秒,防止RunApp闪退
Delay 2000
//打开抖音
RunApp "com.ss.iphone.ugc.Aweme"
2. 模拟上滑切换视频,随机延时模拟人为观看视频
基本命令——从屏幕x1,y1坐标滑动到x2,y2坐标,可通过两组坐标模拟某个方向的滑动操作,坐标点需要通过屏幕分辨率计算,两组坐标x轴相同,y轴从小到大即为上滑操作。
基本命令——设备命令——得到屏幕宽度、得到屏幕高度,即可得到屏幕分辨率,宽×高,
基本命令——其它命令——延时x毫秒时间,即可延时执行,随机延时需计算实现
整理代码如下(TracePrint方法,控制台调试输出):
//获取屏幕分辨率
Dim screenX, screenY
screenX = GetscreenX()
screenY = GetscreenY()
//生成指定范围随机数
Function GenRnd(minVal, maxVal)
GenRnd = Int((maxVal - minVal + 1) * Rnd() + minVal)
End Function
//随机延时
Function DelayRnd(minSec, maxSec)
Dim randTime
randTime = GenRnd(minSec, maxSec)
TracePrint "随机延时" & randTime & "秒"
Delay randTime * 1000
End Function
//上划切换视频
Function SwipeUp(screenX, screenY)
//整除运算符计算从屏幕中间底部划到顶部,划动延时为30毫秒
Swipe screenX \ 2, screenY * 0.65 \ 1, screenX \ 2, screenY * 0.35 \ 1, 30
//调试输出结果,例:621 1766 621 442 30
TracePrint(screenX \ 2, screenY * 0.8 \ 1, screenX \ 2, screenY * 0.2 \ 1, 30)
//随机延时3到15秒
DelayRnd(3, 15)
End Function
3. 找评论按钮,点击评论按钮
找评论按钮需要用到抓抓菜单,找到评论按钮在屏幕中的坐标点:
先点左上角截屏,即可加载当前抖音视频屏幕截图,滑动滚轴找到评论按钮,鼠标放到中心点,显示的坐标点即为评论按钮的坐标点,
问:这里是否有其它不依赖坐标点的方法,有,了解一下以图搜图功能,需要截取评论按钮Icon,放到附件里,通过代码在当前屏幕中搜索评论按钮截图的位置。
基本命令——短暂点击屏幕——代入x,y坐标点,即可点击屏幕某一坐标
整理代码:
//查找并点击评论按钮坐标,暂定1150×1440
Tap 1150, 1440
点击评论按钮后示例:
4. 点击左下角评论输入框,调接口获取评论内容,自动输入评论内容,点发送按钮
4-1. 按照上述找评论按钮方法,找评论输入框大概坐标区域,因为是在屏幕底部偏左区域(见上图红色圈注),故通过屏幕高度计算得出大概坐标点:
//点击评论框
Tap 80, screenY - 80
评论框展开示例(红色圈注区域为输入评论内容区域,已自动获取焦点):
4-2. 调接口获取评论内容,这里需要用到Get或Post方法,请求接口获取返回数据,全部命令——Url网络操作——以Get|Post方式访问地址,即可满足普通不需要Cookie的接口,需携带Cookie,请参考:全部命令——插件命令——ShanHai 山海插件命令v2.5——Get|Post访问HTTP资源(附带cookie),或其它插件。
这里找到了一个古诗词的接口,https://api.77sec.cn/yiyan/api.php,访问即可随时返回一句古诗词,例如:
document.write("往者不可谏,来着犹可追。——《论语·微子》");
带有js代码,需提取文字部分,有两种方法,使用正则提取,或者使用字符串替换,替换document.write(“和”);为空。
调接口示例:
Dim html, content
// 返回结果示例: document.write("居安思危,思则有备,有备无患。——《左传》");
html = URL.Get("https://api.77sec.cn/yiyan/api.php")
TracePrint html
使用字符串替换提取古诗词内容:
content = Replace(html, "document.write(""", "")
content = Replace(content, """);", "")
使用正则提取,这个地方需注意一下,可以了解到Lua插件使用、Lua插件正则和普通正则的区别、Lua插件编写方法等。
普通正则提取文字:
/\("(.+?)"\)/g
使用ShanHai 山海插件命令v2.5——RegexFind全局正则匹配提取:
//引用插件,按键精灵手机助手自带,对应目录"按键精灵\按键精灵手机助手\Plugin\ShanHai.lua"
Import "shanhai.lua"
Dim regexArr = shanhai.RegexFind(html,"%(\"(.+)\"%)")
For Each v In regexArr
content = v
Next
TracePrint content
刚开始以为shanhai.RegexFind( )正则参数传入普通的正则表达式即可,调试无结果,然后看了ShanHai.lua插件源码,发现需要使用Lua正则表达式,继而学习了解了其表达式写法,参考lua高级-正则表达式。
小Tip:如果是自己写的插件,脚本代码中怎么引用?PC端和手机端放到对应的Plugin目录下,Import引用即可。
4-3. 自动输入评论内容,按照4-1找到的评论框展开红色圈注区域,已自动获取焦点,使用InputText( )方法即可实现自动输入评论内容:
//输入评论内容
InputText content
4-4. 点发送按钮,此处用的是搜狗输入法,发送按钮在右下角,可通过屏幕分辨率算坐标,也可用抓抓功能取中心坐标点,此处坐标暂定1107×2125:
//点击搜狗输入法发送按钮,坐标暂定1107×2125
Tap 1107, 2125
5. 关闭屏幕区域,以便进行下一次操作
有两种关闭方式,第一种点屏幕区域右上角×号,第二种点评论区域与屏幕顶部间隔区域(会误点通知消息,不推荐)
//关闭评论,点击评论区右上角×号,坐标暂定1169×655
Tap 1169, 655
或
//关闭评论,点屏幕上顶部即可
Tap screenX \ 2, screenY * 0.1 \ 1
经过以上操作即可完成抖音短视频自动评论功能,每步操作可通过点击调试菜单在手机上运行调试。剩下的就是进行循环操作。
按键精灵手机助手每次预览界面、调试运行脚本时会自动同步界面、代码到手机端按键精灵App里,默认在底部脚本——未分类文件夹里,打开后即可看到手机助手编写的脚本:
点击脚本即可进入到脚本配置界面:
脚本名称和使用说明可在手机助手——脚本——脚本属性里设置,我这个简单,使用说明就一句话,”老省事了,开启后别动手机就成”。
脚本设置相关配置项需要通过手机助手——界面进行设计,配置项变量可在代码中通过ReadUIConfig(界面配置项名称, 默认值)获取。
手机助手界面(见上图预览效果):
取评论次数配置项代码示例:
Dim commentTimes
commentTimes = CInt(ReadUIConfig("commentTimes", 10)) //CInt() 尝试将表达式转换为短整数型,如未取到值,默认10次
设置后点加载按钮即可运行脚本,有两种控制方式,一种是按键精灵悬浮图标控制,一种是音量加减控制,加运行,减停止运行,可在按键精灵App设置菜单里进行设置。
脚本配置界面图例右上角编辑按钮可在手机上查看脚本内容,并可实时修改保存运行,即可独立运行。
源码中还有很多上述没有提到的地方,包括不限于基础语法,循环操作,封装方法等,可通过代码注释做一了解。
//导入ShanHai 山海插件命令v2.5插件
Import "shanhai.lua"
//获取屏幕分辨率
Dim screenX, screenY
screenX = GetscreenX()
screenY = GetscreenY()
//调试输出结果,例:1242×2208
TracePrint "屏幕分辨率: " & screenX & "×" & screenY
//按下Home键
KeyPress "Home"
//延时2秒,防止RunApp闪退
Delay 2000
//打开抖音
ShowMsg "打开抖音", screenX, screenY
RunApp "com.ss.iphone.ugc.Aweme"
Delay 5000
//获取界面设置的评论次数
Dim content
Dim i, commentTimes
commentTimes = CInt(ReadUIConfig("commentTimes", 10)) //CInt() 尝试将表达式转换为短整数型
ShowMsg "评论次数配置为" & commentTimes & "次", screenX, screenY
For i = 1 To commentTimes
//上划切换视频
SwipeUp screenX, screenY
TracePrint "第" & i & "次评论"
ShowMsg "第" & i & "次评论", screenX, screenY
//获取评论内容
content = GetPoetry()
ShowMessage "评论内容:" & content, 2000, screenX * 0.05 \ 1, screenY * 0.75 \ 1
//自动评论
Comment screenX, screenY, content
Next
//--------------------------------------------------------------------------------------------
//上划切换视频
Function SwipeUp(screenX, screenY)
//整除运算符计算从屏幕中间底部划到顶部,划动延时为30毫秒
Swipe screenX \ 2, screenY * 0.65 \ 1, screenX \ 2, screenY * 0.35 \ 1, 30
//调试输出结果,例:621 1766 621 442 30
TracePrint(screenX \ 2, screenY * 0.8 \ 1, screenX \ 2, screenY * 0.2 \ 1, 30)
//随机延时3到15秒
DelayRnd(3, 15)
End Function
//自动评论
Function Comment(screenX, screenY, content)
//查找并点击评论按钮坐标,暂定1150×1440
Tap 1150, 1440
DelayRnd(3, 8)
//点击评论框
Tap 80, screenY - 80
//输入评论内容
InputText content
Delay 1000
//点击搜狗输入法发送按钮,坐标暂定1107×2125
Tap 1107, 2125
Delay 2000
//关闭评论,点屏幕上顶部即可
//Tap screenX \ 2, screenY * 0.1 \ 1
//关闭评论,点击评论区右上角×号,坐标暂定1169×655
Tap 1169, 655
Delay 1000
End Function
//获取一句随机古诗词作为评论内容
Function GetPoetry()
Dim html, content
// 返回结果示例: document.write("居安思危,思则有备,有备无患。——《左传》");
html = URL.Get("https://api.77sec.cn/yiyan/api.php")
TracePrint html
// content = Replace(html, "document.write(""", "")
// content = Replace(content, """);", "")
Dim regexArr = shanhai.RegexFind(html,"%(\"(.+)\"%)")
For Each v In regexArr
content = v
Next
TracePrint content
GetPoetry = content
End Function
//生成指定范围随机数
Function GenRnd(minVal, maxVal)
GenRnd = Int((maxVal - minVal + 1) * Rnd() + minVal)
End Function
//随机延时
Function DelayRnd(minSec, maxSec)
Dim randTime
randTime = GenRnd(minSec, maxSec)
TracePrint "随机延时" & randTime & "秒"
Delay randTime * 1000
End Function
//重写ShowMessage
Function ShowMsg(msg, screenX, screenY)
Dim intX, intY
intX = screenX \ 2 - 85
intY = screenY * 0.75 \ 1
TracePrint "提示消息坐标: " & intX & "×" & intY
ShowMessage msg, 2000, intX, intY
End Function
OK,各位看官,相信经过上述一番文字图片轰炸(LuoSuo),应该可以上手按键精灵做一些事情了吧。当然我接触的也只是皮毛,学无止境,当有一个新想法时,可能会再接触到更多的东西。除了上述实现的抖音自动评论,还可以做哪些事情呢,我简单列几项,不细说,如果你有这方面需求,很快可以想到。
1. 按键精灵手机版是可以操作很多基础功能的,打电话、读发短信等等,所以,脚本源码还好,用别人封装好的不一定是安全的
2. 可以实现批量添加、删除、清空联系人,具体用途自己想
3. 插件编写,看一下按键精灵自带的插件源码,就可以写自定义插件实现更强大的功能
4. 还是++
做一个有态度的技术工作者。
恭祝大家2020新年好,这可能是最早的新年祝福。
*本文原创作者:冰海,本文属FreeBuf原创奖励计划,未经许可禁止转载