add some scripts

This commit is contained in:
hyb1996
2017-05-10 20:48:26 +08:00
parent 1222e00adc
commit 39c1444b0f
31 changed files with 382 additions and 84 deletions

View File

@@ -9,8 +9,8 @@ android {
applicationId "com.stardust.scriptdroid" applicationId "com.stardust.scriptdroid"
minSdkVersion 19 minSdkVersion 19
targetSdkVersion 23 targetSdkVersion 23
versionCode 125 versionCode 126
versionName "2.0.9 Beta" versionName "2.0.10 Beta"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true multiDexEnabled true
ndk { ndk {

View File

@@ -14,7 +14,9 @@ function 显示更多(){
} }
} }
toast("请打开点赞自己的人的界面"); toast("请打开自己的资料页,点击点赞图标");
sleep(100);
while(notStopped()){ while(notStopped()){
for(let i = 0; i < 10; i++){ for(let i = 0; i < 10; i++){
(); ();

View File

@@ -0,0 +1,17 @@
"auto";
launchApp("QQ");
toast("请打开一个聊天窗口将会循环发送第一张图片100次");
while(!id("ivTitleBtnRightImage").exists());
var listParent = className("AbsListView").findOne().parent();
var icons = listParent.child(listParent.childCount() - 2);
icons.child(1).click();
sleep(200);
for(i = 0; i < 100;i++){
className("CheckBox").untilFindOne().click();
sleep(200);
id("send_btn").click();
}

View File

@@ -0,0 +1,27 @@
"auto";
if (confirm("将会取关所有公众号,是否继续")) {
unfollowAll();
}
function unfollowAll() {
launchApp("微信");
sleep(1000);
while (!click("通讯录"));
while (!click("公众号"));
sleep(500);
while (true) {
className("ListView").findOne().children().each(function(item) {
if (item.longClickable()) {
unfollow(item);
sleep(400);
}
});
}
}
function unfollow(item) {
item.longClick();
while (!click("取消关注"));
while (!click("不再关注"));
}

View File

@@ -0,0 +1,54 @@
"auto";
//漏赞过多请稍微调大延迟
var 延迟 = 200;
launchApp("QQ");
//点击联系人图标
className("TabWidget").findOne().child(1).click();
toast("请展开要点赞的分组");
var fail = 0;
while(true){
var list = id("elv_buddies").className("AbsListView").findOne();
var count = list.childCount();
print("count" + list.childCount());
for(let i = 0; i < count; i++){
try{
let child = list.child(i);
print(i);
if(isFriend(child)){
//点进好友名片
child.click();
fav(10);
backToList();
sleep(延迟);
}
}catch(e){
fail++;
toast("可能漏赞:" + fail);
}
}
list.scrollForward();
}
//点赞
function fav(times){
var i = 0;
var btn = descEndsWith("点击可赞").findOne();
while(i < times){
i += btn.click()? 1 : 0;
}
}
//判断是否是好友的视图
function isFriend(child){
return child && child.className().endsWith("LinearLayout") && child.childCount() == 2 && child.child(0).className().endsWith("FrameLayout");
}
//返回好友列表
function backToList(){
id("ivTitleBtnLeft").click();
}

View File

@@ -0,0 +1,10 @@
"auto";
toast("请打开一个聊天窗口");
sleep(500);
while(true){
input("我喜欢你");
click("发送");
sleep(200);
}

View File

@@ -3,6 +3,6 @@
while(true){ while(true){
if(id("i4").untilFindOne().parent().parent().click()){ if(id("i4").untilFindOne().parent().parent().click()){
sleep(700); sleep(700);
id("gf").click(); back();
} }
} }

View File

@@ -0,0 +1,18 @@
"auto";
launchApp("微信");
while(!click("通讯录"));
toast("在好友列表中点谁删谁。被删除的好友将在日志中记录。");
while(true){
if(desc("更多").exists()){
var weChatId = textContains("微信号").find();
if(weChatId && weChatId.size()){
console.log(weChatId.get(0).text());
}
while(!desc("更多").click());
while(!click("删除"));
while(!click("删除"));
sleep(200);
}
}

View File

@@ -0,0 +1,29 @@
"auto";
launchApp("微信");
sleep(500);
while(!click("发现"));
while(!click("朋友圈"));
descContains("我的头像").click();
toast("请点击要删除的朋友圈");
while(true){
deletePost();
sleep(200);
}
function deletePost(){
var isPhoto = desc("更多").exists();
if(isPhoto){
desc("更多").click();
}
if(click("删除")){
while(!click("确定"));
sleep(200);
if(isPhoto){
while(!back());
}
}
}

View File

@@ -0,0 +1,25 @@
"auto";
launchApp("微信");
enterOfficialAccounts();
sleep(200);
toast("请点击要取关的公众号");
while(true){
//点击右上角小人图标
desc("聊天信息").findOne().click();
//获取微信号并记录
var weChatId = textContains("微信号").findOne();
console.log("取关: " + weChatId.text());
//点击右上角三个小点儿
desc("更多").findOne().click();
while(!click("不再关注"));
sleep(200);
while(!click("不再关注"));
sleep(200);
enterOfficialAccounts();
}
//进入公众号界面
function enterOfficialAccounts(){
while(!click("通讯录"));
while(!click("公众号"));
}

View File

@@ -0,0 +1,23 @@
"auto";
//下滑
function scroll(){
className("ListView").scrollForward();
}
//尝试点赞
function tryFav(btn){
btn.click();
sleep(300);
if(!click("赞")){
btn.click();
}
}
while(true){
var c = className("ImageView").desc("评论").untilFind();
c.each(function(btn){
tryFav(btn);
});
scroll();
}

View File

@@ -0,0 +1,34 @@
"auto";
launchApp("网易云音乐");
toast("打开一个歌曲的评论页面");
//循环直至当前为评论页面
waitActivity("com.netease.cloudmusic.activity.ResourceCommentActivity");
while(true){
var list = className("ListView").findOne();
list.find(className("RelativeLayout")).each(function(item){
if(item && item.childCount() >= 3){
//点赞按钮
var fav = item.child(2);
if(fav){
//获取点赞次数
var favCount = parseInt(fav.text());
fav.click();
sleep(100);
fav.refresh();
//如果点了以后点赞数减少了,那么说明赞被取消了,再点一次
if(parseInt(fav.text()) < favCount){
fav.click();
}
sleep(100);
}
}
});
//下滑
list.scrollForward();
}

View File

@@ -0,0 +1,6 @@
"auto";
launchApp("网易云音乐");
sleep(500);
classNameEndsWith("DrawerLayout").findOne().child(0).child(1).child(0).child(0).click();
text("签到").className("TextView").click();

View File

@@ -0,0 +1,40 @@
"auto";
launchApp("百度贴吧");
sleep(1000);
while(!click("进吧"));
toast("开始签到");
var signed = {};
while(true){
var list = id("fragment_pager").findOne().findOne(id("listview"));
list.children().each(function(child){
if(child && child.className().endsWith("RelativeLayout")){
if(child.childCount() > 1){
sign(child);
}
}
});
list.scrollForward();
}
function sign(child){
var li = child.child(1);
if(li && li.childCount() > 0){
var name = li.child(0).text();
if(signed[name]){
return;
}
child.click();
sleep(400);
for(var i = 0; i < 3; i ++){
if(click("签到")){
break;
}
sleep(200);
}
sleep(400);
while(!back());
signed[name] = true;
}
}

View File

@@ -0,0 +1,5 @@
"auto";
var appName = rawInput("请输入应用名称");
openAppSetting(getPackageName(appName));
while(!click("强制停止"));

View File

@@ -16,7 +16,9 @@ container.addView(btnOk);
activity.setContentView(container); activity.setContentView(container);
btnOk.setOnClickListener(function(view){ btnOk.setOnClickListener(function(view){
activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("mqqwpa://im/chat?chat_type=wpa&uin=" + qq.getText())) app.startActivity({
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); action: "android.intent.action.VIEW",
data: "mqqwpa://im/chat?chat_type=wpa&uin=" + qq.getText()
});
activity.finish(); activity.finish();
}); });

View File

@@ -1,24 +0,0 @@
"auto";
function 打开正在运行的服务(){
launch("com.android.settings");
var i = 0;
while(!click("开发者选项")){
i++;
if(i == 10){
toast("开发者选项未开启");
return;
}
scrollDown();
}
while(!click("正在运行的服务"));
}
importClass(android.os.Build);
if(Build.VERSION.SDK_INT < 23){
toast("本代码只适用于Android6.0以上");
}else{
打开正在运行的服务();
}

View File

@@ -1,8 +0,0 @@
"auto";
launchApp("QQ");
toast("打开一个聊天窗口,并点击下面的图片按钮");
for(i = 0; i < 100;i++){
className("CheckBox").untilFindOne().click();
id("send_btn").click();
}

View File

@@ -1,15 +0,0 @@
"auto";
function 取消关注(){
id("af9").longClickable().longClick();
click("取消关注");
click("不再关注");
}
toast("请在10秒内打开订阅号界面");
toast("10秒后如果没有反应请稍微滑动一下页面");
sleep(10 * 1000);
while(true){
取消关注();
}

View File

@@ -1,18 +0,0 @@
function 下滑(){
className("ListView").scrollForward();
}
function 尝试点赞(btn){
btn.click();
sleep(300);
if(!click("赞"))
btn.click();
}
while(true){
var c = className("ImageView").desc("评论").untilFind();
c.each(function(btn){
尝试点赞(btn);
});
下滑();
}

View File

@@ -1,5 +0,0 @@
"auto";
launchApp("网易云音乐");
id("kp").click();
text("签到").className("TextView").click();

View File

@@ -35,4 +35,11 @@ module.exports = function(__runtime__, scope){
scope.currentActivity = function(){ scope.currentActivity = function(){
return __runtime__.info.getLatestActivity(); return __runtime__.info.getLatestActivity();
} }
scope.waitActivity = function(activity, delay){
delay = delay || 200;
while(scope.currentActivity() != activity){
sleep(delay);
}
}
} }

View File

@@ -87,12 +87,13 @@ public class UiSelector extends UiGlobalSelector {
mAllocator = allocator; mAllocator = allocator;
} }
@NonNull
@ScriptInterface @ScriptInterface
public UiObjectCollection find() { public UiObjectCollection find() {
ensureAccessibilityServiceEnabled(); ensureAccessibilityServiceEnabled();
if (AutomatorConfig.isUnintendedGuardEnabled() && isRunningPackageSelf()) { if (AutomatorConfig.isUnintendedGuardEnabled() && isRunningPackageSelf()) {
Log.d(TAG, "isSelfPackage return null"); Log.d(TAG, "isSelfPackage return null");
return null; return UiObjectCollection.EMPTY;
} }
AccessibilityService service = mAccessibilityBridge.getService(); AccessibilityService service = mAccessibilityBridge.getService();
if (service != null) { if (service != null) {
@@ -101,7 +102,7 @@ public class UiSelector extends UiGlobalSelector {
return findOf(UiObject.createRoot(root, mAllocator)); return findOf(UiObject.createRoot(root, mAllocator));
} }
} }
return null; return UiObjectCollection.EMPTY;
} }
private void ensureAccessibilityServiceEnabled() { private void ensureAccessibilityServiceEnabled() {
@@ -123,7 +124,7 @@ public class UiSelector extends UiGlobalSelector {
throw new ScriptInterruptedException(); throw new ScriptInterruptedException();
} }
uiObjectCollection = find(); uiObjectCollection = find();
} while (uiObjectCollection == null || uiObjectCollection.size() == 0); } while (uiObjectCollection.empty());
return uiObjectCollection; return uiObjectCollection;
} }
@@ -132,6 +133,12 @@ public class UiSelector extends UiGlobalSelector {
return untilFindOne(); return untilFindOne();
} }
@ScriptInterface
public boolean exists() {
UiObjectCollection collection = find();
return collection.nonEmpty();
}
@NonNull @NonNull
public UiObject untilFindOne() { public UiObject untilFindOne() {
UiObjectCollection collection = untilFind(); UiObjectCollection collection = untilFind();
@@ -159,10 +166,6 @@ public class UiSelector extends UiGlobalSelector {
return untilFind().performAction(action, arguments); return untilFind().performAction(action, arguments);
} }
public boolean exists() {
UiObjectCollection collection = find();
return collection != null && collection.size() > 0;
}
@ScriptInterface @ScriptInterface
public boolean click() { public boolean click() {

View File

@@ -9,6 +9,7 @@ import android.support.annotation.Nullable;
import android.support.v4.util.Pools; import android.support.v4.util.Pools;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.util.Log; import android.util.Log;
import android.view.View;
import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator; import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator;
@@ -308,10 +309,65 @@ public class UiObject extends AccessibilityNodeInfoCompat {
return mAllocator.getParent(this); return mAllocator.getParent(this);
} }
public boolean checkable() {
return isCheckable();
}
public boolean checked() {
return isChecked();
}
public boolean focusable() {
return isFocusable();
}
public boolean focused() {
return isFocused();
}
public boolean visibleToUser() { public boolean visibleToUser() {
return isVisibleToUser(); return isVisibleToUser();
} }
public boolean accessibilityFocused() {
return isAccessibilityFocused();
}
public boolean selected() {
return isSelected();
}
public boolean clickable() {
return isClickable();
}
public boolean longClickable() {
return isLongClickable();
}
public boolean enabled() {
return isEnabled();
}
public boolean password() {
return isPassword();
}
public boolean scrollable() {
return isScrollable();
}
@Override @Override
public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(String text) { public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(String text) {
if (mAllocator == null) if (mAllocator == null)
@@ -356,5 +412,4 @@ public class UiObject extends AccessibilityNodeInfoCompat {
} }
} }
} }

View File

@@ -9,6 +9,7 @@ import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.util.Consumer; import com.stardust.util.Consumer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.*; import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.*;
@@ -27,6 +28,8 @@ import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.
public class UiObjectCollection { public class UiObjectCollection {
public static final UiObjectCollection EMPTY = UiObjectCollection.of(Collections.<UiObject>emptyList());
public static UiObjectCollection ofCompat(List<AccessibilityNodeInfoCompat> list) { public static UiObjectCollection ofCompat(List<AccessibilityNodeInfoCompat> list) {
return new UiObjectCollection(UiObject.compatListToUiObjectList(list)); return new UiObjectCollection(UiObject.compatListToUiObjectList(list));
} }
@@ -217,4 +220,12 @@ public class UiObjectCollection {
} }
return null; return null;
} }
public boolean empty() {
return size() == 0;
}
public boolean nonEmpty() {
return size() != 0;
}
} }