本地环境
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的方法,其他发行版的配置可能有所差异,具体情况请参阅相应发行版的官方文档。
-
通过VNC远程连接Linux实例。具体操作,请参见使用VNC登录实例。
-
运行以下命令,更新软件源。
Terminal window sudo apt-get update -
运行以下命令,安装图形化桌面。
Terminal window sudo apt-get install ubuntu-desktop如果安装出现unmet dependencies报错,请参见常见问题中的解决方案解决以后,再启动图形化桌面。
-
运行以下命令,设置默认启动为图形化桌面。您可以执行
systemctl set-default multi-user.target
,即可取消图形化界面登录。Terminal window sudo systemctl set-default graphical.target -
运行以下命令,重启ECS实例。
Terminal window sudo reboot -
等待系统重启完成,出现图形化界面,确认安装成功。
说明
您无需设置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文件的下载
配置koishi上的onebot adapter
napcat网络配置更改为ws://127.0.0.1:5140/onebot
原理学习
使用 NoneBot 框架搭建的机器人具有以下几个基本组成部分:
- NoneBot 机器人框架主体:负责连接各个组成部分,提供基本的机器人功能
- 驱动器
Driver
:客户端/服务端的功能实现,负责接收和发送消息(通常为 HTTP 通信)【FAST API】 - 适配器
Adapter
:驱动器的上层,负责将平台消息与 NoneBot 事件/操作系统的消息格式相互转换【Onebot】 - 插件
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常用指令
- 连接和切换数据库
# 连接到MongoDB服务
mongo —port 27017
# 切换到指定数据库,如果不存在则创建
use mydatabase
- 数据库操作
# 显示所有数据库
show dbs
# 删除当前数据库
db.dropDatabase()
- 集合操作
# 创建集合
db.createCollection(“mycollection”)
# 显示所有集合
show collections
# 删除集合
db.mycollection.drop()
- 文档操作
插入文档
# 插入单个文档
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/datalogpath=/usr/local/mongodb/logs/mongodb.loglogappend=trueport=27017bind_ip=0.0.0.0fork=true
cd /usr/local/mongodb/bin
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/
即可
如果是云服务器呢?
- 修改 MongoDB 配置以允许远程访问
编辑 MongoDB 的配置文件 /etc/mongod.conf
,找到 net
部分,并确保它如下所示(允许所有 IP 访问,请根据实际情况调整):
net: port: 27017 bindIp: 0.0.0.0 # 允许任何IP访问,或者指定具体的IP地址如 '192.168.1.100'
保存更改后,重启 MongoDB 服务使配置生效:
sudo systemctl restart mongod
- 配置防火墙规则
确保服务器防火墙允许外部访问 MongoDB 端口(默认是 27017)。对于 UFW(Ubuntu 的默认防火墙),你可以运行以下命令来开放端口:
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选项即可进行相关的操作。
迁移
使用 mongodump
和 mongorestore
安装见mongodump工具安装及使用详解_mongodump安装-CSDN博客
这是最常用的方法之一,特别适合一次性迁移或备份恢复。
-
在源服务器上导出数据库
-
使用
mongodump
命令来导出你要迁移的数据库。假设你的数据库名为mydatabase
,你可以运行如下命令:Terminal window mongodump --db mydatabase --out /path/to/backup/ -
这将在指定路径下创建一个包含你的数据库的备份文件夹。
-
-
将备份传输到目标服务器
- 你可以通过多种方式(如
scp
, FTP, 或者直接使用云存储服务)将备份文件夹传输到目标服务器。
- 你可以通过多种方式(如
-
在目标服务器上导入数据库
-
使用
mongorestore
来恢复数据库。首先确保你在目标服务器上有MongoDB正在运行,然后执行如下命令:Terminal window mongorestore --db mydatabase /path/to/backup/mydatabase/
-
脚本开发
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指令,(必选)参数是
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
函数来实现日志输出。showTargets
和showPlatforms
:这两个函数分别用来生成关于预警推送目标和平台的信息字符串,支持添加表情符号以增强可读性。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
和继承自Eew
的ScEew
。这些类主要用于处理和展示地震预警信息。以下是详细分析:
类 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
基类,定义了三个新的子类:FjEew
、CwaEew
和JmaEew
,分别用于处理福建、台湾(湾湾)和日本的地震预警信息。以下是每个子类的具体分析:
类 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的生命周期事件,如
ready
、exit
和dispose
,分别在插件准备就绪、退出和销毁时执行相应的操作(例如启动或停止WebSocket连接)。
- 监听Koishi的生命周期事件,如
-
前置检查函数
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学习
cd difycd dockercp .env.example .envdocker compose up -d
后端即服务,提供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
- 直播/视频更新提示是怎么实现的?
- 聊天记录导出到数据库?
- 接入大模型 聊天功能?