6670 字
33 分钟
实践-bot搭建过程
2025-03-20
2025-04-10
⚠️ 注:本篇博客是探索过程中的随手记录,包括大量无用信息、AI生成信息。参考价值较低。

本地环境#

Ubuntu 24.04.1 LTS

WSL2 Ubuntu图形化界面安装#

使用Srdp

ECS云服务器#

ECS:Elastic Compute Service

公网IP

密钥对生成

workbench ssh连接

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

bash Miniconda3-latest-Linux-x86_64.sh

安装图形化界面

以Ubuntu 18操作系统为例介绍安装图形化桌面Ubuntu Desktop的方法,其他发行版的配置可能有所差异,具体情况请参阅相应发行版的官方文档。

  1. 通过VNC远程连接Linux实例。具体操作,请参见使用VNC登录实例

  2. 运行以下命令,更新软件源。

    Terminal window
    sudo apt-get update
  3. 运行以下命令,安装图形化桌面。

    Terminal window
    sudo apt-get install ubuntu-desktop

    如果安装出现unmet dependencies报错,请参见常见问题中的解决方案解决以后,再启动图形化桌面。

  4. 运行以下命令,设置默认启动为图形化桌面。您可以执行systemctl set-default multi-user.target,即可取消图形化界面登录。

    Terminal window
    sudo systemctl set-default graphical.target
  5. 运行以下命令,重启ECS实例。

    Terminal window
    sudo reboot
  6. 等待系统重启完成,出现图形化界面,确认安装成功。

    说明

    您无需设置VNC的登录密码,只需要输入实例的用户名和密码即可安全地访问ECS实例。

    如果不小心设置了,无法用root账户登录:

    使用命令vim /etc/pam.d/gdm-password修改gdm-password文件。

    将配置项的user != root删去。

vscode ssh连接

config编写

Host ecs-instance-name
HostName your-ecs-public-ip
User your-username
IdentityFile /path/to/your/private-key-file (如果使用密钥认证)
# Port 22 (如果你更改了默认的SSH端口,则需要指定)

ssh连接linux服务器中断后,如何让命令继续在服务器运行

命令前面加screen

这个时候如果ssh终端断开了连接。我们只需要再次连接服务器然后输入指令

screen -ls 这里就会显示ssh断开之前的程序,其实断开后程序依然在后台在运行,只是我们这个时候需要将它放到前台来运行。这个时候我们们已经通过screen -ls查询到了线程号是27267了,所以我们只需要执行下面的指令即可恢复到前台了。

screen -r 27267 如果想杀掉终端可以执行

kill 27267

【注:后来知道了tmux的用法~】

一些常用命令#

jobs -l

kill -9 强行终止进程(树)

fg <任务号> 恢复

弃用#

go-cqhttp【弃用】#

conda create -n qqbot python=3.10 -y conda activate qqbot

wget https://github.com/Mrs4s/go-cqhttp/releases/download/v1.0.0-rc3/go-cqhttp_linux_amd64.tar.gz

https://github.com/Mrs4s/go-cqhttp/releases/download/v1.2.0/go-cqhttp_linux_amd64.tar.gz

tar -zxvf go-cqhttp_linux_amd64.tar.gz cd go-cqhttp

反向 Websocket 通信

servers:
- ws-reverse:
universal: ws://127.0.0.1:8080/onebot/v11/ws # nonebot 监听的地址
reconnect-interval: 5000

nonebot【弃用】#

python -m pip install —user pipx python -m pipx ensurepath

pipx install nb-cli

nb create

nb run

在 NapCat 配置添加反向 ws 地址,地址为 ws://127.0.0.1:8080/onebot/v11/ws, 这里的 8080 是 NoneBot 输出的端口号,/onebot/v11/ws 是 NoneBot onebot 适配器默认的路径

nb adapter install nonebot-adapter-console 测试基础功能

nb plugin install nonebot-plugin-analysis-bilibili

OpenShamrock【弃用】#

NapCatQQ#

curl -o napcat.sh https://nclatest.znin.net/NapNeko/NapCat-Installer/main/script/install.sh && sudo bash napcat.sh

[2025-02-01 21:54:16]: 输入 xvfb-run -a qq —no-sandbox 命令启动。 [2025-02-01 21:54:16]: 保持后台运行 请输入 screen -dmS napcat bash -c “xvfb-run -a qq —no-sandbox”
[2025-02-01 21:54:16]: 后台快速登录 请输入 screen -dmS napcat bash -c “xvfb-run -a qq —no-sandbox -q QQ号码”
[2025-02-01 21:54:16]: Napcat安装位置 /opt/QQ/resources/app/app_launcher/napcat [2025-02-01 21:54:16]: WEBUI_TOKEN 请自行查看/opt/QQ/resources/app/app_launcher/napcat/config/webui.json文件获取 [2025-02-01 21:54:16]: 注意, 您可以随时使用 screen -r napcat 来进入后台进程并使用 ctrl + a + d 离开(离开不会关闭后台进程)。 [2025-02-01 21:54:16]: 停止后台运行 请输入 screen -S napcat -X quit

02-01 22:08:02 [info] [NapCat] [WebUi] WebUi Local Panel Url: http://127.0.0.1:6099/webui?token=xxxxxxx

LIBVA_DRIVER_NAME=nvidia qq

koishi#

Koishi.js(通称 Koishi)是一个跨平台的聊天机器人框架,其使用 TypeScript 开发,可在 Node.js 上运行。

Koishi 标识来源于东方 Project 中的角色古明地恋 (Komeiji Koishi)

AppImage文件的下载

http://localhost:5140/

配置koishi上的onebot adapter

napcat网络配置更改为ws://127.0.0.1:5140/onebot

原理学习#

使用 NoneBot 框架搭建的机器人具有以下几个基本组成部分:

  1. NoneBot 机器人框架主体:负责连接各个组成部分,提供基本的机器人功能
  2. 驱动器 Driver:客户端/服务端的功能实现,负责接收和发送消息(通常为 HTTP 通信)【FAST API】
  3. 适配器 Adapter:驱动器的上层,负责将平台消息与 NoneBot 事件/操作系统的消息格式相互转换【Onebot】
  4. 插件 Plugin:机器人的功能实现,通常为负责处理事件并进行一系列的操作
HTTP服务端NapCat作为Http请求接受方 接收对应接口调用并回应 的单工模型
HTTP客户端NapCat作为Http请求发起方 将事件推送至插件/应用框架 的单工模型
WebSocket服务端通常指正向WS 既能主动推送事件也能接收请求 的双工模型
WebSocket客户端通常指反向WS 既能主动推送事件也能接收请求 的双工模型

为什么其他平台的适配器名字都与平台一致,只有 QQ 对应 OneBot?

这是由多方原因共同导致的。

首先,许多平台都公开了自己的机器人接口,只有腾讯官方对机器人采取封杀的态度。因此只有 QQ 的适配器是基于第三方协议实现的,OneBot 正是这个协议的名字。而第三方协议远远不止一个,所以不应该用 QQ 这个笼统的名称。在未来也可能出现其他面向 QQ 的适配器。

反过来,OneBot 作为一个协议,未来也可能支持更多的聊天平台。届时只需有 koishi-adapter-onebot,Koishi 也相当于支持了这些平台。一旦出现了这样的情况,用 QQ 作为适配器名反而显得以偏概全了,这也是不妥当的。

但尽管这么说,从目前来看,当我们在讨论用 Koishi 实现 QQ 机器人时,都默认采用这个协议。

Mongo学习#

是一种Nosql非关系型数据库

集合(相当于表)、文档(类似json格式的一条记录,bson)

sudo apt update
sudo apt install -y mongodb
sudo service mongodb start
sudo service mongodb status

mongo常用指令#

  1. 连接和切换数据库

# 连接到MongoDB服务

mongo —port 27017

# 切换到指定数据库,如果不存在则创建

use mydatabase

  1. 数据库操作

# 显示所有数据库

show dbs

# 删除当前数据库

db.dropDatabase()

  1. 集合操作

# 创建集合

db.createCollection(“mycollection”)

# 显示所有集合

show collections

# 删除集合

db.mycollection.drop()

  1. 文档操作

插入文档

# 插入单个文档

db.mycollection.insert({name: “John”, age: 30})

# 批量插入文档

db.mycollection.insertMany([{name: “Jane”, age: 25}, {name: “Doe”, age: 22}])

查询文档

# 查询所有文档

db.<collection_name>.find().pretty()

# 条件查询文档

db.mycollection.find({age: {$gt: 25}})

# 查询单个文档

db.mycollection.findOne({name: “John”})

更新文档

# 覆盖更新文档

db.mycollection.update({name: “John”}, {name: “John”, age: 31})

# 局部更新文档

db.mycollection.update({name: “John”}, {$set: {age: 32}})

# 批量更新文档

db.mycollection.update({age: {lt: 30}}, {set: {status: “young”}}, {multi: true})

删除文档

# 删除单个文档

db.mycollection.remove({name: “John”})

# 删除所有文档(慎用)

db.mycollection.remove({})

mongodb://localhost:27017/yourDatabaseName

安装#

先安装了mongo 解压后放到/usr/local

vim /etc/mongodb.conf

dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/logs/mongodb.log
logappend=true
port=27017
bind_ip=0.0.0.0
fork=true
Terminal window
cd /usr/local/mongodb/bin
Terminal window
mongod -f /etc/mongodb.conf

mongosh安装解压后放到/usr/local

/usr/local/mongosh/bin/mongosh --host localhost --port 27017

一定要先关闭Mongodb再退出终端!否则重启困难。

mongod —shutdown -f /etc/mongodb.conf

mongod —repair -f /etc/mongodb.conf

注意如果修复不顺利,很有可能是权限问题

使用小技巧

bashrc中添加一行alias mongoshell='/usr/local/mongosh/bin/mongosh --host localhost --port 27017',以后即可在终端使用mongoshell启动shell了

compass#

在windows上安装即可

windows上连接mongodb://localhost:27017/即可

如果是云服务器呢?

  1. 修改 MongoDB 配置以允许远程访问

编辑 MongoDB 的配置文件 /etc/mongod.conf,找到 net 部分,并确保它如下所示(允许所有 IP 访问,请根据实际情况调整):

net:
port: 27017
bindIp: 0.0.0.0 # 允许任何IP访问,或者指定具体的IP地址如 '192.168.1.100'

保存更改后,重启 MongoDB 服务使配置生效:

Terminal window
sudo systemctl restart mongod
  1. 配置防火墙规则

确保服务器防火墙允许外部访问 MongoDB 端口(默认是 27017)。对于 UFW(Ubuntu 的默认防火墙),你可以运行以下命令来开放端口:

Terminal window
sudo ufw allow 27017

索引#

在使用 MongoDB 的 find() 方法进行查询时,MongoDB 不一定会遍历集合中的每一条数据。是否需要遍历所有文档取决于查询条件和索引的使用情况。

如果你在查询中使用的字段上没有创建索引,那么 MongoDB 将执行全表扫描(Collection Scan),这意味着它会检查集合中的每一个文档来找到匹配的记录。这种情况下,随着集合的增长,查询性能会显著下降。

但是,如果你在一个或多个字段上创建了索引,MongoDB 可以利用这些索引来快速定位到符合条件的文档,而不需要遍历整个集合。例如,如果你有一个针对 keyxx 字段的索引,并且执行 find({ keyxx: 1 }) 查询,MongoDB 将使用该索引来直接访问值为 1 的那些文档,而不是逐个检查每个文档。

为了验证 MongoDB 是否使用了索引来优化查询,你可以使用 .explain("executionStats") 方法来分析查询计划。这将告诉你MongoDB是如何执行查询的,包括是否使用了索引、扫描了多少文档等信息。

例如:

db.collection.find({ keyxx: 1 }).explain("executionStats")

通过这个命令,你可以看到查询的执行细节,包括是否有使用索引(index scan)还是进行了全表扫描(collection scan)。如果查询效率不如预期,考虑创建合适的索引通常是提高查询性能的第一步。不过也要注意,虽然索引可以加快读操作,但它们也会稍微减慢写操作,因为每次写入时都需要更新索引。因此,应该根据具体的使用场景来平衡索引的使用。

在compass中Indexes选项即可进行相关的操作。

迁移#

使用 mongodumpmongorestore

安装见mongodump工具安装及使用详解_mongodump安装-CSDN博客

这是最常用的方法之一,特别适合一次性迁移或备份恢复。

  1. 在源服务器上导出数据库

    • 使用 mongodump 命令来导出你要迁移的数据库。假设你的数据库名为 mydatabase,你可以运行如下命令:

      Terminal window
      mongodump --db mydatabase --out /path/to/backup/
    • 这将在指定路径下创建一个包含你的数据库的备份文件夹。

  2. 将备份传输到目标服务器

    • 你可以通过多种方式(如 scp, FTP, 或者直接使用云存储服务)将备份文件夹传输到目标服务器。
  3. 在目标服务器上导入数据库

    • 使用 mongorestore 来恢复数据库。首先确保你在目标服务器上有MongoDB正在运行,然后执行如下命令:

      Terminal window
      mongorestore --db mydatabase /path/to/backup/mydatabase/

脚本开发#

创建模板项目 | Koishi

npm init koishi@latest【要代理】

npm run start

npm run setup [name] -- [-c] [-m] [-G] 创建插件工作区,如 npm run setup example

在koishi.yml中修改

plugins:
example:{}

npm run dev 开发模式

npm install [...deps] -w koishi-plugin-[name]

指令系统#

ctx.command('echo <message>')
.action((_, message) => message)

定义了echo指令,(必选)参数,[xxx]用来定义可选参数

action是回调函数,第一个参数是Argv。其余的自己定义。

模板:

ctx.command('test <arg1> [arg2] [arg3]')
.action((_, arg1, arg2, arg3) => { /* do something */ })

如果想把参数声明为文本(空格的解析),需要改为ctx.command('echo <message:text>')

(因此文本参数通常在最后

指令可以定义选项

ctx.command('test')
.option('alpha', '-a') // 定义一个选项
.option('beta', '-b [beta]') // 定义一个带参数的可选选项
.option('gamma', '-c <gamma>') // 定义一个带参数的必选选项
.action(({ options }) => JSON.stringify(options))

事件系统#

ctx.on('message', (session) => {
if (session.content === '天王盖地虎') {
session.send('我是二百五')
}
})

message是事件名称,session是参数,是一个会话对象

消息元素#

阅读rss-owl代码

if (arg.merge===true) {
message = `<message forward><author id="${rssItem.author}"/>${messageList.join("")}</message>`
}

即可学会转发消息的发送

数据库#

聊天记录导出#

@seidko/messages#

实测是好用的,和sqlite一起

可以保存图片、b站分享等消息

但是没有发送者账号记录

chathub_message#

q78kg/messages-saver-mongodb#

没问题

message-logger#

QQ消息管理器中导出消息#

UTF-8-BOM

插件1#

‘node-fetch’的问题

2025-03-10 18:19:02 [E] loader Error [ERR_REQUIRE_ESM]: require() of ES Module /.../koishi-app/node_modules/node-fetch/src/index.js from /.../koishi-app/external/example/lib/index.js not supported.
Instead change the require of /.../koishi-app/node_modules/node-fetch/src/index.js in /.../koishi-app/external/example/lib/index.js to a dynamic import() which is available in all CommonJS modules.
at TracingChannel.traceSync (node:diagnostics_channel:315:14)
at Object.<anonymous> (/.../koishi-app/external/example/lib/index.js:39:33)

node-fetch 从 v3 开始是一个纯 ES 模块(ESM),而你的代码可能是在 CommonJS 环境下运行的(例如使用了 require)。Node.js 不支持直接通过 require 导入 ES 模块。

解决方法 :降级 node-fetch 到 v2

npm install node-fetch@2 -w @stivine/koishi-plugin-zvv

发布插件

npm run pub zvv

发布失败是npm的登录问题,tokens权限要为publish

更新版本

npm run bump zvv -3

发现报错

koishi日志

SenderError: Error with request send_group_msg, args: {"group_id":xxxxxx,"message":"[......]"}, retcode: 1200

napcat日志

[error] stivine | 发生错误 Error: 文件名解析失败

换思路

getPreviewImageDataUrlsFromText->getThumbnailDataURL->extractFrame->fetchIndex + parseIndex

插件2: eew#

导出模块

  • 通过__export函数将Config, apply, 和 name这三个标识符导出,使得外部文件可以通过src_exports对象访问这些资源。
  • 使用__toCommonJS函数确保模块兼容CommonJS规范。

配置定义(config.ts

  • 使用koishi.Schema.intersect方法创建了一个名为SConfig的复杂配置模式,该模式由多个部分组成,包括网络设置、基本设置、名单设置以及推送设置等。
  • 网络设置中包含地震预警WebSocket地址(eewUrl)和通信超时时间(eewTimeout)。
  • 基本设置中有一个选项决定是否启用EEW命令(enabledEew)。
  • 名单设置允许用户指定预警信息推送的目标群聊或私聊(eewSendList)和机器人白名单(eewBotList)。
  • 推送设置让用户选择是否启用来自不同地区或机构(如四川、福建、台湾、日本、中国地震台网等)的地震预警或报告推送。

工具函数(tools.ts

  • custLog:一个自定义的日志记录函数,接受上下文(ctx)、日志类型(type)和消息内容(value)作为参数,并根据类型输出相应级别的日志。
  • showEewInConsole:用于在控制台显示地震预警信息,使用了custLog函数来实现日志输出。
  • showTargetsshowPlatforms:这两个函数分别用来生成关于预警推送目标和平台的信息字符串,支持添加表情符号以增强可读性。
  • getFormatTime:获取并返回给定时间戳的格式化字符串,默认格式为”yyyy-MM-dd hh:mm”。

这段代码定义了一个名为EewAdapter的类,用于处理地震预警信息的发送和管理。以下是对该类及其方法的详细分析:

EewAdapter#

  • 属性

    • socket: 预留用于WebSocket连接的属性。
    • sendList: 推送目标列表,包含需要接收预警信息的目标(如群聊或私聊)。
    • botsList: 机器人白名单,指定了哪些机器人可以发送预警信息。
    • showEewLogs: 布尔值,决定是否在终端中显示预警日志。
    • showEewEmoji: 布尔值,决定输出信息中是否使用表情符号增强可读性。
    • ctx: 上下文对象,通常用于提供对Koishi框架功能的访问。
    • eewAllows: 对象,定义了不同类型的地震预警或报告是否允许被处理。
  • 构造函数

    • 初始化时接收上下文(ctx)、机器人列表(bot_list)、发送列表(send_list)、是否显示预警日志(eew_log)和是否显示表情符号(eew_emoji)作为参数,并将它们分配给相应的实例属性。
  • 方法

    • sendMessageToFriend(user_id, message): 向指定用户ID发送私信。它遍历所有可用的机器人,并通过每个机器人的sendPrivateMessage方法发送消息。
    • sendMessageToGroup(guild_id, message): 向指定群组ID发送消息。类似于sendMessageToFriend,但它调用的是机器人的sendMessage方法。
    • sendEew(data_object): 根据传入的地震数据对象决定如何处理和发送预警信息。首先检查预警类型是否允许被处理,然后根据预警类型实例化对应的预警处理器(例如ScEew, FjEew等)。接着调用处理器的eewExecute方法执行具体的预警逻辑,并通过showEewInfo方法获取格式化的预警信息。最后,根据发送列表中的目标类型(私聊或群聊),分别调用相应的方法发送预警信息。

其他细节

  • sendEew方法中,对于eqlist类型的数据,只处理其中的No1字段,这可能意味着这些数据结构包含了多个条目,但仅对最重要的一个进行处理。

  • 预警类型与具体处理器之间的映射似乎存在一个小错误:无论是cenc_eqlist还是jma_eqlist都使用了ScEew处理器实例化,而根据预期逻辑,可能应该分别为它们指定不同的处理器。

  • eew变量在每次sendEew方法结束时被设置为void 0(即undefined),这可能是为了手动释放资源或重置状态。

getSenderBotList():

  • 该方法用于获取所有可被允许发送消息的机器人列表。它遍历botsList中的每个ID,并与当前上下文(ctx)中活跃的机器人列表进行匹配。如果找到匹配项,则将其添加到当前机器人的列表cur_bot_list中。

setup(ws_url, time_out):

初始化WebSocket连接,使用提供的WebSocket URL (ws_url)和超时时间(time_out)。如果当前没有已存在的WebSocket连接,则创建一个新的连接。

start():

  • 开始监听WebSocket事件,包括连接打开、接收到消息、连接关闭和发生错误的情况。当接收到不同类型的消息(如地震预警或心跳包)时,会调用相应的处理逻辑。对于地震预警类型的消息,将调用sendEew方法处理并发送预警信息。

stop(): - 关闭WebSocket连接,并将socket属性设置为undefined以表示无连接状态。

pause() 和 resume(): - 分别用于暂停和恢复WebSocket连接的操作。这些方法可能依赖于底层WebSocket实现的支持。

isEnable(): - 检查是否存在有效的WebSocket连接。

status(show_emoji = true): - 返回当前WebSocket连接的状态描述,支持使用表情符号增强可读性。根据WebSocket的readyState属性值,返回不同的状态描述。

info(show_emoji = true): - 提供详细的系统状态信息,包括是否开启预警、通信状态、平台数量和目标数量等。同样支持使用表情符号增强输出。

setEewSwAllows(…): - 设置不同类型的地震预警或报告是否允许被处理。这允许动态调整哪些类型的预警信息会被处理。

test2():

- 一个测试方法,模拟接收一条特定格式的地震预警信息(JSON字符串),并通过`sendEew`方法处理这条消息。这对于调试和验证系统的正确性非常有用。

这段代码定义了两个类:Eew和继承自EewScEew。这些类主要用于处理和展示地震预警信息。以下是详细分析:

Eew#

  • 属性

    • 包含了一些基本的地震信息属性,如报告时间(report_time)、编号(num)、纬度(latitude)、经度(longitude)、地区(region)、震级(mag)、发震时间(origin_time)、深度(depth)、烈度(intensity)以及类型(type)。
    • ctx: 上下文对象,用于提供对Koishi框架功能的访问。
  • 构造函数

    • 接收一个上下文对象ctx作为参数,并将其分配给实例属性。
  • 方法

    • showEewInfo(show_log, show_emoji): 返回一个字符串模板,表示如何展示地震预警信息。具体实现由子类完成。
    • eewExecute(json_data): 根据传入的JSON数据初始化地震信息。它尝试从输入的数据中提取相关字段,并为缺失的值提供默认值或使用辅助函数(如getFormatTime())生成当前时间。
    • static test(ctx, show_emoji = true): 提供了一个静态测试方法,用于模拟一条地震预警信息,并通过showEewInConsole函数输出到控制台。这有助于验证系统在接收特定格式的信息时是否能正确响应。

ScEew#

  • 属性

    • 在父类的基础上增加了一个title属性,用于标识该地震预警是来自四川地震网。
  • 方法

    • eewExecute(scEewData): 覆写了父类的方法,除了调用父类的eewExecute方法外,还额外设置了地震烈度(intensity)和深度(depth)。如果数据中包含烈度或深度信息,则更新标题为“中国地震台网”。
    • showEewInfo(show_log = true, show_emoji = true): 实现了具体的地震信息展示逻辑。它构建了一个包含地震详情的字符串,并根据参数决定是否显示在控制台上。此外,它支持通过表情符号增强信息的可读性。

这段代码继续扩展了Eew基类,定义了三个新的子类:FjEewCwaEewJmaEew,分别用于处理福建、台湾(湾湾)和日本的地震预警信息。以下是每个子类的具体分析:

FjEew#

  • 属性

    • 继承自Eew的所有属性。
    • 新增了一个属性type,用于标识地震预警是否为最终报。
  • 方法

    • eewExecute(fjEewData):重写了父类的方法,除了调用父类的eewExecute方法外,还根据数据中的isFinal字段来设置type属性。
    • showEewInfo(show_log = true, show_emoji = true):实现了具体的展示逻辑,构建了包含地震详情的字符串,并支持通过表情符号增强可读性。如果设置了isFinal,会在标题后添加“[终]”标识。

CwaEew#

  • 属性

    • 继承自Eew的所有属性。
    • 新增了两个属性:shindo(最大震度)和title(标题),用于存储特定于台湾地震预警的信息。
  • 方法

    • eewExecute(cwaEewData):重写了父类的方法,除了调用父类的eewExecute方法外,还设置了深度和最大震度。
    • showEewInfo(show_log = true, show_emoji = true):实现了具体的展示逻辑,构建了包含地震详情的字符串,并支持通过表情符号增强可读性。

JmaEew#

  • 属性

    • 继承自Eew的所有属性。
    • 新增了几个属性:shindo(最大震度)、title(标题)和info(地震列表信息),用于存储特定于日本地震预警的信息。
  • 方法

    • eewExecute(jmaEewData):重写了父类的方法,除了调用父类的eewExecute方法外,还设置了深度、最大震度、最终报标识以及标题和信息内容。
    • showEewInfo(show_log = true, show_emoji = true):实现了具体的展示逻辑,构建了包含地震详情的日语字符串,并支持通过表情符号增强可读性。对于日语标题,使用了特定的格式。

这段代码定义了一个名为apply的函数,该函数是Koishi插件的主要入口点,用于处理与地震预警相关的命令和配置。以下是详细的分析:

函数 apply#

  • 参数

    • ctx: Koishi上下文对象,提供访问框架功能的方法。
    • config: 插件配置对象,包含所有必要的配置项。
  • 配置初始化

    • 从传入的config中提取各项设置,包括是否启用地震预警(EEW_SW)、WebSocket地址(EEW_ADDR)、超时时间(EEW_TIMEOUT)等,并为每个设置提供了默认值。
  • 事件监听器

    • 监听Koishi的生命周期事件,如readyexitdispose,分别在插件准备就绪、退出和销毁时执行相应的操作(例如启动或停止WebSocket连接)。
  • 前置检查函数 previousCheck

    • 在执行某些命令之前进行必要的检查,确保WebSocket地址有效且地震预警指令已启用。如果检查失败,则返回相应的错误信息。
  • 命令定义

    • 使用ctx.command方法定义了一系列命令,使用户能够通过聊天界面与插件交互。这些命令包括:
      • EEW: 地震预警菜单界面。
      • EEW.开启: 开启地震预警服务。
      • EEW.关闭: 关闭地震预警服务。
      • EEW.重置: 重置地震预警服务。
      • EEW.状态: 查看当前地震预警服务的状态信息。
      • EEW.测试: 发送一个地震预警测试消息。
      • EEW.目标: 查看地震预警推送的目标列表。
      • EEW.平台: 查看地震预警推送的机器人列表。
  • 具体实现细节

    • 对于每个命令,都会首先调用previousCheck进行前置条件检查,以确保可以安全地执行后续操作。
    • 根据不同的命令,会调用EewAdapter的不同方法来执行实际的操作,比如启动或停止WebSocket连接,或者显示状态信息等。
    • 提供了别名(alias)支持,使得用户可以通过多种方式输入相同的命令(例如,EEW.开启EEW 开启)。

API相关信息#

all_eew#

接收所有 JSON API 推送:wss://ws-api.wolfx.jp/all_eew

type字段”sc_eew""fj_eew""cwa_eew""jma_eew""jma_eqlist""cenc_eqlist

JMA#

{"Title":"緊急地震速報(予報)","CodeType":"M、最大予測震度及び主要動到達予測時刻の緊急地震速報","Issue":{"Source":"東京","Status":"通常"},"EventID":"20250401144201","Serial":4,"AnnouncedTime":"2025/04/01 14:42:50","OriginTime":"2025/04/01 14:41:47","Hypocenter":"根室半島南東沖","Latitude":43.0,"Longitude":145.9,"Magunitude":4.2,"Depth":90,"MaxIntensity":"2","Accuracy":{"Epicenter":"IPF 法(5 点以上)","Depth":"IPF 法(5 点以上)","Magnitude":"防災科研システム"},"MaxIntChange":{"String":"ほとんど変化なし","Reason":"不明、未設定時、キャンセル時"},"WarnArea":[],"isSea":true,"isTraining":false,"isAssumption":false,"isWarn":false,"isFinal":true,"isCancel":false,"OriginalText":"37 03 00 250401144250 C11 250401144147 ND20250401144201 NCN904 JD////////////// JN/// 189 N430 E1459 090 42 02 RK44209 RT10/// RC0//// 9999=","Pond":"68"}

注意isFinal和Serial两个量,标注是否为最终报、是第几次警报

四川#

  • ID EEW发报ID
  • EventID EEW发报事件
  • IDReportTimeEEW 发报时间(UTC+8)
  • ReportNumEEW发报数
  • OriginTime发震时间(UTC+8)
  • HypoCenter震源地
  • Latitude震源地纬度
  • Longitude震源地经度
  • Magunitude震级
  • Depth震源深度(原报文未提供)
  • MaxIntensity最大烈度

希望增加功能:自动重启#

eew 开启做了什么?检查isEnable,如果False则setup、start

eew 重置做了什么?stop,new一个eewadapter

eew 状态做了什么?.info,而info就是检查status,status是检查isEnable和socket.readyState,只要有一个false就是无连接

isEnable做了什么?return this.socket != void 0;

socket是怎么来的?setup来的,setup具体内容即

this.socket = this.socket ?? this.ctx.http.ws(ws_url, { timeout: time_out });

解开疑惑!bug状态即isEnable返回true,即socket存在,但status是false,即socket not ready!

需要插件多加一个功能:定时(如半小时)检查status,如果false即自动进行重置开启之类的工作。

简单的学习#

Dify学习#

Terminal window
cd dify
cd docker
cp .env.example .env
docker compose up -d

http://localhost/install

后端即服务,提供API接口

可以实时更新数据库

jina学习#

用来爬取网站内容 / 提供embedding模型

ollama学习#

本地部署embedding

curl -fsSL https://ollama.com/install.sh | sh

ollama pull bge-m3

bge-m3作为embedding模型

http://host.docker.internal:11434

卡在索引中?

Todo#

  • 直播/视频更新提示是怎么实现的?
  • 聊天记录导出到数据库?
  • 接入大模型 聊天功能?
实践-bot搭建过程
https://stivine.github.io/posts/practice-bot-building-process/
作者
藤君
发布于
2025-03-20
许可协议
CC BY-NC-SA 4.0