random click and gesture for android 7.0+!!!

This commit is contained in:
hyb1996
2017-05-16 21:40:23 +08:00
parent ec98d75d3b
commit c4ec951a10
42 changed files with 757 additions and 564 deletions

View File

@@ -39,6 +39,11 @@
"type": "markdown",
"path":"documentation"
},
{
"title": "Android7.0以上点按与手势模拟",
"type": "markdown",
"path": "documentation"
},
{
"title": "模块与第三方jar",
"type": "markdown",

View File

@@ -0,0 +1,79 @@
在Android7.0及以上可以不需要root权限做到任意坐标的点击滑动和手势模拟并且比使用root权限的延迟更短。
**注意以下命令只有Android7.0及以上才有效**
### click(x, y)
* x \<Number\> 要点击的坐标的x值
* y \<Number\> 要点击的坐标的y值
模拟点击坐标(x, y),并返回是否点击成功。只有在点击执行完成后脚本才继续执行。
一般而言,只有点击过程(大约150毫秒)中被其他事件中断(例如用户自行点击)才会点击失败。
> 可以在开发者选项中启用指针位置来查看坐标
### longClick(x, y)
* x \<Number\> 要长按的坐标的x值
* y \<Number\> 要长按的坐标的y值
模拟长按坐标(x, y), 并 返回是否成功。只有在长按执行完成大约600毫秒时脚本才会继续执行。
一般而言,只有长按过程中被其他事件中断(例如用户自行点击)才会长按失败。
### press(x, y, duration)
* x \<Number\> 要按住的坐标的x值
* y \<Number\> 要按住的坐标的y值
* duration \<Number\> 按住时长,单位毫秒
模拟按住坐标(x, y), 并返回是否成功。只有按住操作执行完成时脚本才会继续执行。
如果按住时间过短那么会被系统认为是点击如果时长超过500毫秒则认为是长按。
一般而言,只有按住过程中被其他事件中断才会操作失败。
### swipe(x1, y1, x2, y2, duration)
* x1 \<Number\> 滑动的起始坐标的x值
* y1 \<Number\> 滑动的起始坐标的y值
* x2 \<Number\> 滑动的结束坐标的x值
* y2 \<Number\> 滑动的结束坐标的y值
* duration \<Number\> 滑动时长,单位毫秒
模拟从坐标(x1, y1)滑动到坐标(x2, y2),并返回是否成功。只有滑动操作执行完成时脚本才会继续执行。
一般而言,只有滑动过程中被其他事件中断才会滑动失败。
### gesture(duration, \[x1, y1\], \[x2, y2\], ...)
* duration \<Number\> 手势的时长
* \[x, y\] \<Array\> 手势滑动路径的一系列坐标
模拟手势操作。例如`gesture(1000, [0, 0], [500, 500], [500, 1000])`为模拟一个从(0, 0)到(500, 500)到(500, 100)的手势操作时长为2秒。
### gestures(\[delay, duration, \[x1, y1\], \[x2, y2\], ...], \[delay, duration, \[x3, y3\], \[x4, y4\], ...\], ...)
同时模拟多个手势。每个手势的参数为\[delay, duration, 坐标\], delay为延迟多久(毫秒)才执行该手势duration为手势执行时长坐标为手势经过的点的坐标。其中delay参数可以省略默认为0。
参见示例。
### setScreenMetrics(width, height)
* width \<Number\> 屏幕宽度,单位像素
* height <\Number\> 屏幕高度,单位像素
设置脚本坐标点击所适合的屏幕宽高。如果脚本运行时,屏幕宽度不一致会自动放缩坐标。
例如在1920*1080的设备中某个操作的代码为
```
setScreenMetrics(1080, 1920);
click(800, 200);
longClick(300, 500);
```
那么在其他设备上AutoJs会自动放缩坐标以便脚本仍然有效。

View File

@@ -0,0 +1,11 @@
"auto";
launchApp("QQ");
sleep(2000);
while(true){
if(currentPackage() == 'com.tencent.mobileqq'){
swipe(600, 700, 600, 1400, 400);
}
sleep(300);
}

View File

@@ -0,0 +1,14 @@
"auto";
/**
* 同时模拟三个手势:
* 从(300, 400)到(300, 1400)
* 从(600, 400)到(600, 1400)
* 从(900, 400)到(900, 1400)
* 每一个的时长都为350毫秒
*/
gestures([350, [300, 400], [300, 1400]],
[350, [600, 400], [600, 1400]],
[350, [900, 400], [900, 1400]]
);

View File

@@ -0,0 +1,10 @@
"auto";
setScreenMetrics(1080, 1920);
//如果你使用的是MIUI此脚本运行后会出现桌面多屏幕编辑
home();
sleep(1500);
gestures([350, [800, 300], [500, 1000]],
[350, [300, 1500], [500, 1000]],
[350, [300, 300], [500, 1000]]);

View File

@@ -0,0 +1,9 @@
"auto";
setScreenMetrics(1080, 1920);
//如果你使用的是MIUI此脚本运行后会出现桌面编辑
home();
sleep(1500);
gestures([500, [800, 300], [500, 1000]],
[500, [300, 1500], [500, 1000]]);

View File

@@ -0,0 +1,19 @@
"auto";
toast("开启开发者选项-指针位置或者在画画软件才能查看效果");
setScreenMetrics(1080, 1920);
var points = [10000];
var interval = 0.1;
var x0 = 600;
var y0 = 1000;
var a = 120;
for(var t = 0; t < 2 * Math.PI; t += interval){
var x = x0 + a * (2 * Math.cos(t) - Math.cos(2 * t));
var y = y0 + a * (2 * Math.sin(t) - Math.sin(2 * t));
points.push([parseInt(x), parseInt(y)]);
}
gesture.apply(null, points);

View File

@@ -0,0 +1,4 @@
"auto";
//表示从位置(500, 10)滑动到位置(500, 1000), 持续两秒
swipe(500, 10, 500, 1000, 2000);

View File

@@ -0,0 +1,5 @@
"auto";
setScreenMetrics(1080, 1920);
click(100, 150);

View File

@@ -1,24 +1,21 @@
"ui";
importClass(android.widget.EditText);
importClass(android.widget.Button);
importClass(android.widget.LinearLayout);
importClass(android.content.Intent);
importClass(android.net.Uri);
ui.statusBarColor("#03a9f4");
var qq = new EditText(activity);
qq.setHint("请输入QQ号");
var btnOk = new Button(activity);
btnOk.setText("确定");
var container = new LinearLayout(activity);
container.addView(qq);
container.addView(btnOk);
activity.setContentView(container);
ui.layout(
<vertical>
<text w="*" h="56" bg="#03a9f4" paddingLeft="16" gravity="center_vertical" color="#fff" size="18sp">QQ打开聊天窗口</text>
<vertical h="*" w="*" margin="16 50">
<input id="qq" h="50" hint="请输入QQ号"/>
<button id="ok" text="确定" />
</vertical>
</vertical>
)
btnOk.setOnClickListener(function(view){
ui.ok.click(function(){
app.startActivity({
action: "android.intent.action.VIEW",
data: "mqqwpa://im/chat?chat_type=wpa&uin=" + qq.getText()
data: "mqqwpa://im/chat?chat_type=wpa&uin=" + ui.qq.text()
});
activity.finish();
ui.finish();
});

View File

@@ -0,0 +1,67 @@
"ui";
/**
* By Da Zhang
* 本脚本仅为娱乐,没有任何破坏性质
*/
ui.statusBarColor("#AA0000");
var Quin = 32552732;
ui.layout(
<frame background="#AA0000">
<vertical align="top" paddingTop="5" margin="10">
<text id="oops" color="#FFFFFF" gravity="center" size="20">Oops, your files have been encrypted!</text>
<text id="text" bg="#FFFFFF" gravity="left" color="#000" size="15" marginTop="15" h="425"></text>
<button id="payment" text="Payment" margin="20 0 0 0"/>
<button id="decrypt" text="Decrypt"/>
</vertical>
</frame>
);
ui.text.text("我的手机出了什么问题?\n您的一些重要文件被我加密保存了。\n" +
"照片、图片、文档、压缩包、音频、视频文件、apk文件等几乎所有类型的文件都被加密了因此不能正常打开。\n" +
"这和一般文件损坏有本质上的区别。您大可在网上找找恢复文件的方法,我敢保证,没有我们的解密服务,就算老天爷来了也不能恢复这些文档。\n\n" +
"有没有恢复这些文档的方法?\n当然有可恢复的方法。只能通过我们的解密服务才能恢复。我以人格担保能够提供安全有效的恢复服务。\n" +
"但这是收费的,也不能无限期的推迟。\n请点击 <Decrypt> 按钮,就可以免费恢复一些文档。请您放心,我是绝不会骗你的。\n" +
"但想要恢复全部文档,需要付款点费用。\n是否随时都可以固定金额付款就会恢复的吗当然不是推迟付款时间越长对你不利。\n" +
"最好3天之内付款费用过了三天费用就会翻倍。\n还有一个礼拜之内未付款将会永远恢复不了。\n" +
"对了,忘了告诉你,对半年以上没钱付款的穷人,会有活动免费恢复,能否轮到你,就要看您的运气怎么样了。");
ui.oops.click(() => toast("Fuck you!"));
ui.oops.longClick(() => {
var thisjoke="This is a joke : )";
if(ui.oops.text() != thisjoke){
ui.oops.text(thisjoke);
}else{
ui.oops.text("Oops, your files have been encrypted!");
}
return true;
});
ui.text.click(() => ui.text.append("。"));
ui.text.longClick(() => {
ui.text.setText("\n"+ui.text.getText())
return true;
});
ui.payment.click(() => {
try{
app.startActivity({
action:"android.intent.action.VIEW",
data:"mqqapi://card/show_pslcard?&uin=" + Quin
});
toast("Please payment by QQ");
}catch(e){
toast("Payment Error");
}
});
ui.payment.longClick(() => {
toast("You are silly b!");
return true;
});
ui.decrypt.click(() => {
toast("Decrypt Error");
activity.finish();
});
ui.decrypt.longClick(() => {
toast("You can't decrypt!");
return true;
});