情迁QQ机器人JS插件/使用开发教程

2018-12-23  本文已影响0人  吉凶以情迁

如果不了解情迁QQ机器人的插件加载套路,请查看情迁软件分类的其它教程,这些教程还包含了lua插件开发教程和java插件开发教程等。
js插件脚本优势
可以随便修改,无需编译,便捷分享,多人协作开发更方便。

js插件存放目录
/sdcard/qssq666/robot_plugin_js
电脑编写js
电脑配置adb然后推送到手机
adb push plugin.js /sdcard/qssq666/robot_plugin_js/
js插件手机端编写

机器人内部集成了开发工具可以直接编写而且可以随时模拟发送消息,
手机端开发工具功能强大支持语法高亮,格式化代码,以及快捷粘贴模板代码等。


pic
code2

DEMO测试代码

/*
编写时间 2018.11
JS插件的方法不受执行流程控制,因此测试这些代码的时候只能发送消息然后测试这些方法。
或者可以不写在主流程中,比如如下代码的测试专用可以解除注释,当机器人加载的时候会气泡提示的toast调试,
//可以直接运行 本文件放到内部存储 qssq666/robot_plugin_js 件夹改后缀名 为.js 然后在js插件管理列表刷新然后长按运行或者编辑再运行。
// 直接输入 adb push plugin.js /sdcard/qssq666/robot_plugin_js/ 推送到手机上。
电脑端 可以使用visual studio code开发,我会考虑弄自动补全api的事情。





*/


//toast("插件被加载,插件名."+getPluginName())
//下面的调试代码需要通过日志查看软件或者电脑ADBConsole.exe查看。
//log.info("插件加载了,")
//log.warn("这是警告日志")
//log.error("红色错误日志")
//log.log.w"也是警告日志语法糖")
//log.debug("调试信息,")

//测试专用代码区结束


log.debug("你能看到本消息说明你点击的是运行按钮!")
////////////////////////-机器人插件加载区
/**
 * 收到一条消息调用此方法,返回true表示 消息由插件处理
 * 否则交给机器人自身的逻辑,比如自身有点歌系统之类的。
 * 本方法不定义将毫无意义。
 * @param {*} msgitem 消息体
 * @param {*} aiteList 艾特的用户列表
 * @param {*} hasAite 是否艾特了用户
 * @param {*} hasAiteMe 是否艾特了机器人
 */
function onReceiveMsgIsNeedIntercept(msgitem, aiteList, hasAite, hasAiteMe) {

    log.w("msgitem:" + msgitem);
    if (aiteList) {
        log.w("aitelist count:" + aiteList.size());
        for (var i = 0; i < aiteList.size(); i++) {
            log.w("aitelist:" + i + ":" + aiteList.get(i).getNickname());
        }
    }
    log.w("call onReceiveMsgIsNeedIntercept")
    var text = msgitem.getMessage() //获取收到的消息内容
    log.w("receiveMsg." + text)
    var qq = msgitem.getSenderuin() // 哪个qq发的消息
    log.w("print toString[" + msgitem.toString()) //这个方法可以打印昵称,qq,消息内容,发送时间,等等。
    if (text == "JAVASCRIPT") {
        // chunkname.41 attempt to index ? (a nil value) zhaobu
        var str = "Wellcome Use JAVASCRIPT Plugin! The is QssqRobot"
        msgitem.setMessage(str)
        print("item is nil?=" + String(msgitem.getClass() == nil) + ",className." + String(msgitem.getClass()))
        print("api obj is nil?=" + String(msgitem.getClass() == nil) + ",className." + String(api.getClass()))
        print(api.toString())
        api.showDebugToast("欢迎使用js机器人插件");
        // print();
        // print(msgitem.toString())
        api.sendMsg(msgitem) //是啥子消息我就回复啥消息 ,操作起来比较简单。
        return true
    } else if (text == "TESTMSG") {
        var apiCallBackclass = {
            onSucc: function (bytes) {
                msgitem = msgitem.clone();//如果调用了setMessage等set方法,必须使用clone,否则就必须返回true拦截消息不给机器人内部的逻辑处理,不然会出现混乱。
                log.info("queryWebSite result: " + new java.lang.String(bytes));
                var str = "jsplugin->" + new java.lang.String(bytes)
                msgitem.setMessage(str)
                api.sendMsg(msgitem);
            },
            onFail: function (code, exception) {
                log.e("error,code=" + code + ",exception:" + exception);//or 
                log.e("error,code=" + code + ",exception:", exception);//print stackflow
            }
        };
        //这个逻辑的意思是如果有人发送TESTMSG,将异步请求网络查询数据,然后发送给发送者。
        api.sendAsyncGetRequest("http://qssq666.cn/update/update.json", apiCallBackclass);
        return true;
    }
    // function apiCallBackclass.onSucc(bytes)

    return false;
}



//下面的代码无关紧要,自己酌情修改可以不定义 如果定义将在插件列表体现或者 用于获取上下文,上下文目前js无法操作,无法得知具体原因。  ////////////////////////////// 
//插件被加载的时候出发
function onCreate(contextx) {
    log.w("onCreate++[print]")
    log.w("onCreate call arg type. " + ",robotVersion:" + robot.VERSION_CODE)
    //log.w("onCreate call arg type. " + typeof (obj)+",robotVersion:"+robot.VERSION_CODE)
}
//表示机器人最终处理的消息,即将发送的消息,是否拦截
function onReceiveRobotFinalCallMsgIsNeedIntercept(item, list, aite, haisaiteme) {


    log.w("call onReceiveRobotFinalCallMsgIsNeedIntercept:" + item.getMessage());
    return false
}
//插件作者名字 
function getAuthorName() {
    return "情迁2018"
}
//返回插件名称,再插件管理列表可以显示
function getPluginName() {
    return "test plugin"
}

//返回本插件的版本号 
function getVersionName() {
    return "1.0" //返回机器人的版本号
}
//返回本插件的版本号 数字标识 整数
function getVersionCode() {
    return parseInt(1);
}
//返回编译时间字符串
function getBuildTime() {
    // body
    return "无"
}


//返回插件的描述信息
function getDescript() {
    return "这是一个DEMO"
}
// 返回插件demo包名
function getPackageName() {
    return "cn.qssq666.js.plugindemo"
}
//即将被销毁调用的方法。
function onDestory() {
    log.w("destory call")
}

调用API


function myFunction() {
    log.w("函数执行了..");
    return;
}
myFunction();
function addCalc(value1, value2) {
    return value1 + value2;
}
var a = 1; b = 3;
log.w(java.lang.String.format("%f + %f 得结果是=%f ", Number(a), Number(b), Number(addCalc(a,b))));
``
上一篇下一篇

猜你喜欢

热点阅读