如何搭建一个聊天机器人?#EX 消息的转发/群发

松本, Mitori 发布于 2025-10-22 265 次阅读


本文章为非主线的支线教程,建议阅读前置文章#0~#6或者【杂谈】#1~#6后、有一个已经能正常收发消息的bot后再阅读本文章

由于铃心自定义实现不了本功能了本次教程以koishi为基础,编写koishi插件,所以默认阅读本文章的开发者会:

  • 基本的TypeScript/JavaScript编写方法和规范
  • 对开发流程、工作区较为熟悉

如果是不会编写代码的开发者可以选择跳到最后看一键实现(复制黏贴)不过本教程仍然会尽量详细的解释每一个代码块的功能以及这么写的原因,有兴趣了解或者希望以后能够学习自主开发的开发者可以仔细阅读!

前言

本次我们要实现一个bot接受消息后转发或是群发到其他聊天中的小功能

难度虽然不高,但是为了贯彻之前我们一贯的开发流程,还是来分析一下这个功能的细节

首先,假设我们有一个聊天A和一个聊天B(无所谓是群聊或是私聊)

那么这个功能实际上在做的事就是:bot接受到A中的一条消息 → 了解这个消息是发给群组还是发给个人? → bot进行一个主动发送的动作 → 将刚刚的消息原原本本的/进行简单处理后发送给B

接受消息是一个很简单的事情,重点在于如何实现主动发送给其他人的这个动作

功能实现

用户单次指定单聊天

这里我们先实现由用户决定发送目标的功能

假设我们设计指令格式为:forward [qq/group] [qq号/群号] [发送内容]

首先定义这个指令:

//src/index.ts

...

export function apply(ctx: Context) {
  ctx.command("forward <targetType:string> <targetId:string> <message:text>")
    .usage("格式为:forward [qq/group] [qq号/群号] [发送内容] 例如forward qq 123456 转发这一条")
    .action(async ({ session }, targetType, targetId,message) => {
      if (!targetId || !targetType || !message) return session.text(".usage");

      ...
    })
}

由于全部都是必选参数,所以我们在command后的参数全部都是由尖括号包裹的

下面第一个是usage,也就是使用方法,我们将在有参数缺少的时候返回这个

第二个action,是command触发后执行的动作,具体的执行依靠action的回调函数,参数除了我们指令的参数以外,还传进去了一个session,意为bot接受到这条消息的场景信息,session内包含比如发送者信息、bot信息、发送内容和类型等等,我们需要用这个session来确定bot这个实例(也就是具体去实现发送的这个角色)

接下来是一个简单的实现

export function apply(ctx: Context) {
  ctx.command("forward <targetType:string> <targetId:string> <message:text>")
    .usage("格式为:forward [qq/group] [qq号/群号] [发送内容] 例如forward qq 123456 转发这一条")
    .action(async ({ session }, targetType, targetId,message) => {
      if (!targetId || !targetType || !message) return session.text(".usage");
      const bot = session.bot;
      if (targetType === "qq") {
        await bot.sendPrivateMessage(targetId, message);
        return "私聊消息发送成功";
      }
      else if (targetType === "group") {
        await bot.sendMessage(targetId, message);
        return "群聊消息发送成功";
      }
      else {
        return "目标类型错误,请使用qq或group";
      }
    })
}

首先我们从session中得到了一个bot实例,对于实例的概念上面大概讲解了一下,更进一步讲的话,相当于后续我们会借这个bot实例之手执行一些发送的命令

比如下方的bot.sendPrivateMessage以及bot.sendMessage,前者是私聊发送、后者是(可以)群聊发送,他们的参数都一样,都是一个号码+发送的消息内容

对于action,所有的return就是bot最终会发送的消息,我们可以在return处给一个消息已经成功发送的信号

一键实现

该板块适用于不会写代码/不想写代码/不太能理解这么写的原因的开发者,不过仍然要求至少有一定的电脑操作知识!有的小细节就不阐述了,如果有疑问可以参照之前的文章或者直接群内提问

默认已经有了一个koishi bot,如果没有的话可以阅读《如何搭建一个聊天机器人?#3 初步了解koishi、napcat以及onebot》

新建插件

在koishi应用目录下打开命令行,输入

npm run setup
如果在这一步报错,请检查是否在应用目录下。应用目录下应该有package.json这一文件,而不是打开应用目录后还有一层文件夹嵌套

接下来系统会向你询问plugin name,直接填写即可(这里是转发插件那么我们就叫forward好了)

询问description,可以为空,也可以写一下这个插件的作用

显示下面的文字就算创建成功


added 1 package in 2s

110 packages are looking for funding
  run `npm fund` for details

编辑插件

找到 [你的应用目录]/external/[刚刚你创建的插件名]/src/index.ts文件,复制下面的代码,记得保存哦

export function apply(ctx: Context) {
  ctx.command("forward <targetType:string> <targetId:string> <message:text>")
    .usage("格式为:forward [qq/group] [qq号/群号] [发送内容] 例如forward qq 123456 转发这一条")
    .action(async ({ session }, targetType, targetId,message) => {
      if (!targetId || !targetType || !message) return session.text(".usage");
      const bot = session.bot;
      if (targetType === "qq") {
        await bot.sendPrivateMessage(targetId, message);
        return "私聊消息发送成功";
      }
      else if (targetType === "group") {
        await bot.sendMessage(targetId, message);
        return "群聊消息发送成功";
      }
      else {
        return "目标类型错误,请使用qq或group";
      }
    })
}

启用插件

如果你的koishi现在还在运行,请关闭以后重启一下

然后在koishi应用目录,使用下面的命令重新启动koishi

npm run dev

进入koishi控制台,找到右侧 插件配置 一栏,点击后找到上方一个小插头 添加插件

然后在弹出的对话框里搜索自己的插件名,点击确认

最后点击上方启用插件,即可使用!

此作者没有提供个人介绍。
最后更新于 2025-10-22