基于Mirai与Spring Boot的QQ机器人开发实战:从零构建PCR公会战管理工具

news2026/5/10 3:32:25
1. 项目缘起与重生之路作为一个在QQ机器人圈子里摸爬滚打了快十年的老玩家我见证过不少框架的兴起与沉寂。最早自己捣鼓着用酷Q和PicqBotX框架整合Spring写了个叫WMagicBot的小玩意儿纯粹是自娱自乐。后来酷Q一夜之间停止服务这个项目也就跟着凉了成了硬盘里的一段纪念代码。本以为和QQ机器人开发的缘分就到此为止了直到我遇到了《公主连结Re:Dive》这款游戏。作为公会战管理员我一直用着基于酷Q的yobot来管理出刀、统计伤害它确实是个神器。但酷Q的突然离场让整个依赖它的生态瞬间崩塌yobot也没法用了公会战管理一下子回到了原始时代手忙脚乱。就在我几乎要放弃的时候听圈内朋友提到了Mirai这个开源框架。研究了一下发现它架构现代、社区活跃而且完全免费开源这让我那颗折腾的心又活络了起来。看着硬盘里那个已经“凉透”的WMagicBot项目一个念头冒了出来为什么不基于Mirai让它重生专门做一个服务于PCR公会战的机器人呢于是WMagicBotRR for Reborn就这么诞生了。它的核心目标很明确做一个部署简单、功能专一、易于维护的PCR公会战管理机器人。我选择了Spring Boot作为应用框架搭配Mybatis和SQLite数据库。SQLite是个好东西它无需单独部署数据库服务所有数据就是一个.db文件迁移服务器的时候直接复制带走就行对个人开发者和小型公会来说极其友好。最终打包成一个可执行的JAR包只要机器上有Java环境一条命令就能跑起来彻底告别了复杂的部署环境。这个项目的指令系统也是我花了心思设计的。早期写机器人最头疼的就是无穷无尽的if-else判断消息内容。所以我设计了一套基于注解的指令注册和权限管理系统。你只需要在一个方法上加上Command注解定义好指令关键词和权限框架就能自动识别和路由。还支持指令别名比如“查刀”和“查看出刀”可以指向同一个处理逻辑。对于开发者来说这套机制能让你更关注业务逻辑本身而不是繁琐的消息解析。2. 核心架构与设计思路拆解2.1 技术栈选型背后的考量选择Mirai而不是其他机器人框架是我经过一番对比后的决定。首先Mirai是纯Java/Kotlin开发的这对于我一个主要使用Java技术栈的开发者来说集成成本最低可以直接在Spring Boot项目里以库的形式引入调用其API。其次它的协议实现比较稳定社区在面对腾讯的风控更新时反应和修复速度相对较快有fix-protocol-version这样的插件来应对登录问题。虽然过程中也经历了从使用第三方签名服务到内置qsign的变迁但整体路线图是清晰的。反观一些其他框架要么协议封闭要么更新缓慢在长线维护上风险较高。数据库方面我放弃了常用的MySQL或PostgreSQL选择了SQLite。为什么对于一个小型、单实例的QQ机器人应用来说它根本不需要高并发连接和复杂的分布式事务。SQLite的轻量、零配置、单文件特性完美契合需求。所有数据包括用户信息、公会战记录、备忘事项都存储在一个botData.db文件里。公会管理员要迁移机器人只需要把这个文件和配置文件一起拷贝到新服务器就行数据迁移成本几乎为零。我用Navicat或者DBeaver这样的工具直接就能打开查看和简单维护对不懂SQL的普通用户也很友好。框架层面Spring Boot是必然选择。它提供了完善的依赖注入、配置管理、Web服务和定时任务能力。我的机器人不仅处理QQ消息还内置了一个小型的Web服务器用来提供公会战查刀的H5页面。Spring Boot的Scheduled注解用来做定时任务比如检查挂树倒计时、发送提醒消息都非常方便。整个项目通过Maven构建依赖管理清晰这也是大多数Java开发者熟悉的模式。2.2 指令系统的设计与实现指令系统是机器人的大脑我的设计目标是灵活、可扩展、易维护。核心思想是“约定优于配置”和“注解驱动”。首先我定义了一个Command注解。开发者只需要在任何一个Spring管理的Bean的方法上加上这个注解并指定指令名称、别名、所需权限等级、作用域群聊、私聊或任意等信息这个方法就会在应用启动时被自动扫描并注册到指令路由表中。Command(name 查刀, alias {出刀查询, 刀况}, permission Permission.MEMBER, scope Scope.GROUP) public MessageChain queryBattle(MessageEvent event, Param(uid) String userId) { // 业务逻辑查询该用户的出刀情况 // ... return new PlainText(查询结果...); }框架会负责拦截所有QQ消息判断消息是否以指令前缀如“/”或“”开头然后去路由表中匹配指令。匹配成功后会根据注解上定义的权限如管理员、群成员、所有人进行校验校验通过才执行对应的方法。方法参数支持自动注入比如MessageEvent事件对象、通过正则表达式从消息中提取的Param参数等这让业务逻辑的编写非常干净。为了应对功能的热插拔我还设计了Switch注解用于标记“动态组件”。比如“夸夸模式”这种娱乐功能公会战期间可能想关掉以免刷屏。被Switch标记的指令组其开关状态会被持久化到数据库。用户发送“开关”指令可以看到一个所有可开关功能的列表并实时开启或关闭它们而无需重启机器人。这个机制通过一个全局的开关状态管理器和AOP切面来实现在执行指令前检查对应组件的状态。2.3 模块化与功能解耦随着功能越来越多代码不能变成一锅粥。我大致将项目分成了几个核心模块Core核心模块包含指令系统、权限管理、事件监听、消息发送器MagicMsgSender、定时任务封装MagicTask等基础设施。这是机器人的骨架。Service业务服务模块包含具体的业务逻辑如PCR公会战管理服务、竞技场查询服务、GPT对话服务、备忘服务等。每个服务相对独立只通过定义清晰的接口与Core模块或其他Service交互。Web模块虽然是个机器人但部分功能如复杂的查刀数据展示用H5页面更直观。我使用Spring MVC提供了一些简单的RESTful API和页面路由用于数据查询和展示。Integration集成模块负责与外部服务对接比如调用pcrdfans的竞技场查询接口、调用OpenAI的GPT API等。这里封装了网络请求、数据解析和错误重试的逻辑。这种分层和模块化设计使得添加一个新功能变得非常规范。例如要加一个“天气预报”功能我只需要在Service层新建一个WeatherService在Integration层调用气象API最后在Controller层或一个专门的Command类里定义一个指令方法并注解即可不会影响到其他已有功能。3. 从零开始的部署与配置实战3.1 环境准备与初次运行假设你有一台云服务器CentOS 7.x或Ubuntu 20.04我们从最干净的环境开始。第一步安装Java运行环境。机器人需要JRE 8或以上版本。我推荐安装OpenJDK 11它在性能和兼容性上有一个不错的平衡。# 对于Ubuntu/Debian系统 sudo apt update sudo apt install openjdk-11-jre-headless -y # 对于CentOS/RHEL系统 sudo yum install java-11-openjdk -y # 验证安装 java -version第二步获取机器人程序。你可以从项目的GitHub Release页面下载最新编译好的magicBotR.jar文件或者如果你有Maven环境也可以自己从源码编译。# 创建一个专用目录并进入 mkdir -p /opt/wmagicbot cd /opt/wmagicbot # 假设你已经下载了jar包将其上传到此目录 # 或者使用wget下载请替换为实际的Release链接 # wget https://github.com/WhiteMagic2014/WMagicBotR/releases/download/v1.9.0/magicBotR.jar第三步准备配置文件。在jar包同目录下创建WMagicBotR.properties文件。你可以从项目仓库里找到WMagicBotR_sample.properties模板复制过来修改。# 基础配置 bot.qqNumber你的机器人QQ号 bot.password你的机器人QQ密码 # 注意密码可能因风控无法直接使用更多采用扫码登录见下文 # 登录协议配置应对风控关键 bot.protocolANDROID_PAD # 不同协议尝试ANDROID_PHONE, ANDROID_PAD, IPAD, MACOS # 风控严重时PAD或IPAD协议成功率可能更高 # 签名服务配置 (v1.8.0之后版本) # 由于腾讯风控必须配置签名服务。项目内置了qsign。 # 确保txlib文件夹包含签名所需的库文件与jar包在同一目录下。 # 通常无需额外配置框架会自动寻找。 # ChatGPT配置如果需要AI聊天功能 ChatGPT.apiKeysk-你的OpenAI_API_Key ChatGPT.modelgpt-3.5-turbo # 如果需要代理 # ChatGPT.proxyHost127.0.0.1 # ChatGPT.proxyPort7890 # Web服务地址用于生成查刀链接等 site.urlhttp://你的服务器IP:8080第四步准备昵称文件PCR竞技场查询必备。竞技场查询功能需要知道角色昵称和游戏ID的对应关系。将项目中的nicknames.txt文件放到jar包同目录下。如果第一次启动时没有这个文件程序会尝试从GitHub下载但国内网络可能不稳定所以强烈建议手动放置。第五步首次启动与登录验证。这是最关键也最容易出问题的一步。由于腾讯的风控直接密码登录很可能失败。我们需要进行设备验证。# 前台启动以便进行交互式登录 java -jar magicBotR.jar运行后控制台可能会出现几种情况直接登录成功运气极好恭喜你。要求输入验证码控制台会打印一个图片验证码的链接通常是base64编码的图片数据你需要复制到浏览器打开识别后输入验证码。要求设备锁验证最常见控制台会打印一个URL。请使用手机QQ扫描二维码或访问以下链接完成验证 https://xxx.xxx.xxx你需要 a. 将这个链接复制到手机浏览器中打开确保手机和服务器网络可以互通最好在同一网络下或服务器有公网IP。 b. 页面会提示你用手机QQ扫码。扫码后手机QQ会提示“在新设备登录”你点击确认。 c.关键一步在手机QQ上完成验证后务必在手机上退出这个QQ账号的登录。因为Mirai模拟的是一个独立设备如果手机QQ同时在线服务器端可能会被挤下线。 d. 回到服务器命令行按回车键继续。完成验证后如果看到类似“Login successful”或“Bot is online”的日志说明机器人已经登录成功并开始运行了。此时当前目录下会生成几个新文件device.json这是Mirai模拟的设备信息文件。非常重要只要这个文件在下次启动就会被认为是同一台设备通常无需再次验证。迁移服务器时一定要把它一起带走。cache/文件夹缓存文件。botData.dbSQLite数据库文件你的所有数据都在这里。logs/文件夹应用日志出问题时首先查看这里。第六步转入后台运行。第一次交互登录成功后我们就可以让它在后台长期运行了。在当前终端先按Ctrl Z暂停进程。输入jobs命令查看暂停的作业编号通常是[1]。输入bg 1将这个作业放到后台继续运行。更优雅的方式是使用nohup和# 首先结束刚才的进程 kill %1 # 使用nohup后台启动 nohup java -jar magicBotR.jar bot.log 21 这样所有输出会被重定向到bot.log文件即使你关闭SSH连接机器人也会继续运行。使用tail -f bot.log可以实时查看日志。3.2 风控应对与疑难排解QQ机器人的开发就是与腾讯风控斗智斗勇的过程。以下是我踩过无数坑后总结的经验1. 登录失败提示“版本过低”或“网络错误”这是最经典的风控。解决方案是使用fix-protocol-version插件针对旧版本或内置/自建签名服务qsign。对于v1.8.0及以上版本项目已内置qsign。请确保txlib文件夹完整存在于jar包旁。如果还不行尝试更换bot.protocol配置使用ANDROID_PAD或IPAD协议。对于旧版本或想自行管理签名可以参考项目历史记录中v1.7.0的说明使用Docker部署独立的magic-signer-guide签名服务并在配置文件中指向它。但这需要你有一台能稳定运行Docker的服务器。2. 登录成功但很快掉线或被封禁行为模式避免短时间内高频发送消息尤其是重复内容。给消息之间增加随机延迟。IP质量尽量使用稳定的家庭宽带IP或信誉较好的云服务器IP。避免使用那些被大量滥用的数据中心IP段。设备指纹device.json文件就是设备指纹。如果这个文件被多人复制使用会导致该设备指纹被腾讯标记。切勿共享你的device.json文件。如果怀疑设备被封可以删除device.json和cache文件夹重新走一遍登录验证流程生成一个新的设备指纹。3. 收不到群消息或事件检查机器人是否被群禁言。检查日志是否有错误信息。可能是Mirai内部的事件处理出了问题尝试重启机器人。确认你监听的是正确的事件。Mirai的事件类型很多比如GroupMessageEvent、MemberJoinEvent等。4. 如何优雅地更新版本停止当前机器人进程pkill -f magicBotR.jar(谨慎操作确认进程名)。备份device.json、botData.db、WMagicBotR.properties和nicknames.txt这四个核心文件。用新版本的magicBotR.jar替换旧文件。如果有配置文件项变更参照新版本的模板WMagicBotR_sample.properties更新你的WMagicBotR.properties。重新启动nohup java -jar magicBotR.jar bot.log 21 。4. 核心功能模块深度解析与实操4.1 PCR公会战管理从查刀到挂树公会战管理是WMagicBotR的初心。虽然因为游戏版本更新旧的核心战斗逻辑不再适用但其中的管理思路和框架仍值得剖析。数据模型设计我设计了几张核心表来管理公会战数据。clan_battle记录每一期公会战的基本信息如赛季ID、开始结束时间、当前周目和Boss信息。challenge记录每一刀出刀记录关联用户ID、Boss信息、造成的伤害、是否尾刀等。user记录绑定机器人的用户信息包括游戏内的UID。tree记录“挂树”信息即成员挑战Boss时暂停等待救援的记录。查刀功能实现用户发送“查刀”指令后后台逻辑如下解析指令获取发送者的QQ号。根据QQ号查询绑定的游戏UID。从challenge表中统计该用户在当前公会战周期内的出刀次数、总伤害、尾刀数等。将这些数据填充到一个HTML模板中生成一个可视化的数据报告页面。因为QQ直接发送长文本体验不好我选择生成一个临时的、带唯一ID的URL如http://你的服务器:8080/report/xxxx然后将这个链接以消息形式发送到群里。用户点击链接就能在浏览器里看到一个清晰的、带图表的数据看板。这个Web页面由Spring Boot内嵌的Tomcat提供服务。为了安全链接通常包含一个随机令牌且有过期时间防止数据被随意访问。挂树与提醒这是提升团队协作体验的关键功能。当成员挑战Boss发现打不过或想等队友一起收尾时可以发送“挂树”指令。机器人收到“挂树”指令会在tree表中插入一条记录包含挂树用户、Boss信息、挂树时间。同时创建一个MagicTask延时任务设定在30分钟后触发。30分钟后任务触发。机器人会该挂树成员并在群里发送提醒“【挂树提醒】某某某 您已在X号树挂了30分钟请及时处理或申请救援”如果成员在30分钟内发送“下树”指令则删除数据库记录并取消对应的延时任务。这个功能用到了我封装的MagicTask它是对Java原生TimerTask的包装提供了更好的生命周期管理和监控能力可以在MagicTaskObserver中查看所有活跃的定时任务。4.2 竞技场JJC查询集成外部API竞技场查询是另一个高频实用功能。它依赖于第三方网站pcrdfans.com提供的免费API。实现流程昵称解析用户发送“jjc 妈 狼 狗 猫 熊”。首先需要将“妈”、“狼”这样的昵称解析成游戏内的角色ID。这就是nicknames.txt文件的作用它是一个昵称到ID的映射表。程序启动时会加载这个文件到内存缓存中使用Trie树等数据结构实现快速匹配。构建请求将解析出的5个角色ID按照API要求的格式组装成HTTP POST请求的JSON体。调用API使用OkHttp或Spring的RestTemplate向pcrdfans的API端点发送请求。结果解析与展示API返回一个包含多个阵容解法队伍组合、胜率、参考视频的JSON。早期版本是直接返回文字后来我优化为“图形版查询”。图形合成“图形版查询”会为每个推荐阵容去本地或远程图床获取五个角色的头像图片然后使用Java的Graphics2D库将这些头像、阵容说明、胜率等信息合成一张长图。最后将这张图片上传到QQ群Mirai支持发送本地或网络图片。虽然第一次合成会慢一些需要下载头像但之后头像可以缓存到本地速度会快很多而且视觉上更直观。注意事项频繁调用第三方API有被封IP的风险。我在这里加了简单的内存缓存对于相同的查询阵容在短时间内比如1分钟直接返回缓存结果避免重复请求。同时在代码中加入了友好的错误处理如果API服务不可用或网络超时会回复用户“查询服务暂时不可用请稍后再试”。4.3 与GPT的集成从简单对话到函数调用从v1.3.0开始我接入了OpenAI的ChatGPT API让机器人拥有了“智能对话”能力。这个过程经历了几个阶段的演进。第一阶段基础对话最初只是简单的封装。在配置文件中填入OpenAI的API Key用户发送xml 你好机器人就将“你好”作为用户消息连同一些基础的系统提示词比如“你是一个有用的QQ机器人助手”发送给ChatGPT API然后将返回的文本回复给用户。同时实现了xmlset指令来设定对话人格xmlclear指令来清除上下文记忆因为API调用是包含历史消息的不清除会越来越长。这里遇到的一个坑是超时问题。GPT-3.5生成较长内容可能需要十几秒而QQ消息接口可能有超时限制。我的解决方案是引入了Stream模式v1.6.0。使用流式响应我可以边接收AI生成的文本边往QQ群里发送实现了“一个字一个字蹦出来”的效果用户体验更好也避免了单次请求超时。第二阶段基于知识库的问答单纯聊天意义有限。v1.5.0版本我实现了一个更实用的功能让GPT基于我提供的特定知识库来回答问题。我准备了一个embeddings.json文件。这个文件里存储了很多“问答对”或知识片段以及它们通过OpenAI Embeddings API计算出的向量vector。当用户提问时比如“公会战出刀规则是什么”程序会先用同样的Embeddings API将这个问题也转化为一个向量。然后计算这个问题向量与知识库中所有向量之间的“余弦相似度”找出最相关的几个知识片段。最后在调用ChatGPT API时把这些最相关的知识片段作为上下文Context和用户问题一起发送。提示词类似于“请根据以下信息回答问题[相关片段1] [相关片段2] 问题公会战出刀规则是什么” 这样GPT就能给出更精准、更符合我预设知识的回答而不是漫无边际地闲聊。这个功能非常适合用来做公会FAQ、游戏攻略查询等。第三阶段自然语言触发指令函数调用这是v1.9.0版本的一个重大升级也是我认为最优雅的集成方式。OpenAI发布了Function Calling功能让大模型可以理解工具的描述并决定在何时调用这个工具。我为此设计了一个Function注解。开发者可以像定义指令一样在一个方法上标注Function并提供一个详细的自然语言描述说明这个函数是做什么的、需要什么参数。Function(name query_weather, description 查询指定城市的天气情况) public String getWeather(Param(description 城市名称例如北京、上海) String city) { // 调用真实天气API return 北京今天晴气温20-25度。; }当用户对机器人说“帮我看看北京天气怎么样”时系统会将这句自然语言和所有已注册的Function描述一起发送给GPT。GPT会“理解”用户意图并回复一个结构化JSON例如{function_to_call: query_weather, arguments: {city: 北京}}。机器人框架解析这个JSON动态调用对应的getWeather方法并将结果“北京今天晴...”返回给用户。这意味着用户不再需要记忆“天气 北京”这样的固定指令格式直接用自然语言表达需求即可。这极大地降低了使用门槛让机器人的交互变得更加智能和人性化。我将这个功能模块抽离成了独立的库 magic-gpt-plus 以便在其他项目中复用。5. 开发扩展指南打造你自己的指令WMagicBotR的指令系统设计初衷就是让功能扩展变得简单。假设你想添加一个“今日运势”抽签功能。第一步创建你的服务类。在service包下新建一个FortuneService类用Service注解让Spring管理它。Service public class FortuneService { private static final String[] FORTUNES {大吉, 中吉, 小吉, 平, 凶}; private Random random new Random(); public String drawFortune(long qqId) { // 用QQ号作为随机种子让每人每天的运势固定 random.setSeed(qqId LocalDate.now().toEpochDay()); int index random.nextInt(FORTUNES.length); return FORTUNES[index]; } }第二步创建指令处理器。在command包或任何你喜欢的包下新建一个FortuneCommand类。它不需要继承特定父类。Component // 确保被Spring扫描到 public class FortuneCommand { Autowired private FortuneService fortuneService; Command(name 运势, alias {抽签, 今日运势}, permission Permission.MEMBER, scope Scope.GROUP_AND_FRIEND) public MessageChain fortune(MessageEvent event) { long senderId event.getSender().getId(); String result fortuneService.drawFortune(senderId); String reply String.format([%s] 您今日的运势是%s, event.getSenderName(), result); return new PlainText(reply); } }Command注解标记这是一个指令。name是指令主名称。alias是别名用户发送“抽签”也能触发。permission定义权限MEMBER表示群成员或好友即可。scope定义作用域GROUP_AND_FRIEND表示群和私聊都生效。方法参数MessageEvent event会自动注入包含了发送者、消息链等所有信息。方法返回一个MessageChain对象这是Mirai的消息链可以包含文字、图片、At等。第三步让你的指令可动态开关可选。如果你希望这个功能可以被管理员随时开启或关闭可以在类上添加Switch注解。Component Switch(name 运势抽签, defaultOn true) // 默认开启 public class FortuneCommand { // ... 同上 }这样管理员在群里发送“开关”指令就能在列表里看到“运势抽签”这个选项并切换其状态。当关闭时所有该类的指令都将失效。第四步重新打包与测试。添加新功能后使用Maven重新打包mvn clean package -DskipTests。将生成的magicBotR.jar替换到服务器上重启机器人即可。发送“运势”试试看吧这个开发模式清晰地将业务逻辑Service、指令定义Command和框架核心Core分离。当你需要添加更复杂的功能比如调用外部API、操作数据库时只需要在Service层实现然后在Command层调用即可。框架负责处理所有枯燥的QQ协议交互、消息解析和路由工作让你能专注于创造有趣的功能。6. 运维监控与问题排查实录即使程序写得再健壮线上运行也难免遇到问题。一套清晰的运维和排查流程至关重要。1. 日志是生命线项目使用SLF4J Logback记录日志。所有日志文件按日期滚动存储在logs/目录下。最重要的两个日志文件是application.log应用业务日志记录指令调用、服务处理过程。net.logMirai框架的网络层日志记录登录、心跳、消息收发等底层协议交互。当遇到登录失败、消息收不到等网络相关问题时首先查看这个文件。查看实时日志tail -f logs/application.log搜索特定错误grep -i error logs/application.log2. 数据库维护数据文件botData.db就是SQLite数据库。你可以用任何SQLite工具如DB Browser for SQLite, DBeaver打开它进行查看或简单修复。备份定期备份这个文件。简单的cp botData.db botData.db.bak就是一次备份。清理对于一些增长过快的表如聊天记录缓存可以编写一个简单的Spring定时任务定期删除过期数据。手动修改极端情况下可能需要手动修改数据。比如某个用户绑定错了UID你可以直接执行SQLUPDATE user SET game_uid新UID WHERE qq_number123456。操作前务必备份3. 性能与状态监控虽然项目轻量但了解其运行状态有好处。内存与CPU使用top或htop命令查看Java进程的资源占用。正常情况下应该很平稳。线程状态如果机器人“卡住”不响应了可以用jstack pid命令打印Java进程的线程栈看看是否有死锁或长时间阻塞的操作。我内置了一个简单的状态查询指令发送“状态”机器人会回复当前JVM内存使用情况、已加载指令数量、定时任务数量等基本信息。4. 常见问题速查表问题现象可能原因排查步骤与解决方案机器人登录失败提示“密码错误”或“网络异常”1. 密码确实错误2. 风控严重密码登录被禁3. 协议不匹配1. 确认密码正确可先在手机QQ登录试试。2.优先采用扫码登录首次启动时的设备验证流程。3. 在WMagicBotR.properties中更换bot.protocol尝试ANDROID_PAD或IPAD。4. 检查device.json是否存在且有效尝试删除它和cache文件夹后重走登录流程。登录成功但收不到群消息/不响应指令1. 机器人被禁言2. 指令前缀不匹配3. 网络连接问题1. 检查机器人是否在群内且未被禁言。2. 确认发送的消息以配置的指令前缀如/或!开头。3. 查看net.log是否有消息接收记录application.log是否有指令处理日志。4. 在群里发送“帮助”或“help”指令看是否有响应测试基础功能。竞技场查询返回“查询失败”或超时1. pcrdfans API服务异常2. 服务器网络到API端点不通3. 昵称文件nicknames.txt损坏或缺失1. 手动访问https://api.pcrdfans.com看是否通注意实际API地址可能不同以源码为准。2. 检查服务器DNS和网络配置。3. 确认nicknames.txt文件存在且格式正确。可以尝试使用“重载nickname”指令刷新缓存。GPT对话功能无响应1. OpenAI API Key无效或余额不足2. 网络代理配置错误如果使用3. 请求超时1. 检查WMagicBotR.properties中的ChatGPT.apiKey是否正确。2. 在服务器上使用curl命令测试是否能访问api.openai.com。3. 如果配置了代理确认代理地址和端口正确且服务正常运行。4. 查看application.log中GPT服务调用的详细错误信息。后台运行nohup后关闭SSH连接机器人就停了nohup使用方式不当或进程被Shell的SIGHUP信号终止1. 确保使用nohup command 格式并且不能少。2. 使用 ps -ef5. 使用systemd托管服务高级对于生产环境使用nohup不够可靠。推荐使用systemd创建后台服务。创建服务文件sudo vim /etc/systemd/system/wmagicbot.service[Unit] DescriptionWMagicBotR QQ Robot Service Afternetwork.target [Service] Typesimple Useryour_username # 建议用一个非root用户运行 WorkingDirectory/opt/wmagicbot ExecStart/usr/bin/java -jar magicBotR.jar Restarton-failure RestartSec10 StandardOutputjournal StandardErrorjournal [Install] WantedBymulti-user.target然后执行sudo systemctl daemon-reload sudo systemctl start wmagicbot sudo systemctl enable wmagicbot # 开机自启 sudo systemctl status wmagicbot # 查看状态 sudo journalctl -u wmagicbot -f # 查看日志这样机器人就作为一个系统服务运行了具备自动重启、日志集中管理通过journalctl查看等优点。维护一个自己长期使用的机器人项目就像养一盆电子盆栽。它不会总是乖乖的偶尔会闹点小脾气风控需要你根据季节腾讯策略调整养护方式协议和签名。但当你看到它在群里准确回复查询、提醒挂树、甚至用GPT插科打诨活跃气氛时那种亲手创造并维系一个数字生命体的成就感是单纯使用现成工具无法比拟的。WMagicBotR的代码可能不是最优雅的功能也不是最强大的但它完整地记录了一个个人开发者如何从需求出发一步步搭建、迭代、解决实际问题的过程。如果你也有兴趣打造一个属于自己的QQ机器人希望这份详尽的记录能帮你绕过我踩过的那些坑更顺畅地开启你的创造之旅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2599458.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…