开发入门
<h1>开发入门</h1>
<h2>前言</h2>
<p><strong>KiviBot 插件</strong>基于 TypeScript 开发。<br />
因此,本教程假设您已经具有一定的<strong>TypeScript 基础</strong>,并对 Node.js 有一定的了解。</p>
<ul>
<li><a href="https://www.showdoc.com.cn/p/d14da024cd71198bd6d58daefbe1a5ca">前置知识</a></li>
</ul>
<h2>所需工具</h2>
<h4>1.KiviBot 框架</h4>
<p>通过 开始 中的 <a href="https://www.showdoc.com.cn/p/d60084e69e64a4041b9747d616568aec">快速上手</a> 安装框架。</p>
<h4>2.代码编辑器</h4>
<p>您需要一个文本编辑器来编写代码。 我们推荐使用 Visual Studio Code (VS Code),因为它是免费和强大的,且支持终端的运行。<a href="https://code.visualstudio.com/">VS Code 官网</a></p>
<h2>创建第一个插件 - demo1</h2>
<ul>
<li>在 <code>框架目录/plugins</code> 下新建文件夹(文件夹名称即插件名)</li>
<li>文件夹下新建 index.ts(插件主文件)</li>
<li>将下列代码粘贴到 index.ts 文件中并保存</li>
</ul>
<p>你可以新建一个 demo1 文件夹(文件夹名字要和下面 name 一样)</p>
<p>typescript</p>
<pre><code>import { definePlugin } from &quot;kivibot&quot;;
export default definePlugin({
name: &quot;demo1&quot;,
version: &quot;1.0.0&quot;,
async setup(ctx) {
//改为自己的qq号
ctx.bot.sendPrivateMsg(114514, &quot;插件被启用了!&quot;);
},
});</code></pre>
<ul>
<li>接着向机器人发送 <code>#插件 启用 demo1</code></li>
<li>再发送 <code>#插件 禁用 demo1</code></li>
</ul>
<p>可以看到的是,在启用插件时机器人会向指定 QQ 发送"插件被启用了!"</p>
<p><strong>至此,你成功创建了第一个插件并启用。</strong></p>
<p>接下来,对插件内容进行简要的讲解:</p>
<p><strong>必要部分</strong> 为每个插件都应有的代码:</p>
<p>typescript</p>
<pre><code>import { definePlugin } from &quot;kivibot&quot;;
//第一行代码,引入了框架核心kivibot里面的definePlugin函数
export default definePlugin({
name: &quot;demo1&quot;, // 插件名
version: &quot;1.0.0&quot;, // 插件版本
async setup(ctx) {
// 插件启用时的逻辑
},
});</code></pre>
<p><strong>主体部分</strong> 实现插件的功能:</p>
<p>typescript</p>
<pre><code>import { definePlugin } from &quot;kivibot&quot;;
export default definePlugin({
name: &quot;demo1&quot;,
version: &quot;1.0.0&quot;,
async setup(ctx) {
// ctx是插件上下文对象,包含bot等属性和handle等方法
ctx.bot.sendPrivateMsg(1706328818, &quot;插件被启用了!&quot;);
// 调用bot对象的发送私聊消息方法
},
});</code></pre>
<p>> 注意,虽然 demo1 演示了 <strong>插件启用后</strong> 发送消息,但实际插件开发中我们<strong>不推荐</strong>你这样做。</p>
<p><strong>小结</strong>:插件分为必要部分和本体部分,其中在必要部分定义插件的基本信息,在本体部分实现插件功能。通过 demo1,你应该了解到了如何创建一个基础插件,以及如何使用 ctx.bot 发送消息。</p>
<h2>实现监听消息并回复 - demo2</h2>
<p>在 KiviBot 中,我们使用 ctx.handle()方法来监听和处理消息事件。参考下面的示例:</p>
<p>typescript</p>
<pre><code>import { definePlugin } from &quot;kivibot&quot;;
export default definePlugin({
name: &quot;demo2&quot;,
version: &quot;1.0.0&quot;,
async setup(ctx) {
ctx.handle(&quot;message&quot;, async (e) =&gt; {
// 监听所有消息事件
if (e.message_type === &quot;private&quot;) {
// 判断是否为私聊消息
e.reply(e.sender.nickname + &quot;给我发了消息:&quot; + e.raw_message);
// 使用reply方法直接回复消息
}
});
},
});</code></pre>
<p><strong>下面简要介绍下事件对象 e。</strong> e 为接收到的消息事件对象,包含消息的各种信息和回复等方法。 例如一个群消息事件对象的结构如下:</p>
<p>提示</p>
<p>这是不完全的,可以自己 console.log 相应内容查看结构</p>
<p>typescript</p>
<pre><code>{
post_type: &#039;message&#039;,
message_id: &#039;xxx&#039;,
user_id: 1234567,
time: 1672304636,
message: [
{ type: &#039;text&#039;, text: &#039;这是文字&#039; },
{ type: &#039;at&#039;, qq: 1234567, text: &#039;@用户&#039; },
{
type: &#039;image&#039;,
file: &#039;xxx.jpg&#039;,
url: &#039;https://xxx.com/xxx.jpg&#039;
}
],
raw_message: &#039;这是文字@用户 [图片]&#039;,
message_type: &#039;group&#039;,
sender: {
user_id: 1234567,
nickname: &#039;用户名&#039;,
// ...其他发送者信息
},
group_id: 12345,
// ...其他群消息相关信息
}</code></pre>
<h2>指定词回复 - demo-2.5</h2>
<p>再来一个示例,巩固一下 demo-2 的知识:</p>
<p>typescript</p>
<pre><code>import { definePlugin } from &quot;kivibot&quot;;
export default definePlugin({
name: &quot;demo-2.5&quot;,
version: &quot;1.0.0&quot;,
async setup(ctx) {
ctx.handle(&quot;message&quot;, (e) =&gt; {
if (e.raw_message === &quot;你好&quot;) {
// raw_message是消息的文本内容
e.reply(&quot;世界!&quot;, true);
// reply方法第二个参数为是否引用回复,默认false
}
});
},
});</code></pre>
<h2>发送图片,语音等消息 - demo-3</h2>
<p>在 KiviBot 中,我们使用 segment 工具来构造特殊消息:</p>
<p>typescript</p>
<pre><code>import { definePlugin, segment } from &quot;kivibot&quot;;
export default definePlugin({
name: &quot;demo-3&quot;,
version: &quot;1.0.0&quot;,
async setup(ctx) {
ctx.handle(&quot;message&quot;, (e) =&gt; {
if (e.raw_message === &quot;发图片&quot;) {
const str = &quot;这是个图片:&quot;;
const img = &quot;https://example.com/image.png&quot;;
e.reply([str, segment.image(img)]);
// 使用segment.image()构造图片消息
// 复杂消息需要用数组形式发送
}
});
},
});</code></pre>
<p>支持的 segment 方法包括:</p>
<ul>
<li><a href="http://segment.at/">segment.at</a>() - @某人</li>
<li>segment.image() - 图片</li>
<li>segment.record() - 语音</li>
<li>segment.video() - 视频 等等</li>
</ul>
<p>更多请看 Bot API 中的 segment</p>
<h2>提升自己</h2>
<p>入门教程暂时到这里,接下来可以:</p>
<ul>
<li>学习进阶开发技巧</li>
<li>阅读 API 文档深入学习</li>
</ul>