autojs获取QQ群成员列表里的群员数据,免root脚本源码分享

说明

本文提供的代码仅供参考。不建议用于生产环境。
可能有些地方在最新版本的Auto.js上面需要做修改,才能运行。

Auto.js简介

Auto.js是利用安卓系统的“辅助功能”实现类似于按键精灵一样,可以通过代码模拟一系列界面动作的辅助工作。
与“按键精灵”不同的是,它的模拟动作并不是简单的使用在界面定坐标点来实现,而是类似与win一般,找窗口句柄来实现的。

Auto.js使用JavaScript作为脚本语言,目前使用Rhino 1.7.7.2作为脚本引擎,支持ES5与部分ES6特性。

推荐教程

Auto.js Pro安卓全分辨率免ROOT引流脚本开发视频教程(HD超清1080p)

开发文档

Auto.js Pro开发文档
文档尚在完善中,可能有文档描述和代码实际行为有出入的情况。

为什么要使用Auto.js Pro开发脚本,有什么特点?

吸引我使用Auto.js Pro的原因有很多。最主要的几个原因是:

  • Auto.js Pro能开发免ROOT的安卓脚本
  • Auto.js Pro基于节点操作,能开发全分辨率的脚本,自动适配各种安卓机型
  • Auto.js Pro丰富的UI组件,能自定义各种样式的安卓界面
  • Auto.js Pro使用的javascript的语法比较优雅,代码可读性强
  • Auto.js Pro的命令库非常的丰富,接口比较多
  • Auto.js Pro脚本文件体积比较小。1000行的代码,打包后的apk文件只有3-5M,还没有广告

免责声明

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途。

示例代码

// 此代码由飞云脚本圈www.feiyunjs.com整理提供

auto();
console.show();
launchApp("QQ");
toastLog("请手动打开QQ群成员列表界面");
waitForActivity("com.tencent.mobileqq.activity.TroopMemberListActivity");
log("进入");

var json = {
    message: {
        className: "android.widget.FrameLayout"
    },
    Subset: [{
        message: {
            className: "android.widget.FrameLayout",
            id: "com.tencent.mobileqq:id/name"
        },
        Subset: [{
            message: {
                className: "android.widget.LinearLayout",
                id: "com.tencent.mobileqq:id/name"
            },
            Subset: [{
                message: {
                    className: "android.widget.ImageView",
                    id: "com.tencent.mobileqq:id/name"
                }
            }, {
                message: {
                    className: "android.widget.LinearLayout"
                },
                Subset: [{
                    message: {
                        className: "android.widget.TextView",
                        id: "com.tencent.mobileqq:id/name",
                    }
                }, {
                    message: {
                        className: "android.widget.TextView",
                        id: "com.tencent.mobileqq:id/name",
                    }
                }, {
                    message: {
                        className: "android.widget.LinearLayout",
                        id: "com.tencent.mobileqq:id/name"
                    },
                    Subset: [{
                        message: {
                            className: "android.widget.TextView",
                            id: "com.tencent.mobileqq:id/tv_name",
                            isReturn: true
                        }
                    }]
                }]
            }]
        }]
    }]
};


while (true) {
    var list = className("android.widget.AbsListView").findOne();
    for (let i = 0; i < list.childCount(); i++) {
        var child = list.child(i);
        var ret = 控件判断(child, json);
        if (ret) {
            if (Array.isArray(ret)) {
                log(ret[0].text());
            };
        } else {
            log(ret);
        };
    };

    if (!list.scrollForward()) {
        break;
    };
    sleep(100);
};





//返回值是一个object。
function 生成表达式(UiObject) {
    if (!UiObject) {
        throw "UiObject 空";
    };
    var ob = {};
    if (UiObject.childCount()) {
        ob.message = Uimessage(UiObject);
        ob.Subset = UiSubset(UiObject);
        return ob;
    } else {
        ob.message = Uimessage(UiObject);
        return ob;
    };
};

//在此可以修改或添加它的输出内容
function Uimessage(UiObject) {
    var mess = {};
    if (UiObject.className()) {
        mess.className = UiObject.className();
    };
    if (UiObject.id()) {
        mess.id = UiObject.id();
    };
    if (UiObject.text()) {
        mess.text = UiObject.text();
    };
    if (UiObject.desc()) {
        mess.desc = UiObject.desc();
    };
    return mess;
};

function UiSubset(UiObject) {
    var ary = new Array;
    for (var i = 0; i < UiObject.childCount(); i++) {
        var child = UiObject.child(i);
        ary.push(生成表达式(child));
    };
    return ary;
};

//json.toString****将生成的表达式字符串化输出。
function Disassembly(A) {
    switch (typeof(A)) {
        case "object":
            var ary = new Array;
            if (Array.isArray(A)) {
                for (var i in A) {
                    ary.push(Disassembly(A[i]));
                };
                return "[" + ary.join(",") + "]";
            } else {
                for (var i in A) {
                    ary.push(i + ":" + Disassembly(A[i]));
                };
                return "{" + ary.join(",") + "}";
            };
            break;
        case "function":
            return A.toString();
            break;
        case "string":
            return "\"" + String(A) + "\"";
            break;
        default:
            return String(A);
    };
};


//输入控件(必须是已经找到的控件)和控件的表达式并判断是否符合。
function 控件判断(UiObject, object) {
    var returnAry = new Array;
    if ((!object) || (!UiObject)) {
        return false;
    };
    if (object.message) {
        //log("m");
        for (i in object.message) {
            var k = false;
            switch (i) {
                case "className":
                    k = UiObject.className() == object.message[i];
                    break;
                case "id":
                    k = UiObject.id() == object.message[i];
                    break;
                case "text":
                    k = UiObject.text() == object.message[i];
                    break;
                case "desc":
                    k = UiObject.desc() == object.message[i];
                    break;
                case "isReturn":
                    k=true;
                    break;
                  default:

            };
            if (!k) {
                //log("mess");
                return false;
            };
        };
        if (object.message.isReturn) {
            returnAry.push(UiObject);
        };
    } else {
        throw "message";
    };
    if (object.Subset) {
        //log("s");
        if (UiObject.childCount()) {
            for (var i = 0; i < object.Subset.length; i++) {
                var k = false;
                for (var ii = 0; ii < UiObject.childCount(); ii++) {
                    if (i < UiObject.childCount()) {
                        var ret = 控件判断(UiObject.child(ii), object.Subset[i]);
                        if (ret) {
                            if (Array.isArray(ret)) {
                                returnAry = returnAry.concat(ret);
                            };
                            k = true;
                            break;
                        };
                    };
                };
                if (!k) {
                    //log("Sub");
                    return false;
                };
            };
        } else {
            log("UiObject.childCount");
            return false;
        };
    };
    if (returnAry.length) {
        return returnAry;
    };
    return true;
};

你可能感兴趣的:(脚本源码)