freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

手把手教你编写抖音自动评论脚本
2019-09-20 12:30:16
所属地 北京

0×00 前言

我的TodoList增加了一项,Appium | Airtest 抖音自动评论、创意评论(所有评论/前一百评论男女占比 | 所有评论词云),记录了当时的一个想法。Appium和Airtest都可用于移动端自动化测试,Airtest是网易家的,想做评论词云是因为在这之前用Appium写了一个爬个人微信朋友圈词云图的程序(见图1),同时Airtest操作更简单,也在考虑的范围。

再后来,一直未实施,主要是觉得得用手机连着电脑,不能随时随地操作,就搁置了。近段时间因为工作时的一个想法,又把这事提起来了。业务场景比较特殊,可能会涉及版权问题,就不细说,简言之,想实现某注册机自动生成注册码功能,继而接触到了按键精灵。按键精灵很早就存在,也很早就有所耳闻,但一直未实地接触,刚好借这个机会接触一下。用按键精灵PC版实现了注册机自动生成注册码功能,在实现的过程中接触到了按键精灵手机版,孤陋寡闻了,一个神奇的存在,立马就想到了可以用它先实现个简单的抖音自动评论功能吧。

前言有点啰嗦了。。。,喏,这个是微信朋友圈词云图,图1

朋友圈词云图.jpg

演示视频:

0×01 导语

过了前言是导语啊,看了这篇文章,你可以了解到哪些内容:

1. 某注册机自动生成注册码——按键精灵PC版脚本编写

2. 抖音自动评论——按键精灵手机版使用及脚本编写

3. Lua插件使用及编写 

4. 拓展功能,看结尾Tips

5. 非技术工作者可以了解到,很多功能表现,没有那么复杂,程序可以代替手工

6. ++

0×02 某注册机自动生成注册码

不是本文重点,会简单概过(Kuo)。按键精灵官网下载地址http://download.myanjian.com/,可下载按键精灵PC版,安卓版,按键精灵手机助手。

按键精灵官网下载地址.png此处下载安装按键精灵PC端,PC版首页:

按键精灵PC首页.png

脚本编写界面(需要注意红色箭头指向的几个地方,了解一下相关功能项):

按键精灵PC版脚本界面.png学习方式:按键精灵使用的是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)

初版运行示例:

注册机自动生成注册码运行示例.png

0×03 抖音自动评论——古诗词版

顾名思义,评论的内容是古诗词版的,为嘛,我是文学社社长[/手动滑稽脸],首先就想到来点清流版的。演示视频里用到的是搜狗输入法小汪版,评论内容更万金油一些,嗯。

先下载安装上述提到的按键精灵手机助手,敲黑板,手机助手编写的脚本安卓手机和苹果手机都可以使用,前置条件是安卓需要ROOT,苹果需要越狱。脚本上可能会有一些差别,看具体的方法两个端是否都支持,安卓支持更全一些。

本文演示手机是苹果越狱机,机型:iPhone 6S Plus,安卓机需要各位看官自行尝试。

除了在电脑上安装按键精灵手机助手,还需要在苹果越狱机上安装按键精灵越狱插件,按键精灵Cydia官方源地址:http://apt.mobileanjian.com,在Cydia中添加按键精灵官方源之后,按iOS对应系统版本安装对应的按键精灵插件:

Cydia按键精灵源.png

之后手机通过数据线连接电脑,打开按键精灵手机助手,即可连接上手机编写脚本。

手机助手编写脚本界面(需要注意红色箭头指向的几个地方,了解一下相关功能项):

手机助手脚本界面.png

按键精灵手机助手学习方法:和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. 找评论按钮,点击评论按钮

找评论按钮需要用到抓抓菜单,找到评论按钮在屏幕中的坐标点:

评论按钮.png先点左上角截屏,即可加载当前抖音视频屏幕截图,滑动滚轴找到评论按钮,鼠标放到中心点,显示的坐标点即为评论按钮的坐标点,

问:这里是否有其它不依赖坐标点的方法,有,了解一下以图搜图功能,需要截取评论按钮Icon,放到附件里,通过代码在当前屏幕中搜索评论按钮截图的位置。

基本命令——短暂点击屏幕——代入x,y坐标点,即可点击屏幕某一坐标

整理代码:

//查找并点击评论按钮坐标,暂定1150×1440
Tap 1150, 1440

点击评论按钮后示例:

点击评论按钮.png4. 点击左下角评论输入框,调接口获取评论内容,自动输入评论内容,点发送按钮

4-1. 按照上述找评论按钮方法,找评论输入框大概坐标区域,因为是在屏幕底部偏左区域(见上图红色圈注),故通过屏幕高度计算得出大概坐标点:

//点击评论框
Tap 80, screenY - 80

评论框展开示例(红色圈注区域为输入评论内容区域,已自动获取焦点):

评论框展开.png4-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

评论框自动输入.png

4-4. 点发送按钮,此处用的是搜狗输入法,发送按钮在右下角,可通过屏幕分辨率算坐标,也可用抓抓功能取中心坐标点,此处坐标暂定1107×2125:

//点击搜狗输入法发送按钮,坐标暂定1107×2125
Tap 1107, 2125

5. 关闭屏幕区域,以便进行下一次操作

有两种关闭方式,第一种点屏幕区域右上角×号,第二种点评论区域与屏幕顶部间隔区域(会误点通知消息,不推荐)

//关闭评论,点击评论区右上角×号,坐标暂定1169×655
Tap 1169, 655
或
//关闭评论,点屏幕上顶部即可
Tap screenX \ 2, screenY * 0.1 \ 1

经过以上操作即可完成抖音短视频自动评论功能,每步操作可通过点击调试菜单在手机上运行调试。剩下的就是进行循环操作。

0×04  按键精灵越狱插件使用

按键精灵手机助手每次预览界面、调试运行脚本时会自动同步界面、代码到手机端按键精灵App里,默认在底部脚本——未分类文件夹里,打开后即可看到手机助手编写的脚本:

按键精灵脚本.png

点击脚本即可进入到脚本配置界面:

按键精灵脚本设置界面.png

脚本名称和使用说明可在手机助手——脚本——脚本属性里设置,我这个简单,使用说明就一句话,"老省事了,开启后别动手机就成"。

脚本设置相关配置项需要通过手机助手——界面进行设计,配置项变量可在代码中通过ReadUIConfig(界面配置项名称, 默认值)获取。

手机助手界面(见上图预览效果):

手机助手界面编写.png取评论次数配置项代码示例:

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("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

0×06 Tips

OK,各位看官,相信经过上述一番文字图片轰炸(LuoSuo),应该可以上手按键精灵做一些事情了吧。当然我接触的也只是皮毛,学无止境,当有一个新想法时,可能会再接触到更多的东西。除了上述实现的抖音自动评论,还可以做哪些事情呢,我简单列几项,不细说,如果你有这方面需求,很快可以想到。

1. 按键精灵手机版是可以操作很多基础功能的,打电话、读发短信等等,所以,脚本源码还好,用别人封装好的不一定是安全的

2. 可以实现批量添加、删除、清空联系人,具体用途自己想

3. 插件编写,看一下按键精灵自带的插件源码,就可以写自定义插件实现更强大的功能

4. 还是++

0×07 结语

做一个有态度的技术工作者。

恭祝大家2020新年好,这可能是最早的新年祝福。

*本文原创作者:冰海,本文属FreeBuf原创奖励计划,未经许可禁止转载

# 极客 # 脚本 # 抖音 # 自动评论
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者