Loading... ## 系列导航 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://traceless.tech/index.php/archives/20/" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://traceless.tech/usr/themes/handsome/assets/img/sj/6.jpg);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">【手摸手系列】教你开发QQ机器人 - 目录导航</p> <div class="inster-summary text-muted"> 教程背景<p style="color:red">由于发生了众所周知的机器人平台事... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> 本文系列源码:[点我进入][1] ### 一. 首先下载或克隆[基础模板][2] 话不多说,git的基本使用,不再科普 也可以直接使用我[自用的开发模板][3] ### 二. 按照[SDK WIKI][4]进行基础建设 本文使用自用模板进行改造(直接clone base分支即可) #### 1.修改Native.Core下app.json(文末提供全权限版本json) > "ret": 1, > "apiver": 9, > "name": "手摸手插件DEMO",//插件名字 > "version": "1.0.0",//插件版本 > "version_id": 1, > "author": "Traceless",//作者 > "description": "这里是手摸手插件开发系列教程DEMO",//插件描述 #### 2.修改命名空间 <div class="tip inlineBlock info"> 根据SDK WIKI规范,我们将插件取名为**Site.Traceless.Demo** </div> <div class="tip inlineBlock success"> 解决方案资源管理-Navtive.Core右键-程序集名称修改为**site.traceless.demo**[注意这边需要全部小写] </div> #### 3.新建主项目库 <div class="tip inlineBlock info"> 根据SDK WIKI规范,我们将主项目库取名为**Site.Traceless.Demo.Code** </div> <div class="tip inlineBlock success"> 解决方案资源管理-解决方案"Native"右键-添加-新建项目-选择“类库(.Net Framework)”-项目名称**Site.Traceless.Demo.Code**,框架**.NET Framework 4.5**-创建 </div> #### 4.引用项目 <div class="tip inlineBlock success"> Native.Core-引用-添加引用-项目-**Site.Traceless.Demo.Code** Site.Traceless.Demo.Code-引用-添加引用-项目-**Native.Sdk** Site.Traceless.Demo.Code-引用-添加引用-项目-**Native.Tool** </div> ### 三. 手动魔改开始 我的分类思路 - Command【命名空间】:放置功能 - Event【命名空间】:酷Q事件 - Model【命名空间】:业务模型 - Common.cs:公共变量 #### 1.新建公公变量类Common.cs <div class="tip inlineBlock info"> 重命名项目新建自带的Class1.cs为Common.cs 内容如下: <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-3878045df366ad6b46982bd26efde07275" aria-expanded="true"><div class="accordion-toggle"><span style="">Common.cs</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-3878045df366ad6b46982bd26efde07275" class="collapse collapse-content"><p></p> ```c# using Native.Sdk.Cqp; using System.Collections.Generic; namespace Site.Traceless.Demo.Code { public static class Common { /// <summary> /// 命令映射路由(群聊) /// </summary> public static Dictionary<string, string> GCommandDic { get; set; } = new Dictionary<string, string>(); /// <summary> /// 命令映射路由(私聊) /// </summary> public static Dictionary<string, string> PCommandDic { get; set; } = new Dictionary<string, string>(); /// <summary> /// 设置 /// </summary> public static Dictionary<string, string> settingDic { get; set; } = new Dictionary<string, string>(); public static CQApi CqApi { get; set; } } } ``` <p></p></div></div></div> </div> #### 2.添加消息解析类 <div class="tip inlineBlock info"> 新建文件夹-Model 添加类AnalysisMsg 内容如下: <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-1bf414030a59f1ebc658f46d62c879583" aria-expanded="true"><div class="accordion-toggle"><span style="">AnalysisMsg.cs</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-1bf414030a59f1ebc658f46d62c879583" class="collapse collapse-content"><p></p> ```c# namespace Site.Traceless.Demo.Code.Model { public class AnalysisMsg { private static OrderInfoModel _msg = new OrderInfoModel(""); public string What { get => _msg.What.Trim() ?? ""; } public string GCommand { get { string _gcommand = null; Common.GCommandDic.TryGetValue(_msg.What.Trim(), out _gcommand); return _gcommand; } } public string PCommand { get { string _pcommand = null; Common.PCommandDic.TryGetValue(_msg.What.Trim(), out _pcommand); return _pcommand; } } public string How { get => _msg.How.Trim() ?? ""; } public string Who { get => _msg.Who.Trim() ?? ""; } public int OrderCount { get => _msg.OrderCount; } public string OriginStr { get; set; } /// <summary> /// 解析消息结构 /// </summary> /// <param name="msg"></param> public AnalysisMsg(string msg) { if (!string.IsNullOrEmpty(msg)) { string str = new System.Text.RegularExpressions.Regex("[\\s]+").Replace(msg, " "); _msg = new OrderInfoModel(str); } else { _msg = new OrderInfoModel(""); } OriginStr = msg; } ~AnalysisMsg() { } } } ``` <p></p></div></div></div> 添加类OrderInfoModel 内容如下: <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-dfd28dbede9a866d42baa58d9af9a91b40" aria-expanded="true"><div class="accordion-toggle"><span style="">OrderInfoModel.cs</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-dfd28dbede9a866d42baa58d9af9a91b40" class="collapse collapse-content"><p></p> ```c# using System; namespace Site.Traceless.Demo.Code.Model { public class OrderInfoModel { public int OrderCount { get; private set; } = 0; public string What { get; private set; } = ""; public string Who { get; private set; } = ""; public string How { get; private set; } = ""; public string OriginStr { get; private set; } public OrderInfoModel(string msg) { if (string.IsNullOrEmpty(msg)) return; try { OriginStr = msg; string[] temp = msg.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (temp.Length == 0) { What = msg; OrderCount = 0; } else if (temp.Length == 1) { What = temp[0]; OrderCount = 1; ; } else if (temp.Length == 2) { What = temp[0]; Who = temp[1]; OrderCount = 2; } else if (temp.Length > 2) { What = temp[0]; Who = temp[1]; How = msg.TrimStart().Substring(What.Length + Who.Length + 2); OrderCount = 3; } } catch (Exception ex) { OrderCount = 0; What = ex + ""; } } } } ``` <p></p></div></div></div> </div> #### 3.添加业务功能入口 <div class="tip inlineBlock info"> 这里会涉及到群、私聊消息(讨论组消息本文不讨论,方法类似,自行拓展) 新建文件夹-Command 添加群功能入口GroupApp 内容如下: <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-4bed074312e283b1257b5ec8b7863b7813" aria-expanded="true"><div class="accordion-toggle"><span style="">GroupApp.cs</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-4bed074312e283b1257b5ec8b7863b7813" class="collapse collapse-content"><p></p> ```c# using Site.Traceless.Demo.Code.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Native.Sdk.Cqp.EventArgs; namespace Site.Traceless.Demo.Code.Command { public class GroupApp { public static void funcOne(CQGroupMessageEventArgs e, AnalysisMsg msg) { e.CQApi.SendPrivateMessage(415206409,$"[这里是群方法1]", $"参数数 {msg.OrderCount}\n", $"触发指令(第一参数 what) {msg.What}\n", $"目标(第二参数 who) {msg.Who}\n", $"怎么做(第三参数 how) {msg.How}\n", $"原始信息 {msg.OriginStr}\n", e.ToString()); } public static void funcTwo(CQGroupMessageEventArgs e, AnalysisMsg msg) { e.CQApi.SendPrivateMessage(415206409, $"[这里是群方法2]\n", $"参数数 {msg.OrderCount}\n", $"触发指令(第一参数 what) {msg.What}\n", $"目标(第二参数 who) {msg.Who}\n", $"怎么做(第三参数 how) {msg.How}\n", $"原始信息 {msg.OriginStr}\n", e.ToString()); } } } ``` <p></p></div></div></div> 添加私聊功能入口FriendApp 内容如下: <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-d9771a173e98237770a5eab1aafabfdc19" aria-expanded="true"><div class="accordion-toggle"><span style="">FriendApp.cs</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-d9771a173e98237770a5eab1aafabfdc19" class="collapse collapse-content"><p></p> ```c# using Native.Sdk.Cqp.EventArgs; using Site.Traceless.Demo.Code.Model; namespace Site.Traceless.Demo.Code.Command { public class FriendApp { public static void funcOne(CQPrivateMessageEventArgs e, AnalysisMsg msg) { e.CQApi.SendPrivateMessage(e.FromQQ,$"[这里是私聊方法1]",$"参数数 {msg.OrderCount}\n", $"触发指令(第一参数 what) {msg.What}\n", $"目标(第二参数 who) {msg.Who}\n", $"怎么做(第三参数 how) {msg.How}\n", $"原始信息 {msg.OriginStr}\n", e.ToString()); } public static void funcTwo(CQPrivateMessageEventArgs e, AnalysisMsg msg) { e.CQApi.SendPrivateMessage(e.FromQQ,$"[这里是私聊方法2]", $"参数数 {msg.OrderCount}\n", $"触发指令(第一参数 what) {msg.What}\n", $"目标(第二参数 who) {msg.Who}\n", $"怎么做(第三参数 how) {msg.How}\n", $"原始信息 {msg.OriginStr}\n", e.ToString()); } } } ``` <p></p></div></div></div> </div> #### 4.添加酷Q事件 <div class="tip inlineBlock info"> 新建文件夹-Event 按照[这个链接][5],添加所有事件类,记得更改**Site.Traceless.Demo**为你的插件命名空间 可以使用ctrl+shift+H进行批量替换 除Event_AppEnable、Event_GroupMsg、Event_PrivateMsg其它文件中的方法内容都可以清空 Event_AppEnable在第5步会添加内容 Event_GroupMsg、Event_PrivateMsg的内容比较核心,此处放出【后期随着需求增加可能会有改动】 <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-25a39bd39b7cc193cc7574174f5f4e2b26" aria-expanded="true"><div class="accordion-toggle"><span style="">Event_PrivateMsg.cs</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-25a39bd39b7cc193cc7574174f5f4e2b26" class="collapse collapse-content"><p></p> ```c# using Native.Sdk.Cqp.EventArgs; using Native.Sdk.Cqp.Interface; using Site.Traceless.Demo.Code.Command; using Site.Traceless.Demo.Code.Model; using System; namespace Site.Traceless.Demo.Code.Event { public class Event_PrivateMsg : IPrivateMessage { public void PrivateMessage(object sender, CQPrivateMessageEventArgs e) { AnalysisMsg nowModel = new AnalysisMsg(e.Message.Text);//解析消息 if (String.IsNullOrEmpty(nowModel.PCommand)) {//没有私聊命令在其中,没有其它业务,直接返回 e.Handler = false; return; } //触发私聊业务,通过反射创建FriendApp实例,并调用对应方法 var papp = Activator.CreateInstance(typeof(FriendApp)) as FriendApp; var method = papp.GetType().GetMethod(nowModel.PCommand); object result = method.Invoke(null, new object[] { e, nowModel }); e.Handler = false; } } } ``` <p></p></div></div></div> <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-eddb236e0e46aa738ad6b909aafc930359" aria-expanded="true"><div class="accordion-toggle"><span style="">Event_GroupMsg.cs</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-eddb236e0e46aa738ad6b909aafc930359" class="collapse collapse-content"><p></p> ```c# using Native.Sdk.Cqp.EventArgs; using Native.Sdk.Cqp.Interface; using Site.Traceless.Demo.Code.Command; using Site.Traceless.Demo.Code.Model; using System; namespace Site.Traceless.Demo.Code.Event { public class Event_GroupMsg : IGroupMessage { public void GroupMessage(object sender, CQGroupMessageEventArgs e) { AnalysisMsg nowModel = new AnalysisMsg(e.Message.Text); if (String.IsNullOrEmpty(nowModel.GCommand)) {//没有私聊命令在其中,没有其它业务,直接返回 e.Handler = false; return; } //触发群聊业务,通过反射创建GroupApp实例,并调用对应方法 var gapp = Activator.CreateInstance(typeof(GroupApp)) as GroupApp; var method = gapp.GetType().GetMethod(nowModel.GCommand); object result = method.Invoke(null, new object[] { e, nowModel }); e.Handler = false; } } } ``` <p></p></div></div></div> </div> #### 5.添加酷Q事件注入 <div class="tip inlineBlock error"> 此处代码里的中文字一个都不能错! </div> <div class="tip inlineBlock info"> 打开Native.Core-CQMain.cs 内容如下: <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-73af65d0f6592f7b87e573fdf5c4779434" aria-expanded="true"><div class="accordion-toggle"><span style="">CQMain.cs</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-73af65d0f6592f7b87e573fdf5c4779434" class="collapse collapse-content"><p></p> ```c# using Native.Sdk.Cqp.Interface; using Site.Traceless.Demo.Code.Event; using Unity; namespace Native.Core { /// <summary> /// 酷Q应用主入口类 /// </summary> public class CQMain { /// <summary> /// 在应用被加载时将调用此方法进行事件注册, 请在此方法里向 <see cref="IUnityContainer"/> 容器中注册需要使用的事件 /// </summary> /// <param name="container">用于注册的 IOC 容器</param> public static void Register(IUnityContainer container) { container.RegisterType<IGroupMessage, Event_GroupMsg>("群消息处理"); container.RegisterType<IPrivateMessage, Event_PrivateMsg>("私聊消息处理"); container.RegisterType<IDiscussMessage, Event_DiscussMsg>("讨论组消息处理"); container.RegisterType<IGroupUpload, Event_GroupUpload>("群文件上传事件处理"); container.RegisterType<IGroupManageChange, Event_GroupManageChange>("群管理变动事件处理"); container.RegisterType<IGroupMemberDecrease, Event_GroupMemberDecrease>("群成员减少事件处理"); container.RegisterType<IGroupMemberIncrease, Event_GroupMemberIncrease>("群成员增加事件处理"); container.RegisterType<IGroupBanSpeak, Event_GroupBanSpeak>("群禁言事件处理"); container.RegisterType<IFriendAdd, Event_FriendAdd>("好友已添加事件处理"); container.RegisterType<IFriendAddRequest, Event_FriendAddRequest>("好友添加请求处理"); container.RegisterType<IGroupAddRequest, Event_GroupAddRequest>("群添加请求处理"); container.RegisterType<ICQStartup, Event_CQStartup>("酷Q启动事件"); container.RegisterType<ICQExit, Event_CQExit>("酷Q关闭事件"); container.RegisterType<IAppEnable, Event_AppEnable>("应用已被启用"); container.RegisterType<IAppDisable, Event_AppDisable>("应用将被停用"); } } } ``` <p></p></div></div></div> </div> #### 6.初始化App启动方法 <div class="tip inlineBlock info"> 打开-Site.Traceless.Demo.Code.Event-Event_AppEnable 内容如下: <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-cdd9f0d40ad922f66c095a5ebd48206a21" aria-expanded="true"><div class="accordion-toggle"><span style="">Event_AppEnable.cs</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-cdd9f0d40ad922f66c095a5ebd48206a21" class="collapse collapse-content"><p></p> ```c# using System.Linq; using System.Text; using Native.Sdk.Cqp.Interface; using Native.Sdk.Cqp.EventArgs; using System.IO; using Native.Tool.IniConfig.Linq; namespace Site.Traceless.Demo.Code.Event { public class Event_AppEnable : IAppEnable { public void AppEnable(object sender, CQAppEnableEventArgs e) { Common.CqApi = e.CQApi;//将API存入,方便业务处调用API string commandPath = Common.CqApi.AppDirectory + "command.ini";//命令路由文件路径 IniObject iObject; if (!File.Exists(commandPath)) {//如果不存在文件,初始化 iObject = new IniObject { new IniSection("gcommands") { { "功能1","funcOne"}, { "功能2","funcTwo"} }, new IniSection("pcommands") { { "功能1","funcOne"}, { "功能2","funcTwo"} } }; iObject.Save(commandPath); }; iObject = IniObject.Load(commandPath, Encoding.Default);//默认编码读取ini路由文件 IniSection pCommand = iObject["pcommands"];//读取并加载私聊路由 Common.PCommandDic = pCommand.ToDictionary(p => p.Key, p => p.Value.ToString()); IniSection gCommand = iObject["gcommands"];//读取并加载群聊路由 Common.GCommandDic = gCommand.ToDictionary(p => p.Key, p => p.Value.ToString()); commandPath = Common.CqApi.AppDirectory + "setting.ini";//设置文件,可以存放插件中一些配置量,比如主人QQ if (!File.Exists(commandPath)) { iObject = new IniObject { new IniSection("setting") { { "master",415206409} } }; iObject.Save(commandPath); }; iObject = IniObject.Load(commandPath, Encoding.Default); IniSection settings = iObject["setting"]; Common.settingDic = settings.ToDictionary(p => p.Key, p => p.Value.ToString()); } } } ``` <p></p></div></div></div> </div> <div class="tip inlineBlock error"> 最后!!右键-Native.Core-Export-CQExport.tt-运行自定义工具!这步很重要! </div> ### 四. 流程解析 以上配置可以实现,群聊关键字“功能1”触发GroupApp中funcOne方法。 流程如下: 1. 群聊事件获取到原始信息 “功能1 XXXX XXXX”【这边的XXXX也可以没有】 2. 从Common.GCommandDic字典中查找功能1,对应的方法名“funcOne” 3. 利用反射,调用GroupApp中,方法名为funcOne的方法。 4. 功能逻辑运行,执行完毕 可以看到,我们的路由是在插件启动时读取并加载的,**运行过一次插件完成初始化以后**,可以到 **酷Q目录\\data\\app\\你的appid** 下,找到command.ini文件,进行修改,再重新启动插件,即可完成**新功能的添加**、**老功能的临时禁用**、**多个关键字触发同一个功能**的操作,而不需要对群聊事件进行if-else或switch的书写 ### 关于调试 [点我查看官方WIKI][6] ### 好了!按照自己的想法去实现自己的机器人吧! 这里提供一个全事件、全权限版本的app.json,请根据自己的需要删减 <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-0b9cb2a816fbe8d413b72a50cd2ccacc57" aria-expanded="true"><div class="accordion-toggle"><span style="">篇幅过长,点击查看</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-0b9cb2a816fbe8d413b72a50cd2ccacc57" class="collapse collapse-content"><p></p> ```json // [重要] appid 规则见 https://cqp.im/v9/appid { "ret": 1, "apiver": 9, "name": "这里改成你的插件名字", "version": "1.0.0",//版本号涉及到在酷Q论坛发布,认真填写 "version_id": 1, "author": "这里是你的名字", "description": "这里改成你的插件描述", "event": [//下面的这些Event,没用的可以去掉,自用插件无所谓,需要发布的插件还是要认真选择 { "id": 1, "type": 21, "name": "私聊消息处理", "function": "_eventPrivateMsg", "priority": 30000 }, { "id": 2, "type": 2, "name": "群消息处理", "function": "_eventGroupMsg", "priority": 30000 }, { "id": 3, "type": 4, "name": "讨论组消息处理", "function": "_eventDiscussMsg", "priority": 30000 }, { "id": 4, "type": 11, "name": "群文件上传事件处理", "function": "_eventGroupUpload", "priority": 30000 }, { "id": 5, "type": 101, "name": "群管理变动事件处理", "function": "_eventSystem_GroupAdmin", "priority": 30000 }, { "id": 6, "type": 102, "name": "群成员减少事件处理", "function": "_eventSystem_GroupMemberDecrease", "priority": 30000 }, { "id": 7, "type": 103, "name": "群成员增加事件处理", "function": "_eventSystem_GroupMemberIncrease", "priority": 30000 }, { "id": 8, "type": 104, "name": "群禁言事件处理", "function": "_eventSystem_GroupBan", "priority": 30000 }, { "id": 10, "type": 201, "name": "好友已添加事件处理", "function": "_eventFriend_Add", "priority": 30000 }, { "id": 11, "type": 301, "name": "好友添加请求处理", "function": "_eventRequest_AddFriend", "priority": 30000 }, { "id": 12, "type": 302, "name": "群添加请求处理", "function": "_eventRequest_AddGroup", "priority": 30000 }, { "id": 1001, "type": 1001, "name": "酷Q启动事件", "priority": 30000, "function": "_eventStartup" }, { "id": 1002, "type": 1002, "name": "酷Q关闭事件", "priority": 30000, "function": "_eventExit" }, { "id": 1003, "type": 1003, "name": "应用已被启用", "priority": 30000, "function": "_eventEnable" }, { "id": 1004, "type": 1004, "name": "应用将被停用", "priority": 30000, "function": "_eventDisable" } ], "menu": [ // 设置菜单(发布前请删除无用菜单,如果无需设置菜单请全部删除) { "name": "设置A", //菜单名称 "function": "_menuA" //菜单对应函数 }, { "name": "设置B", "function": "_menuB" } ], "status": [ // 悬浮窗状态(见 com.example.status 样例) { "id": 1, // 悬浮窗ID "name": "运行时间", // 名称 "title": "UPTIME", // 英文名称 "function": "_statusUptime", // 数据更新对应函数 "period": "1000" // 更新间隔(单位ms(毫秒),目前仅支持1000ms(1秒)) } ], "auth": [ // 应用权限(发布前请删除无用权限) 20, //[敏感]取Cookies getCookies / getCsrfToken 30, //接收语音 getRecord 101, //发送群消息 sendGroupMsg 103, //发送讨论组消息 sendDiscussMsg 106, //发送私聊消息 sendPrivateMsg 110, //[敏感]发送赞 sendLike 120, //置群员移除 setGroupKick 121, //置群员禁言 setGroupBan 122, //置群管理员 setGroupAdmin 123, //置全群禁言 setGroupWholeBan 124, //置匿名群员禁言 setGroupAnonymousBan 125, //置群匿名设置 setGroupAnonymous 126, //置群成员名片 setGroupCard 127, //[敏感]置群退出 setGroupLeave 128, //置群成员专属头衔 setGroupSpecialTitle 130, //取群成员信息 getGroupMemberInfo 131, //取陌生人信息 getStrangerInfo 132, //取群信息 getGroupInfo 140, //置讨论组退出 setDiscussLeave 150, //置好友添加请求 setFriendAddRequest 151, //置群添加请求 setGroupAddRequest 160, //取群成员列表 getGroupMemberList 161, //取群列表 getGroupList 162, //取好友列表 getFriendList 180 //撤回消息 deleteMsg ] } ``` <p></p></div></div></div> ### 下集预告 <div class="tip inlineBlock info"> 1. 如何通过接口请求一键生成业务模型(IDE 需要是Visual Studio) 2. 增加HTTP帮助类实现对HTTP接口的POST/GET调用 3. 【针对特殊接口】利用JSONObject解析所需要的值 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://traceless.tech/index.php/archives/22/" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://gitee.com/DotNetTraceless/mydatadb/raw/master/img/80CpQS.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">【手摸手系列】教你开发QQ机器人 - HTTP接口使用</p> <div class="inster-summary text-muted"> 系列导航本文系列源码:点我进入本期目标以获取群公告为例,教你利用功能接口实现调用1.找接口这里我们采用“坊间流传的... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> </div> [1]: https://github.com/traceless0929/Native.Cqp.Csharp/tree/demo [2]: https://github.com/Jie2GG/Native.Framework [3]: https://github.com/traceless0929/Native.Cqp.Csharp/tree/base [4]: https://github.com/Jie2GG/Native.Framework/wiki/02.-%E9%85%8D%E7%BD%AEJson [5]: https://github.com/traceless0929/Native.Cqp.Csharp/tree/demo/site.traceless.nativedemo.code/Event [6]: https://github.com/Jie2GG/Native.Framework/wiki/08.-%E5%BA%94%E7%94%A8%E8%B0%83%E8%AF%95 Last modification:July © Allow specification reprint Support Appreciate the author AliPayWeChat Like 0 如果觉得我的文章对你有用,请随意赞赏
5 comments
博主请问运行自定义工具CQexport.tt时报错
未能解析程序集引用。路径“F:\...\Native.Framework-Final\Lib\Newtonsoft.Json.dll”必须是此计算机的本地路径,或者属于受信任区域。如果已下载此模板,你可能需要使用文件资源管理器中此模板文件的属性页来“取消阻止”此模板这个该怎么解决呀?网上搜的.net版本问题改了也没用,这个LibNewtonsoft.Json.dll文件也是原来就有的,下载了比较新的Native.Cqp.Csharp-demo也是这样的错误
直接nuget重新引用下
大佬能不能解释下nuget引用的具体过程?搜索了各种方法还是没有解决这个错误。我是c++和java用的多一些,对c#这方面开发没什么经验。。
建议补充vs基础知识,百度"vs nuget引用"
添加酷q事件的链接失效了,不过好在是github的还能找到