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机器人框架的交互.
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示例测试了.