qqlight-RPC客户端库和使用示例代码

By admin at 2020-02-24 • 0人收藏 • 430人看过

感谢 aardio培训群: 撒旦微笑 分享以下代码和示例.

https://github.com/nlysh007/qqlight-websocket-aardio

好用的话,都去给个★哦


通过web.socket.jsonClient与WebSocket-RPC插件(websocket.protocol.ql.dll)进行通信, 从而实现跟QQLight机器人框架的交互.


  1.  qqlight RPC客户端 调用库 qqlight.aardio 文件代码:

//qqlight RPC客户端
/*
qqlight版本:v3.0+
qqlight-websocket版本:v2.3.0
通过web.socket.jsonClient
与WebSocket-RPC插件(websocket.protocol.ql.dll)进行通信
从而实现跟QQLight机器人框架的交互
WebSocket-RPC插件地址 https://github.com/Chocolatl/qqlight-websocket
*/
import web.socket.jsonClient;
import web.json;
import fsys;
namespace qqlight;
class wsClient{
    ctor(){
        this = ..web.socket.jsonClient();
        this.rpc.varargs = false;
        //禁用心跳包,发送心跳包ws会导致连接断开(qqlight-websocket版本:v2.3.0)
        this.rpc.heartbeatInterval = -1;
        //ws插件使用的id是字符串格式,这里要转换一下(qqlight-websocket版本:v2.3.0)
        this.rpc.beforeRequest = function(reqData){
            reqData.id = tostring(reqData.id)
            return reqData;
        }
        //要使用 .end 来处理返回数据,需要把id重新转回数字
        this.rpc.beforeJsonParse = function(jsonData){
            var data = ..web.json.parse(jsonData);
                data.id = tonumber(data.id)
                jsonData = ..web.json.stringify(data)
            return jsonData;
        } 
        this.on("open",function(){
            if(this["onOpen"]){
                this["onOpen"]()
            }
        })
        this.on("close",function(e){
            if(this["onClose"]){
                this["onClose"](e)
            }
        })
        this.on("error",function(err){
            if(this["onError"]){
                this["onError"](err)
            }
        })						
        this.on("message",function(msg){
        var eventTab = {
                message = "onMessage";//事件.收到消息
                friendRequest = "onFriendRequest";//事件.收到好友请求
                friendChange = "onFriendChange";//事件.好友变动
                groupMemberIncrease = "onGroupMemberIncrease";//事件.群成员增加
                groupMemberDecrease = "onGroupMemberDecrease";//事件.群成员减少
                adminChange = "onAdminChange";//事件.群管理员变动
                groupRequest = "onGroupRequest";//事件.加群请求
                receiveMoney = "onReceiveMoney";//事件.收款
        }; 
        var data = ..web.json.parse(msg.data)
        var event = eventTab[data.event];
            if(event and this[event]){
                this[event](data[["event"]],data[["params"]])
            }
    })	
}
    //通过 qqlight 的plugin目录的path来连接ws插件客户端
    connectByPluginPath = function(path){
        if(..fsys.isDir(path)){
            var fullpath = ..fsys.joinpath(path,"websocket.protocol","config.json"); 
            var json = ..string.load(fullpath);
            if(json){
                var tab = ..web.json.parse(json);     
                var params = {
                        "ws:";
                        "";
                        ..string.join({tab[["address"]];tab[["port"]]},`:`);
                        ..string.map(tab[["path"]],`\/([\w/]*)`)[1];
                    } ;	
                var ws = ..string.join(params,`/`);
                this.connect(ws);
            }else {
                error("config文件不存在")
            }
                                    
        }else {
            error("请选择正确的plugin目录")
        }
        
    }
    close = function(){
        this.rpc.close()
    }
    
     
}

/**intellisense()
qqlight.wsClient = qqlight RPC客户端
qqlight.wsClient() = 创建qqlight RPC客户端\n!wsClient.
end intellisense**/

/**intellisense(!wsClient)
connect("ws://__") = 连接到qqlight ws插件 \n参数指定ws插件 服务端网址,例如 "ws://localhost:7511"\n如果不指定参数,则获取上次调用此函数指定的网址参数,\n如果之前也没有指定网址则抛出异常
connectByPluginPath(__/*QQLight 的 plugin 目录的路径*/) = 通过qqligh插件路径连接到 qqlight ws插件 \n参数指定qqligh的plugin路径

close() = 关闭ws连接

onOpen = @.onOpen = function(){
    __/*已连接*/
}
onClose = @.onClose = function(e){
    __/*连接被关闭\ne.code为错误代码e.reason为错误原因*/	
}
onError = @.onError = function(err){
    __/*发生错误,err为错误信息*/
}
onMessage() = @.onMessage = function(event,params){
    __/*事件.收到消息*/		
}
onFriendRequest() = @.onFriendRequest = function(event,params){
    __/*事件.收到好友请求*/		
}
onFriendChange() = @.onFriendChange = function(event,params){
    __/*事件.好友变动*/		
}
onGroupMemberIncrease() = @.onGroupMemberIncrease = function(event,params){
    __/*事件.群成员增加*/		
}
onGroupMemberDecrease() = @.onGroupMemberDecrease = function(event,params){
    __/*事件.群成员减少*/		
}
onAdminChange() = @.onAdminChange = function(event,params){
    __/*事件.群管理员变动*/		
}
onGroupRequest() = @.onGroupRequest = function(event,params){
    __/*事件.加群请求*/		
}
onReceiveMoney() = @.onReceiveMoney = function(event,params){
    __/*事件.收款*/		
}

sendMessage(__/*params*/) = 接口.发送消息 \n\n{\n    ["type"]    = 1;  // 1=好友消息、2=群消息、3=群临时消息、4=讨论组消息、5=讨论组临时消息、6=QQ临时消息\n    ["group"]   = ""; // 群号或讨论组号,发送消息给好友的情况下忽略\n    ["qq"]      = ""; // QQ号,发送消息给群或讨论组的情况下忽略\n    ["content"] = ""; // 消息内容,可用替换符[QQ:pic=GUID]、[QQ:flash=GUID]、[QQ:face=表情代码]、[QQ:at=成员QQ|all],\n}\n\n无返回值
sendMessage()发送消息 = @.sendMessage({
    ["type"]    = 1;
    ["group"]   = "";
    ["qq"]      = "";
    ["content"] = "";
})

withdrawMessage(__/*params*/) = 接口.撤回消息 \n\n{\n    ["msgid"]   = "";//消息id\n    ["group"]   = "";//群号或讨论组号\n}\n\n无返回值
withdrawMessage()撤回消息 = @.withdrawMessage({
    ["msgid"]   = "";
    ["group"]   = "";
}
)


getFriendList(__/*params*/) = 接口.获取好友列表 \n\n{\n    ["cache"]   = true;//是否缓存结果\n}\n\n返回值:好友列表(json)
getFriendList()获取好友列表 = @.getFriendList({
    ["cache"]   = true;
}) 

addFriend(__/*params*/) = 接口.添加好友 \n\n{\n    ["qq"]        = "";//QQ\n    ["message"]   = "";// 验证消息,可选\n}\n\n无返回值
addFriend()添加好友 = @.addFriend({
    ["qq"]        = "";
    ["message"]   = "";
})

deleteFriend(__/*params*/) = 接口.删除好友 \n\n{\n    ["qq"]   = "";//QQ\n}\n\n无返回值
deleteFriend()删除好友 = @.deleteFriend({
    ["qq"]   = "";
})

getGroupList(__/*params*/) = 接口.获取群列表 \n\n{\n    ["cache"]   = true;//是否缓存结果\n}\n\n返回值:群列表(json)
getGroupList()获取群列表 = @.getGroupList({
    ["cache"]   = true;
})

getGroupMemberList(__/*params*/) = 接口.获取群成员列表 \n\n{\n    ["group"]   = "";//群号\n    ["cache"]   = true;//是否缓存结果\n}\n\n返回值:群成员列表(json)
getGroupMemberList()获取群成员列表 = @.getGroupMemberList({
    ["group"]   = "";
    ["cache"]   = true;
})

addGroup(__/*params*/) = 接口.添加群 \n\n{\n    ["group"]     = "";//群号\n    ["message"]   = "";// 验证消息,可选\n}\n\n无返回值
addGroup()添加群 = @.addGroup({
    ["group"]     = "";
    ["message"]   = "";
})

quitGroup(__/*params*/) = 接口.退出群 \n\n{\n    ["group"]   = "";//群号\n}\n\n无返回值
quitGroup()退出群 = @.quitGroup({
    ["group"]   = "";
})

getGroupCard(__/*params*/) = 接口.获取群名片 \n\n{\n    ["group"]   = "";//群号\n    ["qq"]      = "";// qq号\n}\n\n返回值:群名片
getGroupCard()获取群名片 = @.getGroupCard({
    ["group"]   = "";
    ["qq"]      = "";
})

uploadImage(__/*params*/) = 接口.上传图片 {\n    ["type"]     = 2;//1=私聊类型的图片、2=群组类型的图片\n    ["object"]   = "";//图片准备发送到的QQ号或群组号\n    ["data"]     = "";//图像数据转换的十六进制字符串\n}\n\n 返回值:GUID \n\n 使用:[QQ:pic=GUID]\n所获得的GUID只能对type和object\n指定的对象使用,否则图片可能无法显示
uploadImage()上传图片 = @.uploadImage({
    ["type"]     = 2;
    ["object"]   = "";
    ["data"]     = "";
})

getQQInfo(__/*params*/) = 接口.获取QQ资料 \n\n{\n    ["qq"]   = "";//qq号\n}\n\n返回值:QQ资料
getQQInfo()获取QQ资料 = @.getQQInfo({
    ["qq"]   = "";
})

getGroupInfo(__/*params*/) = 接口.获取群资料 \n\n{\n    ["group"]   = "";//群号\n}\n\n返回值:群资料
getGroupInfo()获取群资料 = @.getGroupInfo({
    ["group"]   = "";
})

inviteIntoGroup(__/*params*/) = 接口.邀请好友入群 \n\n{\n    ["group"]   = "";//群号\n       ["qq"]   = "";// qq号\n}\n\n无返回值
inviteIntoGroup()邀请好友入群 = @.inviteIntoGroup({
    ["group"]   = "";
    ["qq"]      = "";
})

setGroupCard(__/*params*/) = 接口.设置群名片\n\n{\n    ["group"]   = "";//群号\n    ["qq"]      = "";//qq号\n    ["name"]    = ""//群名片;\n\n无返回值
setGroupCard()设置群名片 = @.setGroupCard({
    ["group"]   = "";
    ["qq"]      = "";
    ["name"]    = "";
})

getLoginAccount() = 接口.获取当前登录账号\n\n返回值:当前登录账号

setSignature(__/*params*/) = 接口.设置个性签名 \n\n{\n    ["content"]   = "";//个性签名\n}\n\n无返回值
setSignature()设置个性签名 = @.setSignature({
    ["content"]   = "";
})

getNickname(__/*params*/) = 接口.获取QQ昵称 \n\n{\n    ["qq"]   = "";//qq号\n}\n\n返回值:QQ昵称
getNickname()获取QQ昵称 = @.getNickname({
    ["qq"]   = "";
})

setNickname(__/*params*/) = 接口.setNickname \n\n{\n    ["name"]   = "";//QQ昵称\n}\n\n无返回值
setNickname()设置QQ昵称 = @.setNickname({
    ["name"]   = "";
})

getPraiseCount(__/*params*/) = 接口.获取名片点赞数量 \n\n{\n    ["qq"]   = "";//qq号\n}\n\n返回值:名片点赞数量
getPraiseCount()获取名片点赞数量 = @.getPraiseCount({
    ["qq"]   = "";
})

givePraise(__/*params*/) = 接口.点赞名片 \n\n{\n    ["qq"]   = "";//qq号\n}\n\n无返回值
givePraise()点赞名片 = @.givePraise({
    ["qq"]   = "";
})

handleFriendRequest(__/*params*/) = 接口.处理好友请求\n\n{    \n    ["qq"]         = "";//qq号\n    ["type"]       = 1;//1=同意、2=拒绝、3=忽略\n    ["message"]    = "";//拒绝理由,仅在拒绝请求时有效\n}\n\n无返回值
handleFriendRequest()处理好友请求 = @.handleFriendRequest({    
    ["qq"]         = "";
    ["type"]       = 1;
    ["message"]    = "";
})

setState设置在线状态 = (__/*params*/) \n\n{\n    ["type"]   = 1;// 1=我在线上、2=Q我吧、3=离开、4=忙碌、5=请勿打扰、6=隐身\n}\n\n无返回值
setState()设置在线状态 = @.setState({
    ["type"]   = 1;
})

handleGroupRequest(__/*params*/) = 接口.处理加群请求 \n\n{    \n    ["group"]    = "";//群号\n    ["qq"]       = "";//qq号\n    ["seq"]      = "";//加群请求事件提供的序列号\n    ["type"]     = 1;//1=同意、2=拒绝、3=忽略\n    ["message"]  = "";//拒绝时的拒绝理由,其它情况忽略\n}\n\n无返回值
handleGroupRequest()处理加群请求 = @.handleGroupRequest({    
    ["group"]    = "";
    ["qq"]       = "";
    ["seq"]      = "";
    ["type"]     = 1;
    ["message"]  = "";
})

kickGroupMember(__/*params*/) = 接口.移除群成员 \n\n{\n    ["group"]   = "";//群号\n       ["qq"]   = "";// qq号\n}\n\n无返回值
kickGroupMember()移除群成员 = @.kickGroupMember({
    ["group"]   = "";
    ["qq"]      = "";
})

silence(__/*params*/) = 接口.禁言 \n\n{    \n    ["group"]    = "";//群号\n    ["qq"]       = "";//qq号\n    ["duration"] = 0;//禁言时间,单位为秒,为0时解除禁言\n}\n\n无返回值
silence()禁言 = @.silence({    
    ["group"]    = "";
    ["qq"]       = "";
    ["duration"] = 0;
})

globalSilence(__/*params*/) = 接口.全体禁言 \n\n{    \n    ["group"]    = "";//群号\n    ["enable"]   = true;//true为全体禁言,false为取消全体禁言\n}\n\n无返回值
globalSilence()全体禁言 = @.globalSilence({    
    ["group"]    = "";
    ["enable"]   = true;
})

getCookies() = 接口.获取Cookies\n\n返回值:cookies

getBkn(__/*params*/) = 接口.获取Bkn\n\n返回值:bkn
getBkn()获取Bkn = @.getBkn({
    ["cookies"]   = "";
})

getBknLong(__/*params*/) = 接口.获取BknLong\n\n\n返回值:bknlong
getBknLong()获取BknLong = @.getBknLong({
    ["cookies"]   = "";
})

end intellisense**/


/**intellisense()
end__/*获取到返回值*/ = @.end = function(result,err){
    __/*返回值处理*/
}

end intellisense**/


2, 调用示例:

import console; 
import win;

import qqlight;

var wsClient = qqlight.wsClient();
//wsClient.connect("ws://127.0.0.1:49632/")通过与插件配置文件(config.json)相匹配的ws地址来连接
var pluginPath = "";
if(pluginPath==""){
    error("未指定plugin目录")
} 
wsClient.connectByPluginPath(pluginPath) //通过qqlight的plugin目录路径来连接

//连接成功后的事件处理,主动获取的函数(wsClient.get_)操作可以都放到这里,避免出错,比如:wsClient.getLoginAccount()
wsClient.onOpen = function(){
    console.dump("成功连接")
    //获取登录帐号
    wsClient.getLoginAccount().end = function(result,err){
        var qq = result; 
        if(qq){
            //获取昵称
            wsClient.getNickname({
                ["qq"]   = qq;
            }).end = function(result,err){
                var nickname = result; 
                console.dump("QQ:",qq,"昵称:",nickname)
            }
        }
    }
}

//消息处理,大部分的消息交互都在这里
wsClient.onMessage = function(event,params){
    console.dump("收到消息",params)
    //简单的消息复读例子
    wsClient.sendMessage({
        ["type"]    = params["type"] ;// 1=好友消息、2=群消息、3=群临时消息、4=讨论组消息、5=讨论组临时消息、6=QQ临时消息
        ["group"]   = params["group"];// 群号或讨论组号,发送消息给好友的情况下忽略
        ["qq"]      = params["qq"];// QQ号,发送消息给群或讨论组的情况下忽略
        ["content"] = params["content"];//消息内容
    })	
    console.dump("已复读消息",params["content"])
}

//错误处理
wsClient.onError = function(err){
    console.dump("错误",err)
}
//连接关闭
wsClient.onClose = function(e){
    console.dump("连接关闭",e)
}
win.loopMessage()
console.pause(true);


备注:

默认表情是[QQ:face=xxx]

收藏的一般就是[QQ:pic=GUID]

你如果只是被动回复的话直接这样就行

params["content"]="这是一条测试消息";

wsClient.sendMessage(params)

要是主动发就要区分私聊、群聊还是临时会话了,,正常来说,连接成功后获取下好友列表,不在列表的最好不要发,很大概率都是不接受临时会话的...

ws地址和path连接二选一就行了

image.png


另外, qqlight需要自己注册下载, Air版本是免费的,为了不必要的麻烦,库里没有列出框架的地址.


1 个回复 | 最后更新于 2020-02-24
2020-02-24   #1

简单说下用法:

  1. 去qqlight官方下载软件,https://www.52chat.cc/forum.php,这里需要注册提供手机号激活,然后获取air免费版激活码

    image.png

  2. 去下载通信插件, https://github.com/Chocolatl/qqlight-websocket ,

    编译好的dll下载地址:https://github.com/Chocolatl/qqlight-websocket/releases/latest/download/websocket.protocol.ql.dll.zip

  3. 把上面下载好的dll解压到刚刚安装的qqlight的plugin目录中

  4. 双击qqlight.exe打开, 然后登陆QQ,在插件列表中选择 dll通信插件,然后启用

    image.png

  5. 配置下插件,我这里直接复制插件作者的话

    使用方法

    将插件复制到QQLight机器人框架的plugin目录中,运行QQLight机器人并在插件管理中启用插件

    插件启动后默认监听49632端口,在本机可以使用WebSocket客户端通过URLws://localhost:49632/连接服务器

    配置

    第一次启动插件后会在插件数据目录plugin/websocket.protocol中生成config.json文件,里面提供了一些插件配置项

    你可以修改这些插件配置项并保存文件,然后重新启动插件使新的配置生效

    address

    服务器监听地址,默认为127.0.0.1,即只允许本机连接服务器,如果你希望通过外网连接服务器,可以设置为0.0.0.0

    port

    服务器监听端口号,默认为49632

    path

    WebSocket握手时的URL路径,默认为根路径/,即通过ws://localhost:49632/连接服务器。如果将路径修改为/xxx/yyy,则需要通过ws://localhost:49632/xxx/yyy才能连接服务器

    路径应该只包含字母、数字及/,当允许通过外网连接服务器时,请设置一个足够复杂的路径,防止被他人恶意连接

  6. 之后就可以使用上面的aardio示例测试了.

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
Sciter中文在线文档Sciter在线学习文档
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...