qqlight-RPC客户端库和使用示例代码
By
admin
at 2020-02-24 • 0人收藏 • 1861人看过
感谢 aardio培训群: 撒旦微笑 分享以下代码和示例.
https://github.com/nlysh007/qqlight-websocket-aardio
好用的话,都去给个★哦
通过web.socket.jsonClient与WebSocket-RPC插件(websocket.protocol.ql.dll)进行通信, 从而实现跟QQLight机器人框架的交互.
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连接二选一就行了

另外, qqlight需要自己注册下载, Air版本是免费的,为了不必要的麻烦,库里没有列出框架的地址.
2 个回复 | 最后更新于 2022-05-27
登录后方可回帖
简单说下用法:
去qqlight官方下载软件,https://www.52chat.cc/forum.php,这里需要注册提供手机号激活,然后获取air免费版激活码
去下载通信插件, https://github.com/Chocolatl/qqlight-websocket ,
编译好的dll下载地址:https://github.com/Chocolatl/qqlight-websocket/releases/latest/download/websocket.protocol.ql.dll.zip
把上面下载好的dll解压到刚刚安装的qqlight的plugin目录中
双击qqlight.exe打开, 然后登陆QQ,在插件列表中选择 dll通信插件,然后启用
配置下插件,我这里直接复制插件作者的话
使用方法
将插件复制到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才能连接服务器
路径应该只包含字母、数字及/,当允许通过外网连接服务器时,请设置一个足够复杂的路径,防止被他人恶意连接
之后就可以使用上面的aardio示例测试了.