⼿把⼿教你编写抖⾳⾃动评论脚本
0×00 前⾔
我的TodoList增加了⼀项,Appium | Airtest 抖⾳⾃动评论、创意评论(所有评论/前⼀百评论男⼥占⽐ | 所有评论词云),记录了当时的⼀个想法。Appium和Airtest都可⽤于移动端⾃动化测试,Airtest是⽹易家的,想做评论词云是因为在这之前⽤Appium写了⼀个爬个⼈朋友圈词云图的程序(见图1),同时Airtest操作更简单,也在考虑的范围。
再后来,⼀直未实施,主要是觉得得⽤⼿机连着电脑,不能随时随地操作,就搁置了。近段时间因为⼯作时的⼀个想法,⼜把这事提起来了。业务场景⽐较特殊,可能会涉及版权问题,就不细说,简⾔之,想实现某注册机⾃动⽣成注册码功能,继⽽接触到了按键精灵。按键精灵很早就存在,也很早就有所⽿闻,但⼀直未实地接触,刚好借这个机会接触⼀下。⽤按键精灵PC版实现了注册机⾃动⽣成注册码功能,在实现的过程中接触到了按键精灵⼿机版,孤陋寡闻了,⼀个神奇的存在,⽴马就想到了可以⽤它先实现个简单的抖⾳⾃动评论功能吧。
前⾔有点啰嗦了。。。,喏,这个是朋友圈词云图,图1
演⽰视频:
0×01 导语
过了前⾔是导语啊,看了这篇⽂章,你可以了解到哪些内容:
1. 某注册机⾃动⽣成注册码——按键精灵PC版脚本编写
2. 抖⾳⾃动评论——按键精灵⼿机版使⽤及脚本编写
3. Lua插件使⽤及编写
4. 拓展功能,看结尾Tips
5. ⾮技术⼯作者可以了解到,很多功能表现,没有那么复杂,程序可以代替⼿⼯
6. ++
0×02 某注册机⾃动⽣成注册码
此处下载安装按键精灵PC端,PC版⾸页:
脚本编写界⾯(需要注意红⾊箭头指向的⼏个地⽅,了解⼀下相关功能项):
学习⽅式:按键精灵使⽤的是Q语⾔,在VBScript语⾔基础上发展来的,如果对VBScript语⾔有了解更好⼀些,没有了解也没关系,注意上图脚本编写界⾯中的基本命令和全部命令标签,基础命令标签可通过点击⾃动⽣成代码,全部命令标签⼤部分⽅法通过代⼊参数也可⾃动⽣成代码,把基本命令和全部命令相关⽅法看⼀遍,看的过程中就会对要实现的功能有个⼤概的构思,清楚会⽤到哪些⽅法,编写脚本过程中再去官⽹、其它地⽅了解下相关知识点,基本就⼊门了。
⼩Tips:
1. 界⾯标签页可编写窗体界⾯,包含各种控件。
2. 发布菜单可导出脚本,脚本依赖PC版运⾏环境;可制作按键⼩精灵,按键⼩精灵可⽣成exe程序,脱离PC版运⾏环境独⽴运
⾏。
3. 善⽤命令帮助⽂档和命令搜索功能
某注册机⾃动⽣成注册码,主要⽤到了Window窗⼝插件⾥的⽅法,同时也⽤到了抓抓功能,通过动态窗⼝句柄的⽅式实现具体的功
能,Plugin.Window.FindEx( )函数有坑,需要在实践过程中理解参数2⼦窗⼝句柄的⽤法。其它没有介绍到的,如有疑问,欢迎交流。
某注册机⾃动⽣成注册码代码⽰例(如有更好实现⽅式,欢迎指导,谢谢):
Dim MachineCode, SerialNum, RegistCode
//打开注册机
Call RunApp("D:\")
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)
初版运⾏⽰例:
0×03 抖⾳⾃动评论——古诗词版
顾名思义,评论的内容是古诗词版的,为嘛,我是⽂学社社长[/⼿动滑稽脸],⾸先就想到来点清流版的。演⽰视频⾥⽤到的是搜狗输⼊法⼩汪版,评论内容更万⾦油⼀些,嗯。
先下载安装上述提到的按键精灵⼿机助⼿,敲⿊板,⼿机助⼿编写的脚本安卓⼿机和苹果⼿机都可以使⽤,前置条件是安卓需要ROOT,苹果需要越狱。脚本上可能会有⼀些差别,看具体的⽅法两个端是否都⽀持,安卓⽀持更全⼀些。
本⽂演⽰⼿机是苹果越狱机,机型:iPhone 6S Plus,安卓机需要各位看官⾃⾏尝试。
之后⼿机通过数据线连接电脑,打开按键精灵⼿机助⼿,即可连接上⼿机编写脚本。
⼿机助⼿编写脚本界⾯(需要注意红⾊箭头指向的⼏个地⽅,了解⼀下相关功能项):
按键精灵⼿机助⼿学习⽅法:和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),或其它插件。
document.write("往者不可谏,来着犹可追。——《论语·微⼦》");
带有js代码,需提取⽂字部分,有两种⽅法,使⽤正则提取,或者使⽤字符串替换,替换document.write(“和”);为空。
调接⼝⽰例:
Dim html, content
// 返回结果⽰例: document.write("居安思危,思则有备,有备⽆患。——《左传》");
html = URL.Get("api.77sec/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
//关闭评论,点屏幕上顶部即可
在安卓手机上运行php
Tap screenX \ 2, screenY * 0.1 \ 1
经过以上操作即可完成抖⾳短视频⾃动评论功能,每步操作可通过点击调试菜单在⼿机上运⾏调试。剩下的就是进⾏循环操作。
0×04  按键精灵越狱插件使⽤
按键精灵⼿机助⼿每次预览界⾯、调试运⾏脚本时会⾃动同步界⾯、代码到⼿机端按键精灵App⾥,默认在底部脚本——未分类⽂件夹⾥,打开后即可看到⼿机助⼿编写的脚本:
点击脚本即可进⼊到脚本配置界⾯:
脚本名称和使⽤说明可在⼿机助⼿——脚本——脚本属性⾥设置,我这个简单,使⽤说明就⼀句话,”⽼省事了,开启后别动⼿机就成”。
脚本设置相关配置项需要通过⼿机助⼿——界⾯进⾏设计,配置项变量可在代码中通过ReadUIConfig(界⾯配置项名称, 默认值)获取。
⼿机助⼿界⾯(见上图预览效果):
取评论次数配置项代码⽰例:
Dim commentTimes
commentTimes = CInt(ReadUIConfig("commentTimes", 10)) //CInt() 尝试将表达式转换为短整数型,如未取到值,默认10次
设置后点加载按钮即可运⾏脚本,有两种控制⽅式,⼀种是按键精灵悬浮图标控制,⼀种是⾳量加减控制,加运⾏,减停⽌运⾏,可在按键精灵App设置菜单⾥进⾏设置。
脚本配置界⾯图例右上⾓编辑按钮可在⼿机上查看脚本内容,并可实时修改保存运⾏,即可独⽴运⾏。
0×05 抖⾳⾃动评论——古诗词版脚本源码
源码中还有很多上述没有提到的地⽅,包括不限于基础语法,循环操作,封装⽅法等,可通过代码注释做⼀了解。
//导⼊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("api.77sec/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