Android手机上,利用bat脚本模拟用户操作
大家可能会遇到这样的情景:
· 也许你是一个通过App的销售人员,需要不断靠App的点击率来拿利润
· 也许你是一个个人开发者,想要自己写个脚本点击banner广告
· 也许你是一个业务经理,你的API是应用内某模块点击率超过X万次
…………
那么你就可以来看看这篇帖子了。
言归正传
利用bat脚本模拟用户操作,需要用到两点:
①就是adb命令了,adb命令可以用来模拟用户在手机上的操作
②bat语言,就是批处理语言,主要用来进行逻辑处理,跟众多语言语法一样,批处理语言也包括for循环、if语句之类的语法;
一、adb命令
首先我们来介绍模拟用户在手机上操作的adb命令
input keyevent
//发送键盘事件
用法说明:
adb shell input keyevent “value”
usage: input ...
input text <string> //在EditText中输入字符串
input keyevent <key code number or name> //模拟back键、home键、音量键等操作
input tap <x> <y> //模拟点击事件
input swipe <x1> <y1> <x2> <y2> //模拟滑动事件
看看上面的这四个命令是不是已经满足你日常使用了呢?
先列举 input keyevent
几个比较常用的code值:
input keyevent 3 // Home
input keyevent 4 // Back
input keyevent 19 //Up
input keyevent 20 //Down
input keyevent 21 //Left
input keyevent 22 //Right
input keyevent 23 //Select/Ok
input keyevent 24 //Volume+
input keyevent 25 // Volume-
input keyevent 82 // Menu 菜单~~~
下面来举个栗子:
①你可以先进入到adb shell
中,再执行input keyevent "value"
,如下,看看是不是执行了home键的操作呢:
shell@android:/ $ input keyevent 3
②你也可以不进入adb shell
中,直接执行(在bat脚本中写的时候当然要用这种啦~),如下:
adb shell input tap 143 1850 //这是点击了横坐标为143、纵坐标为1850的像素点
adb shell input swipe 200 100 444 666 //这是从坐标点(200,100)滑动到了坐标(444,666)
========================================
【快速获取想要点击图标像素点的技巧:】想要点击某个button,但是怎么快速获取该button的像素位置呢?
一般Android在[设置--高级设置--开发者选项]中,或者[设置--开发人员选项]中,有“指针位置”这一项,打开该开关
如上图,方框的位置就是你所点击的区域坐标点,注意,原坐标[0, 0]就是手机屏幕的左上角。
还有一点,如果你在屏幕滑动了一段距离,你想知道滑动距离的坐标数值差,也可以看到:
就是上图中的红色数值,[dX, dY]
==================================================
二、bat语言,批处理语言
1,基础语法
①.批处理文件是一个“.bat”结尾的文本文件,这个文件的每一行都是一条DOS命令。可以使用任何文本文件编辑工具创建和修改。
②.批处理是一种简单的程序,可以用 if 和 goto 来控制流程,也可以使用 for 循环。
③.批处理的编程能力远不如C语言等编程语言,也十分不规范。
④.每个编写好的批处理文件都相当于一个DOS的外部命令,把它所在的目录放到DOS搜索路径(path)中,即可在任意位置运行。
⑤.C:\AUTOEXEC.BAT
是每次系统启动时都会自动运行的,可以将每次启动时都要运行的命令放入该文件中。
⑥.大小写不敏感(命令符忽略大小写)
⑦.批处理的文件扩展名为 .bat 或 .cmd。
⑧.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe
来运行该文件。
2,如何执行批处理文件
新建一个txt文本文件,写完代码之后,保存为XXX.bat
文件,然后双击该文件就行~~~
3,先来几个常用的语法:
①注释:Rem或::
Rem 这是一行注释
:: 这也是一行注释
②打印个log啥的:echo命令
语法:echo [{on|off}] [message]
1), ECHO [message]
显示信息,此句可以用来打log,例子如下:
2),
ECHO [ON | OFF]
打开回显或关闭回显功能。echo off
表示在此语句后所有运行的命令都不显示命令行本身,:
默认是on,on时会显示如图
如果改成off,off时会显示如下
3), ECHO
显示当前回显设置。
4), 在实际应用中我们会把这条命令和重定向符号( 也称为管道符号,一般用 > >> ^ )结合来实现输入一些命令到特定格式的文件中。
echo Windows Registry Editor Version 5.00 > c:\setupreg.reg (此前还没有 setupreg.reg 这个文件) ```
echo "SourcePath"="D:\Win2003\" >> c:\setupreg.reg (追加内容进 setupreg.reg 这个文件) ```
③ @命令
表示不显示@后面的命令,(在入侵过程中自然不能让对方看到你使用的命令啦)
@ 与 echo off
相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
@echo off (此语句常用于开头,表示不显示所有的命令行信息,包括此句)
@echo please wait a minite...
@format X: /q/u/autoset ```
④ title 命令
给cmd窗口设置title
title 读取文件测试脚本
设置前
设置后
⑤ color命令:设置背景及字体颜色
语法: color bf
b 是指定背景色的十六进制数字; f 指定前景颜色(即字体颜色)。
颜色值: 0:黑色 1:蓝色 2:绿色 3:湖蓝 4:红色 5:紫色 6:黄色 7:白色
8:灰色 9:淡蓝 A:淡绿 B:浅绿 C:淡红 D:淡紫 E:淡黄 F:亮白
如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE
启动时的颜色。
如果两参数一样,视为无效输入。只有一个参数时,设置字体。
⑥ Pause命令:
可以自己试一下,挺有用的功能,会暂停批处理的执行并在屏幕上显示Press any key to continue...
的提示,等待用户按任意键后继续
⑦打开某网站
start iexplore.exe http://www.baidu.com
start chrome.exe http://www.baidu.com
⑧延时执行下一句语句:
ping -n N 127.1 >nul
执行该语句,就会延迟执行N-1秒
4,For语句
For语句是比较重要的语法,网上已经有很多人做了各种解释说明,我就不再做重复的轮子了,找了两篇介绍的比较清楚易懂的for语句帖子供大家交流:
http://blog.csdn.net/pigchan/article/details/5066098
http://www.jb51.net/article/17908.htm
5,Set语句
同上,set语句的帖子:http://blog.csdn.net/anye3000/article/details/8443738
6,If语句
if 表示将判断是否符合规定的条件,从而决定执行不同的命令。有三种格式:
① IF
语法:if [not] "参数" == "字符串" 待执行的命令
参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
if "%1" == "a" format a:
if {%1} == {} goto noparms
② if exist
语法: if [not] exist [路径\]文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
if exist config.sys edit config.sys (表示如果存在这文件,则编辑它,用很难看的系统编辑器)
if exist config.sys type config.sys (表示如果存在这文件,则显示它的内容)
-
if errorlevel number
语法:if [not] errorlevel <数字> 待执行的命令
如果程序返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。(返回值必须按照从大到小的顺序排列)
@echo off
XCOPY F:\test.bat D:\
IF ERRORLEVEL 1 (ECHO 文件拷贝失败
) Else IF ERRORLEVEL 0 ECHO 成功拷贝文件
pause
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),称为错误码errorlevel或称返回码。
常见的返回码为0、1。通过if errorlevel
命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令。
④ else
语法:if 条件 (成立时执行的命令) else (不成立时执行的命令)
如果是多个条件,建议适当使用括号把各条件包起来,以免出错。
if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) else (echo comment3 )
注:如果 else 的语句需要换行,if 执行的行尾需用“^”连接,并且 if 执行的动作需用(括起来),否则报错
if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) ^
else (echo comment3 )
⑤ 比较运算符:
EQU - 等于 (一般使用“==”)
NEQ - 不等于 (没有 “!=”,改用“ if not 1==1 ”的写法)
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
7,Goto语句
语法:goto label
(label是参数,指定所要转向的批处理程序中的行。)
指定跳转到标签行,找到标签行后,程序将处理从下一行开始的命令。
label标签的名字可以随便起,但是最好是有意义的,字母前必须加个冒号“:”来表示这个字母是标签。
goto命令就是根据这个冒号来寻找下一步跳到到那里。经常与 if 配合使用,根据不同的条件来执行不同的命令组。
@echo off
:begin
copy a:*.* d:\back
echo Please put a new disk into driver A
goto begin
8,Call语句
Call 命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后再继续执行原来的批处理,类似于java中的方法调用,还可以传递参数,跟goto语句还是有区别的。
语法: call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
参数: [Drive:][Path] FileName
指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。 调用另一个批处理程序,并且不终止父批处理程序。 如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令。 call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。
call="%cd%\test2.bat" haha kkk aaa (调用指定目录下的 test2.bat,且输入3个参数给他)
call test2.bat arg1 arg2 (调用同目录下的 test2.bat,且输入2个参数给他)
请参考如下帖子:http://blog.csdn.net/stpeace/article/details/9041453
三、举个栗子
下面来举个栗子,是一个循环自动登录的功能,从一个文档中,提取用户名、密码,把用户名密码一次输入App的EditText中,最后点击登录。
首先,登录界面如下:
哇呀呀,帖子是从我的csdn拿过来的,不要怀疑水印!然后呢,我们准备了10条数据,别人给我的时候是存在excel表里的,如下
数据为了能让脚本方便调用,我们把它转存为txt文件,文件名为data.txt
数据好了,前期工作准备完毕,现在看下代码怎么写的:
@echo off
title 读取文件测试脚本 //设置title
color 3a //设置命令行窗口颜色
adb shell input keyevent 3 //点了一次home键,回到首页
adb shell am start com.gaoyang.testapp //根据包名启动app
ping -n 11 127.1 >nul //启动app可能需要点时间,我们延时10秒再向下执行
setlocal enabledelayedexpansion
set /a num=0 //初始化变量num,用来记录循环次数
:loop
set /a num+=1 //每循环一次,加1
echo 第!num!遍 //输出log,第几次
for /f "tokens=1-3" %%i in (data.txt) do ( //循环读取数据
if %%i==!num! (<span style="white-space:pre"> </span>
if %%i==11 goto end //当循环次数等于11的时候,退出循环,退出程序,因为我们只有10条数据
call :execute %%j %%k //调用模拟用户行为的操作 %%j %%k为传到execute方法去的参数,分别代表用户名、密码
goto loop)
)
:end
echo 结束了
goto eof
:execute
echo username: %1 //打印log,用户名
echo password: %2 //打印log,密码
::【登录操作】
::点击用户名框
adb shell input tap 268 1734
::输入用户名
adb shell input text %1
::点击密码框
adb shell input tap 654 572
::输入密码
adb shell input text %2
::点击登录button,登录
adb shell input tap 630 870
当然了,有登录肯定有退出登录,需要循环操作的话,还得在登录前执行退出登录的操作才行,有上面的栗子🌰之后,就比较简单了,自己加上就可以了~
请关注我的微信公众号