触摸精灵教程
触摸精灵找图脚本的详细制作过程
1.截取全屏图片
- 将电脑和手机连接到同一个路由器下,使2者处于同一个子网中,假设电脑的IP为192.168.1.6,手机的IP为192.168.1.7
- 在电脑上运行『触摸精灵编辑器』 执行『菜单-图像-触摸抓抓』 点击『远程截图』,输入手机的IP:192.168.1.7(见图1)
- 等待处理完成便获取到了手机的当前屏幕截图(见图2)
图1:
图2:
2.扣取要找的图片
- 点击『图片裁剪』
- 按下鼠标左键并拖动来选取要扣取的图片(见图3)
- 将扣取的图片保存到电脑,起名为phone.bmp(见图4)
图3:
图4:
3.编写脚本
- 将截取的图片phone.bmp上传到手机中的某个目录中(例如:IOS设备可以存放到/var/touchelf目录下,安卓设备可以存放到/mnt/sdcard/目录下)
- 假如我们想要执行的动作为:如果播放脚本时屏幕上存在电话图标,那么点击该图标,并显示yes;如果不存在该图标,那么就显示no
function main() -- main函数,脚本播放时会执行该函数
mSleep(2000) -- 等待2秒后执行,为了避免播放开始的提示影响找图
x, y = findImage("/var/touchelf/phone.bmp") -- 参数为图片的绝对路径,请修改为你上传的图片路径
if x ~= -1 and y ~= -1 then -- 如果x和y不等与-1,说明找到了
touchDown(0, x+5, y+5) -- 手指按下图片所在的位置,由于x和y是左上角坐标,为了点中图片,x和y都加了5个像素的偏移
touchUp(0) -- 手指抬起
notifyMessage("yes") -- 显示yes
else -- 否则,如果没找到
notifyMessage("no") -- 显示no
end
end
将上述代码保存为脚本,然后在存在电话图标的界面播放时,会点击该图标后,显示yes;在不存在Phone图标的界面上播放时,只会显示no
httpGet函数操作二进制文件的方法
因为httpGet函数的交互只能操作字符串,所以如果想要使用该函数传送二进制文件(如图片),可以把二进制文件转换成16进制字符串,然后在服务器端逆向的把16进制字符串还原成二进制,下面代码中的fileToHexString()函数就是一个把二进制文件转换成16进制字符串的函数。
--------------------------------------------------
-- 将二进制文件转换成16进制字符串
-- 可用于httpGet函数传送文件,服务器端将16进制字符串转换成二进制文件即可
-- 实现逆向转换
--------------------------------------------------
function fileToHexString(file)
local file = io.open(file, 'rb');
local data = file:read("*all");
file:close();
local t = {};
for i = 1, string.len(data),1 do
local code = tonumber(string.byte(data, i, i));
table.insert(t, string.format("%02x", code));
end
return table.concat(t, "");
end
function main()
str = fileToHexString('test.dat');
notifyMessage(str);
end
脚本的模块化教程
当脚本过大时,模块化各个功能可以让脚本更加便于管理。
假设a.lua存放于/mnt/sdcard/touchelf/scripts/下面(默认路径),内容如下:
function a1()
notifyMessage("i'm a1");
end
想要在b.lua中调用a.lua中的函数a1(),那么b.lua可以这样写:
package.path=package.path .. ";/mnt/sdcard/touchelf/scripts/?.lua"
require "a"
function main()
a1();
end
或者:
dofile("/mnt/sdcard/touchelf/scripts/a.lua");
function main()
a1();
end
require与dofile区别:
1.require只需要指定模块名字(不需要加入.lua这样后缀),而dofile需要指定文件的完整路径。
2.require会记住load过的信息,重复调用不会导致模块被重新载入,而dofile会。(我们可以通过dofile这种特性来实现热更新)
3.require可以载入二进制模块,如c语言编写的动态库,可以通过package.cpath来显示动态库查找的路径信息。
让你的脚本随机化一些
有时候,我们可能希望脚本可以随机化一点,表现的能像是真人在操作,而不要太机械,比如循环点击一个点的时候,能够每次点击的位置能稍微变化一点,这个时候可以试用lua的math.random()函数,这个比如如下代码:
math.randomseed(tostring(os.time()):sub(5):reverse()); -- 随机种子
math.random(-5, 5);
每次都可以返回-5到5之间随机的一个数,那么我们可以将点击操作写一个函数:
function click(x, y)
touchDown(0, x + math.random(-5, 5), y + math.random(-5, 5));
mSleep(math.random(1000, 2000));
touchUp(0);
end
然后在需要点击时之间调用这个函数,比如找图时:
x, y = findImage("/mnt/sdcard/a.bmp");
if x ~= -1 and y ~= -1 then
click(x, y);
end
这样每次循环点击的位置都是有小幅变化的,而不是每次都是点击一个点。
自定义字符串随机:
function randomStr(str, num)
local reStr ='';
math.randomseed(tostring(os.time()):sub(5):reverse());
for i = 1, num do
local getStr = math.random(1, string.len(str));
reStr = reStr .. string.sub(str, getStr, getStr);
end
return reStr;
end
--用法
s = randomStr("abcdefghijklmnopqrstuvwxyz", 10) --生成10位随机字母
触摸精灵的坐标体系与rotateScreen()函数的用法
1.触摸精灵的默认坐标体系
在没有rotateScreen()这个函数之前,触摸精灵的坐标体系是固定的,以IOS设备为例子,不论是找图还是点击,坐标的原点始终是在HOME键盘在下时候的左上角是原点,例如我们用如下脚本:
function main()
mSleep(1000); -- 延迟一秒
snapshotScreen("/var/touchelf/a.bmp"); -- 将全屏截图保存到/var/touchelf/a.bmp这个文件里
end
在IOS设备的主屏幕播放一次,这样就获取了如下的图:
这个图片的尺寸和768x1024, 图片的方向是和触摸精灵默认的坐标体系是一样的,左上角的坐标为(0,0),右上角的坐标为(768, 0),左下角的坐标为(0, 1024),右下角的坐标为(768, 1024)。
2.通过坐标点击制定位置
如果我们想在脚本中点击“触摸精灵”的图标的话,需要怎么写呢,我们需要获取到该图标的坐标,获取这个图标的坐标的方法很多,这里我们用Photoshop打开该图片,然后按F8打开信息面板,并把该面板的选项中的“鼠标坐标”单位改为“像素”,然后把鼠标移动到图标的位置,这是就可以在信息面板里看到对应的坐标了,如下图所示:
上图中的信息面板中的信息告诉我们,“触摸精灵”图标的坐标是(124,131),那么我们编写如下脚本:
function main()
touchDown(0, 124, 131); -- 手指按下(124,131)位置,第一个参数0是手指ID,这个在多点触摸时会用到
touchUp(0); -- 手指抬起
end
在主屏幕播放如上脚本,就可以自动点击到“触摸精灵”的图标了。
3.通过找图点击指定位置
接下来,我们想通过找图来点击“触摸精灵”的坐标,那么我们首先需要获取“触摸精灵”图标的截图,我们用Photoshop截取“触摸精灵”的图标如下(保存时候的BMP选项: 文件格式为windows,深度为24位,其他的都不选):
把这个图片传到设备的/var/touchelf/touchelf.bmp文件,然后编写如下脚本:
function main()
x, y = findImage("/var/touchelf/touchelf.bmp"); -- 查找touchelf.bmp这个图标在屏幕的位置,坐标保存到x和y里
if x ~= -1 and y ~= -1 then -- 如果x和y都不是-1的话,说明找到了
touchDown(0, x+5, y+5); -- 由于x和y保存里图标的位置,我们把x和y传给touchDown就可以了,这里x和y都加5是由于找图返回的坐标是找到的图片的左上角的坐标,我们要先点中的话,点击的位置需要往右下方偏移一下。
touchUp(0); -- 手指抬起
else -- 否则,也就是x和y有一个是-1的话,说明没找到
notifyMessage("没有找到"); -- 显示消息
end
end
4.横屏游戏如何编写呢
手游基本是横屏的,默认情况下,触摸精灵的坐标体系不会随着屏幕画面改变的,例如,我们在横屏游戏中播放上述的截图脚本,获取到的图片是这样的:
我们可以看到,截图还是竖着的,而且这时候坐标体系也没有改变的,如果我们想点击“人物头像”,使用以前Photoshop信息面板查看的方法,可以看到“人物头像”的坐标是(720,65),那么脚本如下:
function main()
touchDown(0, 720, 65); -- 手指按下人物头像的位置,第一个参数0是手指ID,这个在多点触摸时会用到。
touchUp(0); -- 手指抬起
end
那么我们想找图点击呢,这时候我们需要找图的是这样的:
就像上面的图片,我们要找的图也必须是从竖着的图片上扣取下了的。
5.横屏游戏如何更容易的编写呢
通过第4讲里的说明,我们可以看到触摸精灵默认的坐标体系对于编写横屏游戏来说不太友好,因为我们可能想要这样的坐标体系:
我们想要上面图片中的左上角是(0,0),右上角是(0,1024),左下角是(0, 768),右下角是(1024,768),那么我们就可以使用rotateScreen()函数来做到这一点了。
rotateScreen()函数用于设置触摸精灵的坐标体系,它的参数有4个选项:
- 0:这个是默认的选项,就是竖着拿设备,HOME键在下面时候,左上角是(0,0)原点
- 90:这个对应大部分的横屏游戏,即横着拿设备,HOME键在右面的时候,左上角是(0, 0)原点
- -90:这个对应小部分横屏游戏,即横着拿设备,HOME键在左面的时候,左上角是(0,0)原点
- 180:这个是竖着拿设备,HOME键在上面时候,左上角是(0,0)原点
对于大部分横屏游戏来说,我们可以用rotateScreen(90)将触摸精灵的坐标体系与其设置成一样的,比如我们使用如下脚本截图:
function main()
mSleep(1000); -- 延迟一秒
rotateScreen(90); -- 设置触摸精灵的坐标体系设置成和游戏一致
snapshotScreen("/var/touchelf/a.bmp"); -- 截图保存到/var/touchelf/a.bmp文件
end
通过上面的脚本截到的图片如下:
我们可以发现,这时候获取的图片和游戏的画面是一致的了,都是横着的。
那么我们想以横屏游戏的左上角为原点发送点击怎么做呢,很简单,在脚本开始的时候加入rotateScreen(90),以后的touchDown()等函数就可以传给他横屏游戏的坐标了,比如还是想点击“人物头像”,我们在Photoshop的信息面板中查看坐标如下:
可以看到“人物头像”的坐标是(58,54),那么可以这样写:
function main()
rotateScreen(90); -- 设置触摸精灵的坐标体系设置成和游戏一致
touchDown(0, 58, 54); -- 以游戏画面左上角为原点,发送点击动作
touchUp(0);
end
那么我们想通过找图来点击呢,而且不想像第4讲里的那样找竖着的图,我们想找如下这样的图:
我们把这个横屏图片的人物头像截图放到/var/touchelf/b.bmp位置,然后再简单的修改上面的找图脚本就可以了:
function main()
rotateScreen(90); -- 设置触摸精灵的坐标体系设置成和游戏一致
x, y = findImage("/var/touchelf/touchelf.bmp"); -- 查找touchelf.bmp这个图标在屏幕的位置,坐标保存到x和y里,这时返回的坐标也是以横屏游戏的左上角为原点的。
if x ~= -1 and y ~= -1 then -- 如果x和y都不是-1的话,说明找到了
touchDown(0, x+5, y+5); -- 那么点击找图返回的坐标
touchUp(0); -- 手指抬起
else -- 否则,也就是x和y有一个是-1的话,说明没找到
notifyMessage("没有找到"); -- 显示消息
end
end
end
不建议使用第5种方案编写脚本。
os.execute 的相关应用
--注销
os.execute("killall -9 SpringBoard");
--关机
os.execute("halt");
--重启
os.execute("reboot");
--清除缓存
os.execute("su mobile -c uicache");
--安装apk
os.execute("pm install /路径/文件名.apk");
--卸载apk
os.execute("pm uninstall 包名");
--删除文件、文件夹
function remove(path)
return os.execute("rm -rf "..path);
end
参数说明:path为要删除文件的路径,支持*通配符。
如要删除test.lua的文件,则输入:
remove("/var/touchelf/scripts/test.lua");
当然也可直接用自带的系统库函数,但不能删文件夹
os.remove("/var/touchelf/scripts/test.lua");
--移动文件
function move(path,to)
return os.execute("mv "..path.." "..to);
end
参数说明:
1.path为待移动文件的路径,支持*通配符。
2.to为要移到的文件路径,注意先判断是否有重名文件或文件夹。
如要移动log.txt到scripts/test.lua,则输入:
move("/var/touchelf/log.txt","/var/touchelf/scripts/test.lua");
--复制文件
function copy(path,to)
return os.execute("cp -rf "..path.." "..to);
end
参数说明:
1.path为待复制文件的路径,支持*通配符。
2.to为要复制到的文件路径,注意先判断是否有重名文件或文件夹。
如要复制log.txt到scripts/test.lua,则输入:
copy("/var/touchelf/log.txt","/var/touchelf/scripts/test.lua");
--创建文件夹
function newfolder(path)
return os.execute("mkdir "..path);
end
参数说明:path为要创建文件夹的路径。
如要创建test文件夹,则输入:
newfolder("/var/touchelf/scripts/test");
--创建文件
function newfile(path)
return os.execute("touch "..path);
end
参数说明:path为要创建文件的路径。
如要创建test.lua文件,则输入:
newfile("/var/touchelf/scripts/test.lua");
--获取文件相关信息
function main()
path="/var/touchelf/scripts/test.lua"
f=io.file(path) --获取文件
notifyMessage(f:size()) --显示文件大小
if f:chown("root") then --改变文件所有者
notifyMessage(f:chown()) --显示文件所有者
end
if f:chmod(777) then --改变文件权限
notifyMessage(f:chmod()) --显示文件权限
end
notifyMessage(f:time()) --显示文件修改时间
end
function io.file(path)
local _={}
function _:chmod(mode)
if mode then
return os.execute("chmod "..mode.." "..path)
else
return string.sub(io.popen("ls -l "..path):read("*l"),2,10)
end
end
function _:chown(mode)
if mode then
return os.execute("chown "..mode.." "..path)
else
return string.match(io.popen("ls -l "..path):read("*l"),string.rep("[^ ]+[ ]+",2).."([^ ]+)")
end
end
function _:size()
return string.match(io.popen("ls -l "..path):read("*l"),string.rep("[^ ]+[ ]+",4).."([^ ]+)")
end
function _:time()
return string.match(io.popen("ls -l "..path):read("*l"),string.rep("[^ ]+[ ]+",5).."("..string.rep("[^ ]+[ ]+",3)..")")
end
return _
end
--解压zip文件
function unzip(path,to)
return os.execute("unzip "..path.." -d "..to);
end
参数说明:
1.path为待解压文件的路径。
2.to为要解压到的文件夹路径,默认不覆盖。
如要解压test.zip的文件,则输入:
unzip("/var/touchelf/scripts/test.zip","/var/touchelf/scripts/");
补充:使用-P可以实现带密码解压,load()、dofile()可以运行字符串或脚本文件。
io库 的相关应用
--读取指定文件所有内容,返回一个数组
function readFile(path)
local file = io.open(path,"r");--用读模式打开一个文件
if file then
local _list = {};
for l in file:lines() do
table.insert(_list,l)
end
file:close();--关闭默认的输出文件
return _list
end
end
list = readFile("/var/touchelf/scripts/test.txt");
参数说明:path为要读取文件的路径。
返回值:返回一个table。
io.open按指定的模式打开一个文件,成功则返回文件句柄,失败则返回nil。
常用模式:
"r": 读模式 (默认);
"w": 写模式;
"a": 添加模式;
"r+": 更新模式,所有之前的数据将被保存
"w+": 更新模式,所有之前的数据将被清除
"a+": 添加更新模式,所有之前的数据将被保存,只允许在文件尾进行添加
flie:lines()打开指定的文件为读模式并返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回nil,并自动关闭文件
--遍历文件
function list(path)
return io.popen("ls "..path);
end
参数说明:path为要列举文件的文件夹的路径,支持*通配符。
如要列举scripts文件夹下所有的脚本文件,则输入:
list("/var/touchelf/scripts/")
返回值:文件,请用read()函数读取,文件结构为各文件的文件名并以\n连接的字符串,如使用通配符,则还包含父文件夹名。
--查找文件
function find(path)
return io.popen("find "..path.." -prune");
end
参数说明:path为要查找文件的路径,支持*通配符。
如要查找后缀为.lua的文件,则输入:
find("/var/touchelf/scripts/*.lua")
返回值:文件,请用read()函数读取,文件结构为各文件的完整路径并以\n连接的字符串。
----检测指定文件是否存在
function file_exists(file_name)
local f = io.open(file_name, "r")
return f ~= nil and f:close()
end
参数说明:path为要查找文件的路径。
返回值:返回 true、false。
if file_exists("/var/touchelf/scripts/test.lua") then
notifyMessage("Yes");
else
notifyMessage("No");
end
string库 的相关应用
基本函数
函数 | 描述 | 示例 | 结果 |
---|---|---|---|
len | 计算字符串长度 | string.len("abcd") | 4 |
rep | 返回字符串s的n个拷贝 | string.rep("abcd",2) | abcdabcd |
lower | 返回字符串全部字母大写 | string.lower("AbcD") | abcd |
upper | 返回字符串全部字母小写 | string.upper("AbcD") | ABCD |
format | 格式化字符串 | string.format("the value is:%d",4) | the value is:4 |
sub | 从字符串里截取字符串 | string.sub("abcd",2) | bcd |
string.sub("abcd",-2) | cd | ||
string.sub("abcd",2,-2) | bc | ||
string.sub("abcd",2,3) | bc | ||
find | 在字符串中查找(显示位置) | string.find("cdcdcdcd","ab") | nil |
string.find("cdcdcdcd","cd") | 1 2 | ||
string.find("cdcdcdcd","cd",7) | 7 8 | ||
match | 在字符串中查找(显示内容) | string.match("cdcdcdcd","ab") | nil |
string.match("cdcdcdcd","cd") | cd | ||
gsub | 在字符串中替换 | string.gsub("abcdabcd","a","z"); | zbcdzbcd 2 |
string.gsub("aaaa","a","z",3); | zzza 3 | ||
byte | 返回字符的整数形式 | string.byte("ABCD",4) | 68 |
char | 将整型数字转成字符并连接 | string.char(97,98,99,100) | abcd |
基本模式串
字符类 | 描述 | 示例 | 结果 |
---|---|---|---|
. | 任意字符 | string.find("",".") | nil |
%s | 空白符 | string.find("ab cd","%s%s") | 3 4 |
%S | 非空白符 | string.find("ab cd","%S%S") | 1 2 |
%p | 标点字符 | string.find("ab,.cd","%p%p") | 3 4 |
%P | 非标点字符 | string.find("ab,.cd","%P%P") | 1 2 |
%c | 控制字符 | string.find("abcdtn","%c%c") | 5 6 |
%C | 非控制字符 | string.find("tnabcd","%C%C") | 3 4 |
%d | 数字 | string.find("abcd12","%d%d") | 5 6 |
%D | 非数字 | string.find("12abcd","%D%D") | 3 4 |
%x | 十六进制数字 | string.find("efgh","%x%x") | 1 2 |
%X | 非十六进制数字 | string.find("efgh","%X%X") | 3 4 |
%a | 字母 | string.find("AB12","%a%a") | 1 2 |
%A | 非字母 | string.find("AB12","%A%A") | 3 4 |
%l | 小写字母 | string.find("ABab","%l%l") | 3 4 |
%L | 大写字母 | string.find("ABab","%L%L") | 1 2 |
%u | 大写字母 | string.find("ABab","%u%u") | 1 2 |
%U | 非大写字母 | string.find("ABab","%U%U") | 3 4 |
%w | 字母和数字 | string.find("a1()","%w%w") | 1 2 |
%W | 非字母非数字 | string.find("a1()","%W%W") | 3 4 |
转义字符%
字符类 | 描述 | 示例 | 结果 |
---|---|---|---|
% | 转义字符 | string.find("abc%..","%%") | 4 4 |
string.find("abc..d","%.%.") | 4 5 |
用[]创建字符集,"-"为连字符,"^"表示字符集的补集
字符类 | 描述 | 示例 | 结果 |
---|---|---|---|
[01] | 匹配二进制数 | string.find("32123","[01]") | 3 3 |
AB | 匹配AC、AD、BC、BD | string.find("ABCDEF","AB") | 2 3 |
[[]] | 匹配一对方括号[] | string.find("ABC[]D","[[]]") | 4 5 |
[1-3] | 匹配数字1-3 | string.find("312","1-3[1-3]") | 1 3 |
[b-d] | 匹配字母b-d | string.find("dbc","b-d[b-d]") | 1 3 |
[^%s] | 匹配任意非空字符 | string.find(" a ","[^%s]") | 3 3 |
[^%d] | 匹配任意非数字字符 | string.find("123a","[^%d]") | 4 4 |
[^%a] | 匹配任意非字母字符 | string.find("abc1","[^%a]") | 4 4 |
用"()"进行捕获
字符类 | 描述 | 示例 | 结果 |
---|---|---|---|
() | 捕获字符串 | string.find("12ab","(%a%a)") | 3 4 ab |
string.find("ab12","(%d%d)") | 3 4 12 |
模式修饰符
修饰符 | 描述 | 示例 | 结果 |
---|---|---|---|
+ | 表示1个或多个,匹配最多个 | string.find("aaabbb","(a+b)") | 1 4 aaab |
string.find("cccbbb","(a+b)") | nil | ||
- | 表示0个或多个,匹配最少个 | string.find("zzxyyy","(xy-)") | 3 3 x |
string.find("zzzyyy","(x-y)") | 4 4 y | ||
* | 表示0个或多个,匹配最多个 | string.find("mmmnnn","(m*n)") | 1 4 mmmb |
string.find("lllnnn","(m*n)") | 4 4 n | ||
? | 表示0个或1个 | string.find("aaabbb","(a?b)") | 3 4 ab |
string.find("cccbbb","(a?b)") | 4 4 b |
match的常见用法
描述 | 示例 | 结果 |
---|---|---|
匹配中文 | string.match("男女abc123","([^%w%p]+)") | 男女 |
匹配英文 | string.match("男女abc123","(%a+)") | abc |
匹配数字 | string.match("男女abc123","(%d+)") | 123 |
匹配英文和数字 | string.match("男女abc123","(%w+)") | abc123 |
math库 的相关应用
函数名 | 描述 | 示例 | 结果 |
---|---|---|---|
pi | 圆周率 | math.pi | 3.1415926535898 |
abs | 取绝对值 | math.abs(-2012) | 2012 |
ceil | 向上取整 | math.ceil(9.1) | 10 |
floor | 向下取整 | math.floor(9.9) | 9 |
max | 取参数最大值 | math.max(2,4,6,8) | 8 |
min | 取参数最小值 | math.min(2,4,6,8) | 2 |
pow | 计算x的y次幂 | math.pow(2,16) | 65536 |
sqrt | 开平方 | math.sqrt(65536) | 256 |
mod | 取模 | math.mod(65535,2) | 1 |
modf | 取整数和小数部分 | math.modf(20.12) | 20 0.12 |
randomseed | 设随机数种子 | math.randomseed(os.time()) | |
random | 取随机数 | math.random(5,90) | 5~90 |
rad | 角度转弧度 | math.rad(180) | 3.1415926535898 |
deg | 弧度转角度 | math.deg(math.pi) | 180 |
exp | e的x次方 | math.exp(4) | 54.598150033144 |
log | 计算x的自然对数 | math.log(54.598150033144) | 4 |
log10 | 计算10为底,x的对数 | math.log10(1000) | 3 |
frexp | 将参数拆成x * (2 ^ y)的形式 | math.frexp(160) | 0.625 8 |
ldexp | 计算x * (2 ^ y) | math.ldexp(0.625,8) | 160 |
sin | 正弦 | math.sin(math.rad(30)) | 0.5 |
cos | 余弦 | math.cos(math.rad(60)) | 0.5 |
tan | 正切 | math.tan(math.rad(45)) | 1 |
asin | 反正弦 | math.deg(math.asin(0.5)) | 30 |
acos | 反余弦 | math.deg(math.acos(0.5)) | 60 |
atan | 反正切 | math.deg(math.atan(1)) | 45 |
触摸精灵使用cURL命令
安卓系下载cURL模块:http://pan.baidu.com/s/1mie6hIC
将cURL模块放入/system/bin/内
IOS系统Cydia内搜索并下载安装cURL软件。
完成上述内容即可使用cURL命令
--下载脚本
os.execute("curl -o /var/touchelf/scripts/evan.lua.E2 http://www.touchelf.com/evan.lua.E2")
--post命令
os.execute("curl -d 'user=evan&password=12345' http://www.touchelf.com/login.php")
更多cURL命令请自行百度。
触摸精灵模拟物理按键的方法
====================
1. 模拟物理按键(仅限安卓系统)
====================
os.execute("input keyevent 按键键码")
列子:
按下home键
os.execute("input keyevent 3")
打电话给10086
os.execute("input keyevent 5") --按拨号键
os.execute("input text \"10086\"") --输入10086
os.execute("input keyevent 5") --按拨号键打通
以下就是约定的按键键码:
AKEYCODE_UNKNOWN = 0,
AKEYCODE_SOFT_LEFT = 1,
AKEYCODE_SOFT_RIGHT = 2,
AKEYCODE_HOME = 3,
AKEYCODE_BACK = 4,
AKEYCODE_CALL = 5,
AKEYCODE_ENDCALL = 6,
AKEYCODE_0 = 7,
AKEYCODE_1 = 8,
AKEYCODE_2 = 9,
AKEYCODE_3 = 10,
AKEYCODE_4 = 11,
AKEYCODE_5 = 12,
AKEYCODE_6 = 13,
AKEYCODE_7 = 14,
AKEYCODE_8 = 15,
AKEYCODE_9 = 16,
AKEYCODE_STAR = 17,
AKEYCODE_POUND = 18,
AKEYCODE_DPAD_UP = 19,
AKEYCODE_DPAD_DOWN = 20,
AKEYCODE_DPAD_LEFT = 21,
AKEYCODE_DPAD_RIGHT = 22,
AKEYCODE_DPAD_CENTER = 23,
AKEYCODE_VOLUME_UP = 24,
AKEYCODE_VOLUME_DOWN = 25,
AKEYCODE_POWER = 26,
AKEYCODE_CAMERA = 27,
AKEYCODE_CLEAR = 28,
AKEYCODE_A = 29,
AKEYCODE_B = 30,
AKEYCODE_C = 31,
AKEYCODE_D = 32,
AKEYCODE_E = 33,
AKEYCODE_F = 34,
AKEYCODE_G = 35,
AKEYCODE_H = 36,
AKEYCODE_I = 37,
AKEYCODE_J = 38,
AKEYCODE_K = 39,
AKEYCODE_L = 40,
AKEYCODE_M = 41,
AKEYCODE_N = 42,
AKEYCODE_O = 43,
AKEYCODE_P = 44,
AKEYCODE_Q = 45,
AKEYCODE_R = 46,
AKEYCODE_S = 47,
AKEYCODE_T = 48,
AKEYCODE_U = 49,
AKEYCODE_V = 50,
AKEYCODE_W = 51,
AKEYCODE_X = 52,
AKEYCODE_Y = 53,
AKEYCODE_Z = 54,
AKEYCODE_COMMA = 55,
AKEYCODE_PERIOD = 56,
AKEYCODE_ALT_LEFT = 57,
AKEYCODE_ALT_RIGHT = 58,
AKEYCODE_SHIFT_LEFT = 59,
AKEYCODE_SHIFT_RIGHT = 60,
AKEYCODE_TAB = 61,
AKEYCODE_SPACE = 62,
AKEYCODE_SYM = 63,
AKEYCODE_EXPLORER = 64,
AKEYCODE_ENVELOPE = 65,
AKEYCODE_ENTER = 66,
AKEYCODE_DEL = 67,
AKEYCODE_GRAVE = 68,
AKEYCODE_MINUS = 69,
AKEYCODE_EQUALS = 70,
AKEYCODE_LEFT_BRACKET = 71,
AKEYCODE_RIGHT_BRACKET = 72,
AKEYCODE_BACKSLASH = 73,
AKEYCODE_SEMICOLON = 74,
AKEYCODE_APOSTROPHE = 75,
AKEYCODE_SLASH = 76,
AKEYCODE_AT = 77,
AKEYCODE_NUM = 78,
AKEYCODE_HEADSETHOOK = 79,
AKEYCODE_FOCUS = 80, // *Camera* focus
AKEYCODE_PLUS = 81,
AKEYCODE_MENU = 82,
AKEYCODE_NOTIFICATION = 83,
AKEYCODE_SEARCH = 84,
AKEYCODE_MEDIA_PLAY_PAUSE= 85,
AKEYCODE_MEDIA_STOP = 86,
AKEYCODE_MEDIA_NEXT = 87,
AKEYCODE_MEDIA_PREVIOUS = 88,
AKEYCODE_MEDIA_REWIND = 89,
AKEYCODE_MEDIA_FAST_FORWARD = 90,
AKEYCODE_MUTE = 91,
AKEYCODE_PAGE_UP = 92,
AKEYCODE_PAGE_DOWN = 93,
AKEYCODE_PICTSYMBOLS = 94,
AKEYCODE_SWITCH_CHARSET = 95,
AKEYCODE_BUTTON_A = 96,
AKEYCODE_BUTTON_B = 97,
AKEYCODE_BUTTON_C = 98,
AKEYCODE_BUTTON_X = 99,
AKEYCODE_BUTTON_Y = 100,
AKEYCODE_BUTTON_Z = 101,
AKEYCODE_BUTTON_L1 = 102,
AKEYCODE_BUTTON_R1 = 103,
AKEYCODE_BUTTON_L2 = 104,
AKEYCODE_BUTTON_R2 = 105,
AKEYCODE_BUTTON_THUMBL = 106,
AKEYCODE_BUTTON_THUMBR = 107,
AKEYCODE_BUTTON_START = 108,
AKEYCODE_BUTTON_SELECT = 109,
AKEYCODE_BUTTON_MODE = 110,
触摸精灵安卓启动APK直达某些页面的方法
os.execute("am start -n {包(package)名} / {包名}.{活动(activity)名称}")
包名package和活动activity名称可以反编译apk后,在每个apk的AndroidManifest.xml里面查看。
示例:
启动计算器
os.execute("am start -n com.android.calculator2/com.android.calculator2.Calculator")
AlarmClock(闹钟)的启动方法为:
os.execute("am start -n com.android.alarmclock/com.android.alarmclock.AlarmClock")
启动浏览器 :
os.execute("am start -a android.intent.action.VIEW -d http://www.google.cn/ ")
拨打电话给10086 :
os.execute("am start -a android.intent.action.CALL -d tel:10086")
启动 google map 直接定位到北京 :
os.execute("am start -a android.intent.action.VIEW geo:0,0?q=beijing")