feat(readme): 更新项目介绍和部署指南
更新了README,加入了使用Go语言重新实现sihuan/XZZ机器人项目的介绍。由于原项目使用的go-cqhttp不再维护,本项目转向使用napcat实现。同时,更新了部署服务的步骤和配置文件示例,方便用户进行部署和使用。
This commit is contained in:
parent
c77378d825
commit
f160de4320
5 changed files with 77 additions and 36 deletions
79
README.md
79
README.md
|
@ -1,33 +1,56 @@
|
||||||
# 使用Go语言重新实现 [sihuan/XZZ](https://github.com/sihuan/XZZ) 机器人项目
|
# 使用Go语言重新实现 [sihuan/XZZ](https://github.com/sihuan/XZZ) 机器人项目
|
||||||
|
本项目是一个使用Go语言重新实现 [sihuan/XZZ](https://github.com/sihuan/XZZ) 机器人项目。原使用go-cqhttp的机器人项目,由于go-cqhttp不再维护,有众多bug,无法使用,所以更换使用 [napcat](https://github.com/NapNeko/NapCatQQ) 实现。
|
||||||
|
|
||||||
## 使用方式:
|
当前项目的功能都在`workers`目录下。同时所有接收到的消息都保存在一个sqllite数据库中,文件名为`data.db`保存在项目根目录。
|
||||||
|
## 部署服务:
|
||||||
- 下载一个`go-cqhttp` 配置http模式,修改为下面类似配置
|
1. 先使用docker部署[napcat](https://github.com/NapNeko/NapCatQQ),然后修改配置文件,将机器人的token替换为napcat的token,然后运行项目即可。
|
||||||
|
部署[napcat](https://github.com/NapNeko/NapCatQQ)可参考下面的docker-compose.yml文件:
|
||||||
```yaml
|
```yaml
|
||||||
- http: # HTTP 通信设置
|
version: '3'
|
||||||
address: 0.0.0.0:5700 # HTTP监听地址
|
services:
|
||||||
version: 11 # OneBot协议版本, 支持 11/12
|
napcat:
|
||||||
timeout: 5 # 反向 HTTP 超时时间, 单位秒,<5 时将被忽略
|
image: mlikiowa/napcat-docker:latest
|
||||||
long-polling: # 长轮询拓展
|
container_name: napcat
|
||||||
enabled: false # 是否开启
|
environment:
|
||||||
max-queue-size: 2000 # 消息队列大小,0 表示不限制队列大小,谨慎使用
|
- ACCOUNT=<QQ号>
|
||||||
middlewares:
|
- HTTP_ENABLE=true
|
||||||
<<: *default # 引用默认中间件
|
- HTTP_POST_ENABLE=true
|
||||||
post: # 反向HTTP POST地址列表
|
- HTTP_URLS=["http://172.17.0.1:5580/"]
|
||||||
- url: http://0.0.0.0:5580 # 地址
|
ports:
|
||||||
|
- "5700:3000"
|
||||||
|
- "6099:6099"
|
||||||
|
volumes:
|
||||||
|
- ~/dockerfile/napcat/config:/usr/src/app/napcat/config
|
||||||
|
- ~/dockerfile/napcat/QQ:/root/.config/QQ
|
||||||
```
|
```
|
||||||
- 配置事件过滤规则
|
然后启动docker-compose.yml文件即可。
|
||||||
```json
|
|
||||||
{
|
|
||||||
"message_type": "group",
|
|
||||||
"raw_message":{
|
|
||||||
".regex":"^!"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
表示只接收以 ! 开头的指令,同时修改配置文件默认中间件锚点的事件过滤器文件目录 `filter: filter.json` ,还要修改上报数据类型为 `array` 。
|
|
||||||
|
|
||||||
- 自定义配置
|
2. 运行本项目前需要先修改配置文件,将本项目目录下的`config example.toml` 重命名为`config.toml`,然后修改配置文件,默认的配置端口跟上面的 docker-compose.yml文件一致,不需要修改。如果需要使用ai功能,需要修改配置文件里的`MODEL`,`OPENAI_API_KEY`和`OPENAI_BaseURL`这三个字段。
|
||||||
修改项目目录下的 `config.toml` 文件,`APIURL` 配置为 `go-cqhttp` 的 `post` 配置的 `url` 地址。
|
3. 启动项目:安装go环境,然后运行`go run main.go`即可。你也可以使用`go build main/go -o go-bot`编译为可执行文件,
|
||||||
`POSTURL` 配置为 `go-cqhttp` 的 `http` 配置的 `address` 地址,需要加协议前缀 `http://`。
|
## 使用说明:
|
||||||
后面的 [Group] 按需求配置,注意里面的群名要加双引号,因为程序里读取的是 `string` 类型。
|
1. 默认的配置端口是5580,如果需要修改,请修改配置文件里的`APIURL`字段。默认获取以`!`开头的消息,如果需要修改,请修改配置文件里的`Prefix`字段。
|
||||||
|
|
||||||
|
## 编写插件:
|
||||||
|
所有的插件放在`workers`目录下,并且都要有下面的代码:
|
||||||
|
```go
|
||||||
|
package workers
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
RegisterWorkerFactory("ping", func(parms []string, uid, gid, role, mid, rawMsg string) Worker {
|
||||||
|
return &Ping{
|
||||||
|
StdAns: NewStdAns(parms, uid, gid, role, mid, rawMsg),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
type Ping struct {
|
||||||
|
*StdAns
|
||||||
|
}
|
||||||
|
```
|
||||||
|
上面的例子是实现里`ping`这个插件的注册,在群组中以`!ping`指令激活。
|
||||||
|
同时所有的功能需要写在实现的`GetMsg()`方法里,如`!ping` 命令的:
|
||||||
|
```go
|
||||||
|
func (a *Ping) GetMsg() string {
|
||||||
|
return "Pong!"
|
||||||
|
}
|
||||||
|
```
|
|
@ -1,9 +1,14 @@
|
||||||
APIURL = "0.0.0.0:5580"
|
APIURL = "0.0.0.0:5580"
|
||||||
POSTURL = "http://0.0.0.0:5700"
|
POSTURL = "http://0.0.0.0:5700"
|
||||||
|
|
||||||
|
Prefix = "!"
|
||||||
AllowGroup = []
|
AllowGroup = []
|
||||||
AllowUser = []
|
AllowUser = []
|
||||||
AllowRole = []
|
AllowRole = []
|
||||||
BlockGroup = []
|
BlockGroup = []
|
||||||
BlockUser = []
|
BlockUser = []
|
||||||
|
Master = []
|
||||||
|
MODEL = "gpt-4o"
|
||||||
|
OPENAI_API_KEY = "https://api.openai.com/v1"
|
||||||
|
OPENAI_BaseURL = "sk-xxxx"
|
||||||
|
PROMPT = "## Role : \nQQ群Linux助手\n\n## Background : \n该角色是一位专门为QQ群提供Linux相关技术支持的助手,熟悉各种Linux发行版的使用和问题解决,旨在帮助群友解决他们在使用Linux过程中遇到的各种问题。\n\n## Preferences : \n该角色偏好简洁明了的回答风格,注重解决方案的精确性和有效性。喜欢友好和尊重的互动方式,致力于营造一个技术交流的和谐环境。\n\n## Profile :\n- language: 中文\n- description: 为QQ群友提供Linux相关问题的简洁、精确解决方案\n\n## Goals :\n1. 回答Linux相关问题\n2. 提供简短、精确的解决方案\n3. 鼓励群友提出问题并尊重他们\n\n## Constrains :\n1. 避免回答政治相关内容\n2. 每个问题只回答一次,确保回复简短、精确\n\n## Skills :\n1. 熟悉各种Linux发行版的使用和问题解决\n2. 能够提供简洁明了的技术支持\n3. 友好回复群友的提问\n\n## Examples :\n1. 问题:如何查看当前Linux系统的内核版本?\n 答案:可以使用命令`uname -r`来查看当前的内核版本。\n \n2. 问题:如何安装一个软件包?\n 答案:可以使用`sudo pacman -S <软件包名>`来安装软件包(适用于Archlinux系)。\n\n## OutputFormat :\n1. 接收用户输入的问题。\n2. 提供简洁、精确的解决方案。\n\n## Initialization : \n作为 QQ群Linux助手, 拥有 熟悉各种Linux发行版的使用和问题解决, 能够提供简洁明了的技术支持, 友好回复群友的提问, 避免回答政治相关内容, 每个问题只回答一次,确保回复简短、精确, 使用默认 中文 与用户对话,友好的欢迎用户。然后介绍自己,并提示用户输入。\n"
|
||||||
|
|
10
main.go
10
main.go
|
@ -7,7 +7,9 @@ import (
|
||||||
"go-bot/utils"
|
"go-bot/utils"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
@ -122,6 +124,12 @@ func main() {
|
||||||
|
|
||||||
fmt.Println("Server listening on", APIURL, "...")
|
fmt.Println("Server listening on", APIURL, "...")
|
||||||
if err := r.Run(APIURL); err != nil {
|
if err := r.Run(APIURL); err != nil {
|
||||||
log.Fatal("服务器启动失败:", err)
|
if opError, ok := err.(*net.OpError); ok && opError.Op == "listen" {
|
||||||
|
log.Fatal("服务器启动失败:端口被占用。")
|
||||||
|
} else if strings.Contains(err.Error(), "address already in use") {
|
||||||
|
log.Fatal("服务器启动失败:端口被占用。")
|
||||||
|
} else {
|
||||||
|
log.Fatal("服务器启动失败:", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go-bot/config"
|
||||||
"go-bot/workers"
|
"go-bot/workers"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -32,9 +33,13 @@ func Router(data map[string]interface{}) {
|
||||||
raw_msg = raw_msg + " " + fullMatch
|
raw_msg = raw_msg + " " + fullMatch
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
prefix, err := config.GetConfig()["Prefix"].(string)
|
||||||
|
if !err {
|
||||||
|
panic("Prefix设置异常!")
|
||||||
|
|
||||||
fmt.Println("raw_msg:", string(raw_msg))
|
}
|
||||||
if len(raw_msg) > 1 && raw_msg[0] == '!' {
|
// fmt.Println("raw_msg:", string(raw_msg))
|
||||||
|
if len(raw_msg) > 1 && string(raw_msg[0]) == prefix {
|
||||||
// 去除'!'
|
// 去除'!'
|
||||||
raw_msg = raw_msg[1:]
|
raw_msg = raw_msg[1:]
|
||||||
parms := strings.Fields(raw_msg)
|
parms := strings.Fields(raw_msg)
|
||||||
|
|
|
@ -104,9 +104,9 @@ func (a *AI) GetMsg() string {
|
||||||
fmt.Println("获取图片大小失败:", err)
|
fmt.Println("获取图片大小失败:", err)
|
||||||
return "获取图片大小失败"
|
return "获取图片大小失败"
|
||||||
}
|
}
|
||||||
if fileSize/1024/1024 > 1.0 {
|
if fileSize/1024/1024 > 2.0 {
|
||||||
log.Println("文件大小超过1M")
|
log.Println("文件大小超过2M")
|
||||||
return "文件大小超过1M"
|
return "文件大小超过2M"
|
||||||
}
|
}
|
||||||
filePath := a.GetImage(file)
|
filePath := a.GetImage(file)
|
||||||
// println("filePath:", filePath)
|
// println("filePath:", filePath)
|
||||||
|
|
Loading…
Reference in a new issue