# SanYeCao-Nonebot
## 📚介绍
🌟三叶草bot 2.0🌟
🚀使用Nonebot2+官方API搭建的QQ群聊机器人🚀

## 🔖亮点
- 基于[Nonebot2](https://nonebot.dev/),使用[QQ官方API](https://bot.q.qq.com/wiki/),更稳定、高效✨
- 多种个性化用法,如天气、每日运势(~~机器人时尚单品~~)、点歌、编辑个人待办等,后续功能开发中🔧
- 使用轻量化数据库sqlite管理数据,实现为每位用户单独存取数据🔍
- 接入第三方大语言模型,实现AI交互💡
###### 我是菜比🏳️🏳️,纯新手写的python 问题肯定多 ,若有兴趣可以帮忙一起完善功能
###### QQ交流群:[710101225](https://qm.qq.com/q/AQyepzKUJq)
- ↑sly是代码领域大神, 👈 ClovertaTheTrilobita 写的
## 🌈目前功能:
- [x] 待办
- [x] 天气
- [x] 今日运势
- [x] 今日塔罗
- [x] 点歌(网易云 需扫码登录 在 src\music 目录下)
- [x] 图(返回图库中的图片)
- [x] 摸摸头
- [x] 接入语言模型
- [x] 搜索B站视频
- [ ] 今日老婆
- [x] 群老婆
- [x] 鲁迅说
- [x] 喜报、悲报
- [x] 查询cf比赛
- [x] 日报
- [x] 查询热门轻小说
- [x] 获取新番信息
- [x] 绝对色感
#### 待办
- **功能描述**: 用户可以添加、查询和删除个人待办事项。
- **指令**: `/待办`, `/待办查询`, `/新建待办`, `/删除待办`
#### 天气
- **功能描述**: 提供当前天气信息。
- **指令**: `/天气`
#### 今日运势
- **功能描述**: 提供用户的今日运势。
- **指令**: `/今日运势`
#### 今日塔罗
- **功能描述**: 提供一张随机的塔罗牌及其解读。
- **指令**: `/今日塔罗`
#### 点歌
- **功能描述**: 通过网易云音乐API点歌,并将音乐文件以QQ语音的形式发送至群聊。 快点一首你喜欢的歌给群友听吧!
- **指令**: `/点歌`
- **注意事项**:
- 使用网易云点歌需要另外安装依赖:Node.js 和在目录下输入 npm install crypto-js
- 初次使用或者提示登录失效需要需扫码登录 (在 src\music 目录下)。
#### 图
- **功能描述**: 返回图库中的图片。
- **指令**: `/图`
#### 摸摸头
- **功能描述**: 与机器人进行互动,发送“摸摸头”的回复。
- **指令**: `/摸摸头`
#### 接入语言模型
- **功能描述**: 使用第三方大语言模型进行交互。
- **指令**: `/开启ai`, `/关闭ai` `/角色列表`,`/添加人设`, `/更新人设`, `/删除人设`, `/切换人设`, `/管理员注册`
- **注意事项**:
- 需要管理员身份认证。
- AI功能为每个群单独启动,默认关闭。
#### 搜索B站视频
- **功能描述**: 通过BV号搜索B站视频,并将视频文件发送至群聊。
- **指令**: `/BV搜索 `
- **注意事项**:
- 🚨注意: 由于QQ的限制,官方bot无法发送文件大于10M。
- 需要安装 Chrome Driver。您需要首先确保自己的电脑安装了[Chrome Driver](https://developer.chrome.google.cn/docs/chromedriver?hl=zh-cn)。
- 若没安装过,请参考教程:[chromedriver下载与安装方法,亲测可用-CSDN博客](https://blog.csdn.net/zhoukeguai/article/details/113247342)
- 程序第一次启动时,会获取B站的cookie保存至本地,使用selenium库完成,下载可能较慢,需要稍等一会儿。
#### 今日老婆
- **功能描述**: 提供今日老婆的信息。
- **指令**: `/今日老婆`
- **状态**: 待开发
#### 群老婆
- **功能描述**: 提供群内成员的老婆信息。
- **指令**: `/群老婆`
#### 鲁迅说
- **功能描述**: 提供鲁迅的经典语录。
- **指令**: `/鲁迅说`,`/luxun`
#### 喜报、悲报
- **功能描述**: 提供喜报和悲报的信息。
- **指令**: `/喜报`, `/悲报`
#### 查询cf比赛
- **功能描述**: 通过CodeForces官方API查询近期比赛。
- **指令**: `/cf`
#### 日报
- **功能描述**: 提供每日的新闻或信息。
- **指令**: `/日报`
#### 查询热门轻小说
- **功能描述**: 查询当前热门的轻小说。
- **指令**: `/轻小说`
#### 获取新番信息
- **功能描述**: 获取当季动漫的新番信息和预期新番上线信息。
- **指令**: `/本季新番`, `/新番观察`
#### 绝对色感小游戏
- **功能描述**: 返回一个绝对色感小游戏,玩家需要猜测一个颜色,并输入颜色代码。
- **指令**: `/绝对色感 初级、中级、高级、超神`
## 🛠️使用
- 关于Nonebot完整部署使用方法,请查看[官方文档](https://nonebot.dev/)
### ⚙️一、环境配置
**我们强烈建议您使用虚拟环境**,若您使用Anaconda发行版,请在终端输入
```powershell
conda create --name chatbot python=3.11
```
创建conda环境。
之后
```powershell
conda activate chatbot
```
以启用您刚刚创建的虚拟环境。
你也可以将上述 *chatbot* 更换为你喜欢的名字。
🚫注意:机器人不支持
的发行版,推荐使用
# 安装所需依赖。
此机器人运行所需依赖已全部打包至***requirements.txt***,您只需回到项目根目录
在终端输入:
```powershell
pip install -r requirements.txt
```
### 🎵 网易云点歌依赖安装
#### 1. 安装 Node.js 环境
- **官网下载**:访问 [Node.js 官网](https://nodejs.org/) 下载 LTS 版本(推荐 v18.x+)
- **安装注意**:
- 勾选 `Add to PATH` 选项(自动配置环境变量)
- 完成安装后重启终端使配置生效
验证 Node.js 版本
- **对于Debian/Ubuntu**
- 你可以直接用以下命令安装
```shell
sudo apt install nodejs npm
```
#### 2. 验证安装结果
```powershell
npm -v
```
#### 3. 安装 crypto-js 库
在项目根目录执行:
```powershell
npm install crypto-js
```
### 使用BV搜索B站视频需要另外安装:
**谷歌驱动安装:**[Chrome Driver](https://googlechromelabs.github.io/chrome-for-testing/)
安装教程:[chromedriver下载与安装方法,亲测可用-CSDN博客](https://blog.csdn.net/zhoukeguai/article/details/113247342)
### ✒️二、配置所需文件
在一切开始前,你需要将项目根目录下的[example.env.prod](example.env.prod)文件更名为.env.prod,这是机器人的账号配置文件。
我加了神必小代码,如果你没配置这两个配置文件是启动不起来的,因为有~~海量~~个例显示,很多人不看README就想当然地启动bot,并在群里问为什么会有报错(
```
DRIVER=~fastapi+~httpx+~websockets
QQ_IS_SANDBOX=false
QQ_BOTS="
[
{
"id": "xxx",
"token": "xxx",
"secret": "xxx",
"intent": {
"c2c_group_at_messages": true
},
"use_websocket": true
}
]
"
```
分别在id、token、secret处填写你的机器人ID,机器人Token和Apple Secret,需从[QQ开放平台](https://q.qq.com/)获取。
#### 📄 需要修改的配置文件
首先找到 [**example.config.yaml**](example.config.yaml) ,将其重命名为config.yaml
并根据需要替换以下配置项:
```yaml
#######################################
# 如果您已经配置好了,请将此字段改为 ‘False’#
#######################################
default: "True" # 配置完成后,请将这个字段改为 False
bot:
app_id: ""
bot_account: ""
############################
# 三叶草邮箱发信设置 #
############################
mail:
google:
enabled: 'False'
smtp_server: 'smtp.gmail.com'
email: 'xxxxxx@gmail.com'
password: '1234567891234567' # 16 位应用码
qq:
enabled: 'True'
smtp_server: 'smtp.qq.com'
email: 'xxxxxxxx@qq.com'
password: '1234567891234567' # qq邮箱应用码
server: # 自建服务器
enabled: 'False'
smtp_server: 'mail.example.com' # 自建邮局域名
email: 'user_name@example.com'
password: '123456'
port: '587'
############################
# 三叶草图床设置 #
############################
image_hosting:
smms: # sm.ms图床
enabled: 'False'
token: ''
smms_image_upload_history: "https://sm.ms/api/v2/upload_history"
superbed: # 聚合图床
enabled: 'False'
token: ''
superbed_image_list: "https://api.superbed.cn/timeline"
random_pic: "https://image.anosu.top/pixiv/json"
animetrace:
url: "https://api.animetrace.com/v1/search"
############################
# 三叶草AI设置 #
############################
ai:
admin:
password: '123456'
api:
v3:
enabled: "False"
url: "https://api.vveai.com/v1/chat/completions"
key: ''
deepseek:
enabled: "False"
url: "https://api.deepseek.com"
key: ''
silicon_flow:
enabled: "True"
url: "https://api.siliconflow.cn/v1/chat/completions"
model: "Pro/deepseek-ai/DeepSeek-V3"
key: ''
############################
# 其他时尚小功能 #
############################
wenku8:
# 通过wenku8.com获取最新轻小说咨询
# 此功能需要启用代理
enabled: 'False'
user_name: ''
password: ''
proxy:
# 目前代码中仅支持多米HTTP代理
enabled: 'False'
key: ''
qr:
# 二维码生成api
url: "https://api.qrserver.com/v1/create-qr-code/"
size: "200x200"
codeforces:
# 查询codeforces比赛列表
key: ""
secret: ""
```
🚫注意: 将你的 `app_id` 和 `smms_token` 替换为实际值(可以根据自身需求选填)
### 📍三、启动机器人
在项目根目录中,找到 *bot.py* ,在终端输入
```powershell
python bot.py
```
或者选择编译器启动,便可以启动机器人。
### 🗒️ 四、项目结构
```
SanYeCao-Nonebot:.
│ .gitignore
│ bot.py
│ chat_bot.db
│ example.env.prod
│ package-lock.json
│ package.json
│ pyproject.toml
│ README.md
│ requirements.txt
│
├─node_modules
│ └─crypto-js
│
└─src
├─clover_image
│ └─get_image.py
│
├─clover_music
│ ├─cloud_music
│ │ ├─cloud_music_cookies.cookie
│ │ └─qrcode.png
│ └─netease_music
│
├─clover_openai
│ ├─api_config_example.py
│ └─api_config.py
│
├─clover_sqlite
│ ├─data_init
│ │ ├─init_tables.py
│ │ └─...
│ └─models
│ ├─models.py
│ └─...
│
├─clover_videos
│ └─billibili
│ ├─bilibili_search.py
│ └─...
│
├─configs
│ ├─path_config.py
│ ├─api_config_example.py
│ └─utils
│ ├─utils.py
│ └─...
│
├─plugins
│ ├─check.py
│ ├─todo.py
│ ├─weather.py
│ ├─fortune.py
│ ├─tarot.py
│ ├─music.py
│ ├─image.py
│ ├─petpet.py
│ ├─openai.py
│ ├─bilibili.py
│ ├─news.py
│ ├─light_novel.py
│ ├─anime.py
│ └─...
│
└─resources
├─font
│ ├─font.ttf
│ └─...
├─image
│ ├─codeforces
│ │ ├─image1.png
│ │ └─...
│ ├─github_repo
│ │ ├─image2.png
│ │ └─...
│ ├─good_bad_news
│ │ ├─image3.png
│ │ └─...
│ ├─MaoYuNa
│ │ ├─image4.png
│ │ └─...
│ ├─rua
│ │ ├─image5.png
│ │ └─...
│ ├─tarot
│ │ ├─sideTarotImages
│ │ │ ├─image6.png
│ │ │ └─...
│ │ └─TarotImages
│ │ ├─image7.png
│ │ └─...
│ └─who_say
│ ├─image8.png
│ └─...
├─log
│ ├─bot.log
│ └─...
├─temp
│ ├─temp_file1.tmp
│ └─...
└─videos
├─video1.mp4
└─...
```
### 详细说明
- **根目录文件**
- `.gitignore`: 忽略文件配置。
- `bot.py`: 机器人启动文件。
- `chat_bot.db`: SQLite 数据库文件。
- `example.env.prod`: 示例环境配置文件。
- `package-lock.json`: npm 依赖锁定文件。
- `package.json`: npm 依赖配置文件。
- `pyproject.toml`: Python 项目配置文件。
- `README.md`: 项目说明文档。
- `requirements.txt`: Python 依赖配置文件。
- **node_modules**
- `crypto-js`: 加密库。
- **src 目录**
- **clover_image**
- `get_image.py`: 图片获取模块。
- **clover_music**
- **cloud_music**
- `cloud_music_cookies.cookie`: 网易云音乐 cookie 文件。
- `qrcode.png`: 网易云音乐扫码登录二维码。
- **netease_music**
- 网易云音乐相关模块。
- **clover_openai**
- `api_config_example.py`: 示例 API 配置文件。
- `api_config.py`: 实际 API 配置文件。
- **clover_sqlite**
- **data_init**
- `init_tables.py`: 数据库初始化脚本。
- 其他初始化脚本。
- **models**
- `models.py`: 数据库模型定义。
- 其他模型定义文件。
- **clover_videos**
- **bilibili**
- `bilibili_search.py`: B站视频搜索模块。
- 其他 B站相关模块。
- **configs**
- `path_config.py`: 路径配置文件。
- `api_config_example.py`: 示例 API 配置文件。
- **utils**
- `utils.py`: 工具函数。
- 其他工具函数文件。
- **plugins**
- `check.py`: 指令检查模块。
- `todo.py`: 待办事项模块。
- `weather.py`: 天气模块。
- `fortune.py`: 运势模块。
- `tarot.py`: 塔罗牌模块。
- `music.py`: 点歌模块。
- `image.py`: 图片模块。
- `petpet.py`: 摸摸头模块。
- `openai.py`: AI 模块。
- `bilibili.py`: B站视频模块。
- `news.py`: 日报模块。
- `light_novel.py`: 轻小说模块。
- `anime.py`: 新番信息模块。
- 其他插件模块。
- **resources**
- **font**
- `font.ttf`: 字体文件。
- 其他字体文件。
- **image**
- **codeforces**
- `image1.png`: 图片文件。
- 其他图片文件。
- **github_repo**
- `image2.png`: 图片文件。
- 其他图片文件。
- **good_bad_news**
- `image3.png`: 图片文件。
- 其他图片文件。
- **MaoYuNa**
- `image4.png`: 图片文件。
- 其他图片文件。
- **rua**
- `image5.png`: 图片文件。
- 其他图片文件。
- **tarot**
- **sideTarotImages**
- `image6.png`: 图片文件。
- 其他图片文件。
- **TarotImages**
- `image7.png`: 图片文件。
- 其他图片文件。
- **who_say**
- `image8.png`: 图片文件。
- 其他图片文件。
- **log**
- `bot.log`: 日志文件。
- 其他日志文件。
- **temp**
- `temp_file1.tmp`: 临时文件。
- 其他临时文件。
- **videos**
- `video1.mp4`: 视频文件。
- 其他视频文件。
### 📦三、插件
- 插件的目录位于src/plugins中
- 插件的配置文件位于src/configs中
- 基本插件存储在plugins目录中,启动即可使用
- 部分插件通过调用其它目录中的方法完成其功能
- 部分插件需要调用第三方API,需要在配置文件中填写相关配置
### 🎈五、更多功能
#### 📲所有指令
机器人的指令列表在[src/plugins/check.py](src/plugins/check.py)中,有如下指令:
```python
menu = ["/重启","/今日运势","/今日塔罗","/图","/日报","/点歌","/摸摸头","/群老婆","/今日老婆", "/开启ai","/关闭ai",
"/角色列表","/添加人设", "/更新人设", "/删除人设", "/切换人设", "/管理员注册","/待办", "/test","/天气",
"我喜欢你", "❤", "/待办查询", "/新建待办", "/删除待办" ,"/cf","/B站搜索", "/BV搜索", "/喜报", "/悲报",
"/luxun","/鲁迅说", "/奶龙", "/repo", "/info", "/menu", "/轻小说","/本季新番","/新番观察"]
```
输入其它指令机器人会回复听不懂哦。
### 🎨 功能补充说明
#### 🎵 使用网易云API实现点歌
若您是初次使用点歌功能,在群聊中 @ 机器人后,机器人会提示:
```
登录失效,请联系管理员进行登录
```
此时会在 [**src/music**](src/clover_music) 目录下生成一张 **qrcode.png**,您需要使用手机端网易云音乐扫码该二维码,登录您的网易云账号。
注意: 我们使用 cookie 存储用户登录信息,所以会存在登录过期的情况。若 cookie 过期,机器人会提示:
```
歌曲音频获取失败:登录信息失效。
```
此时需要并重新扫码登录。 [cloud_music.py](src/plugins/cloud_music.py) 内有控制是否发送到qq,详情请看 Line:33
#### ✋ 管理员身份认证
##### 介绍
机器人现已更新管理员机制,机器人管理员可以控制是否使用第三方大语言模型进行交互。后续其它功能更新中。
##### 使用
###### 1. 注册为管理员
在 [**config.yaml**](config.yaml) 内,找到:
```python
ai:
admin:
password: '123456'
```
可以更改为自己的密码。
设置好密码后,在 QQ 中 at 你的机器人,格式为:
```
@<机器人名称> /管理员注册 <密码>
```
例如,对三叶草进行管理员注册时,假如密码是 123456,需要:
```
@三叶草 /管理员注册 123456
```
注意: 管理员密码请不要泄露给其他人,建议定期更换密码。
注册成为管理员之后,你的 `member_openid` 将会被保存至 `chatbot.db` 下的 `admin_list` 表中。