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

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

感谢 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版本是免费的,为了不必要的麻烦,库里没有列出框架的地址.


2 个回复 | 最后更新于 2022-05-27
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示例测试了.

2022-06-10   #2

现在这个qqlight框架还能正常使用吗 楼主

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...