diff --git a/README.md b/README.md index 08f2582..e3549e6 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,96 @@ - [x] 搜索B站视频 - [ ] 今日老婆 - [x] 群老婆 +- [x] 鲁迅说 +- [x] 喜报、悲报 +- [x] 查询cf比赛 +- [x] 日报 +- [x] 查询热门轻小说 +- [x] 获取新番信息 +#### 待办 +- **功能描述**: 用户可以添加、查询和删除个人待办事项。 +- **指令**: `/待办`, `/待办查询`, `/新建待办`, `/删除待办` + +#### 天气 +- **功能描述**: 提供当前天气信息。 +- **指令**: `/天气` + +#### 今日运势 +- **功能描述**: 提供用户的今日运势。 +- **指令**: `/今日运势` + +#### 今日塔罗 +- **功能描述**: 提供一张随机的塔罗牌及其解读。 +- **指令**: `/今日塔罗` + +#### 点歌 +- **功能描述**: 通过网易云音乐API点歌,并将音乐文件以QQ语音的形式发送至群聊。 快点一首你喜欢的歌给群友听吧! +- **指令**: `/点歌` +- **注意事项**: + - 使用网易云点歌需要另外安装依赖: npm install crypto-js + - 初次使用需要扫码登录网易云音乐。 + - 若cookie过期,需要删除 `cloud_music_cookies.cookie` 文件并重新扫码登录。 + +#### 图 +- **功能描述**: 返回图库中的图片。 +- **指令**: `/图` + +#### 摸摸头 +- **功能描述**: 与机器人进行互动,发送“摸摸头”的回复。 +- **指令**: `/摸摸头` + +#### 接入语言模型 +- **功能描述**: 使用第三方大语言模型进行交互。 +- **指令**: `/开启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` + +#### 日报 +- **功能描述**: 提供每日的新闻或信息。 +- **指令**: `/日报` + +#### 查询热门轻小说 +- **功能描述**: 查询当前热门的轻小说。 +- **指令**: `/轻小说` + +#### 获取新番信息 +- **功能描述**: 获取当季动漫的新番信息和预期新番上线信息。 +- **指令**: `/本季新番`, `/新番观察` + +
+好的,我会对您提供的内容进行优化,使其更加清晰和易于理解。以下是优化后的版本:
@@ -102,7 +191,7 @@ DRIVER=~fastapi+~httpx+~websockets QQ_IS_SANDBOX=false -QQ_BOTS=' +QQ_BOTS=" [ { "id": "xxx", @@ -114,7 +203,7 @@ QQ_BOTS=' "use_websocket": true } ] -' +" ``` 分别在id、token、secret处填写你的机器人ID,机器人Token和Apple Secret,需从[QQ开放平台](https://q.qq.com/)获取。 @@ -132,7 +221,9 @@ python bot.by
-### 🗒️三、项目结构 +当然可以!以下是根据您提供的文件内容整理后的项目结构: + +### 🗒️ 三、项目结构 ``` SanYeCao-Nonebot:. @@ -151,44 +242,207 @@ SanYeCao-Nonebot:. │ └─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 - │ └─test + │ ├─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目录中,启动即可使用 - 部分插件通过调用其它目录中的方法完成其功能 @@ -201,247 +455,127 @@ SanYeCao-Nonebot:. 机器人的指令列表在[src/plugins/check.py](src/plugins/check.py)中,有如下指令: ```python -menu = ['/今日运势','/今日塔罗','/图','/点歌','/摸摸头','/群老婆','/今日老婆', "/开启ai","/关闭ai","/角色列表","/添加人设", "/更新人设", "/删除人设", "/切换人设", "/管理员注册",'/待办', '/test','/天气','我喜欢你', "❤", "/待办查询", "/新建待办", "/删除待办" ,"/cf","/B站搜索", "/BV搜索", "/喜报", "/悲报", "/luxun","/鲁迅说","/奶龙", "/repo", "/info", "/menu"] +menu = ["/重启","/今日运势","/今日塔罗","/图","/日报","/点歌","/摸摸头","/群老婆","/今日老婆", "/开启ai","/关闭ai", + "/角色列表","/添加人设", "/更新人设", "/删除人设", "/切换人设", "/管理员注册","/待办", "/test","/天气", + "我喜欢你", "❤", "/待办查询", "/新建待办", "/删除待办" ,"/cf","/B站搜索", "/BV搜索", "/喜报", "/悲报", + "/luxun","/鲁迅说", "/奶龙", "/repo", "/info", "/menu", "/轻小说","/本季新番","/新番观察"] ``` 输入其它指令机器人会回复听不懂哦。
-#### ☄️待办、摸一摸、今日运势的初始化 -机器人中已经配置好数据库初始化的脚本。若您是第一次启动机器人。会在项目根目录下自动创建chat_bot.db(数据库文件) -chat_bot.db中包括11张表: +### 🎨 功能补充说明 -```sql ---摸一摸文本数据 -qr_touch ---摸一摸日志 -qr_touch_log +#### 📄 需要替换的文件 ---今日运势文本数据 -qr_fortune ---今日运势日志,存储该用户是否已经查询过运势 -qr_fortune_log - ---塔罗牌 -major_arcana ---塔罗牌使用 日志 -major_arcana_log - ---用户表 -user_list ---用户待办表 -user_todo_list - ---群老婆 -wife - ---所有模型设定 -chat_role ---群聊AI状态表 -group_chat_role -``` - -数据库相关脚本存放在 [src/clover_sqlite/models](src/clover_sqlite/models) 目录下。我们使用Tortoise ORM管理数据库。 - -每次启动机器人,程序会自动检查上述11张表是否存在,有表缺失则会在数据库中自动创建对应的表。 - -对已存在的表不做处理。 - -
- -#### ⛅从图床发送图片 - -##### 介绍: - -机器人支持[SMMS图床](https://sm.ms/)、[聚合图床](https://www.superbed.cn/)、从**本地**发送图片。 - -获取图片的方法统一编写在[src/clover_image/get_image.py](src/clover_image/get_image.py)下。 - -##### 使用: - -首先找到[src/configs/api_config_example.py](src/configs/api_config_example.py) +首先找到 [**src/configs/api_config_example.py**](src/configs/api_config_example.py) 文件,并根据需要替换以下配置项: ```python - -app_id="" -bot_account= "" +app_id = "" +bot_account = "" """ 图床配置 """ # SMMS图床相关配置 -smms_token= "" # sm.ms图床的token -smms_image_upload_history= "https://sm.ms/api/v2/upload_history" # sm.ms图床获取上传图片历史API地址 +smms_token = "" # sm.ms图床的token +smms_image_upload_history = "https://sm.ms/api/v2/upload_history" # sm.ms图床获取上传图片历史API地址 # 聚合图床相关配置 -ju_he_token= "" # 聚合图床的token -ju_he_image_list= "https://api.superbed.cn/timeline" # 聚合图床获取上传图片历史API地址 +ju_he_token = "" # 聚合图床的token +ju_he_image_list = "https://api.superbed.cn/timeline" # 聚合图床获取上传图片历史API地址 + +""" +AI +""" +admin_password = "123456" # 默认注册管理员密码 +# 图灵机器人相关配置 +v3url = "https://api.vveai.com/v1/chat/completions" +v3key = "" +# DeepSeek相关配置 +deepseek_url = "https://api.deepseek.com" +deepseek_key = "" + +""" +Wenku8账号 +""" +wenku8_username = "" +wenku8_password = "" + +""" +多米HTTP代理api +""" +proxy_api = "" ``` -将你的机器人app_id,smms图床Token和聚合图床Token替换上述\(可以根据自身需求选填) -之后在[get_image.py](src/clover_image/get_image.py)中找到对应的方法,根据自身需求调用。 +将你的 `app_id` 和 `smms_token` 替换为实际值(可以根据自身需求选填),然后将文件重命名为 **api_config.py**。
-#### 🎵使用网易云API实现点歌 +#### 🎵 使用网易云API实现点歌 -##### 介绍: - -机器人支持在线点歌,将音乐文件以QQ语音的形式发送至群聊。 - -快点一首你喜欢的歌给群友听吧! - -
- -##### 使用: - -若您是初次使用点歌功能,在群聊中@机器人后,机器人会提示: +若您是初次使用点歌功能,在群聊中 @ 机器人后,机器人会提示: ``` 登录失效,请联系管理员进行登录 ``` -此时会在[src/music](src/clover_music)目录下生成一张qrcode.png,您需要使用手机端网易云音乐**扫码**该二维码,登录您的网易云账号。 -
+此时会在 [**src/music**](src/clover_music) 目录下生成一张 **qrcode.png**,您需要使用手机端网易云音乐扫码该二维码,登录您的网易云账号。 -🚨注意:我们使用cookie存储用户登录信息,所以会存在登录过期的情况,若cookie过期,机器人会提示 +注意: 我们使用 cookie 存储用户登录信息,所以会存在登录过期的情况。若 cookie 过期,机器人会提示: ``` 歌曲音频获取失败:登录信息失效。 ``` -此时需要**删除**[cloud_music_cookies.cookie](cloud_music_cookies.cookie)并重新扫码登录。 + +此时需要 **删除** [**cloud_music_cookies.cookie**](cloud_music_cookies.cookie) 并重新扫码登录。
-#### 💡使用第三方语言模型 +#### ✋ 管理员身份认证 -打开[src/configs/api_config_example.py](src/configs/api_config_example.py),找到 +##### 介绍 + +机器人现已更新管理员机制,机器人管理员可以控制是否使用第三方大语言模型进行交互。后续其它功能更新中。 + +##### 使用 + +###### 1. 注册为管理员 + +在 [**src/configs/api_config_example.py**](src/configs/api_config_example.py) 内,找到: ```python -""" -AI -""" -admin_password= "123456" # 默认注册管理员密码 -# 图灵机器人相关配置 -v3url= "https://api.vveai.com/v1/chat/completions" -v3key= "" -# DeepSeek相关配置 -deepseek_url= "https://api.deepseek.com" -deepseek_key= "" +admin_password = "123456" # 默认注册管理员密码 ``` -将你自己的deepseek url和api填入,并将文件重命名为api_config.py。 - -再设置一个管理员认证密码,详见[下一节](#admin_control)。 - -
- -#### ✋实现管理员身份认证 - -##### 介绍: - -机器人现已更新管理员机制,机器人管理员可以控制是否使用第三方大语言模型进行交互。 - -后续其它功能更新中。 - -##### 使用: - -###### 1.注册为管理员 - -在[**src/configs/api_config_example.py**](src/configs/api_config_example.py)内,找到 - -```python -admin_password= "123456" # 默认注册管理员密码 -``` 可以更改为自己的密码。 -
- -设置好密码后,在qq中at你的机器人,格式为 +设置好密码后,在 QQ 中 at 你的机器人,格式为: ``` @<机器人名称> /管理员注册 <密码> ``` -例如,对三叶草进行管理员注册时,假如密码是123456,需要 + +例如,对三叶草进行管理员注册时,假如密码是 123456,需要: ``` @三叶草 /管理员注册 123456 ``` -
-🚨注意:管理员密码请不要泄露给其他人,建议定期更换密码。 +注意: 管理员密码请不要泄露给其他人,建议定期更换密码。 -
+注册成为管理员之后,你的 `member_openid` 将会被保存至 `chatbot.db` 下的 `admin_list` 表中。 -注册成为管理员之后,你的member_openid将会被保存至chatbot.db下的admin_list表中。 +希望这些优化后的说明能更好地帮助您!如果有任何进一步的需求或修改,请告诉我。 -
-###### 2.控制语言模型是否可用 -在已经是管理员的情况下,你可以对机器人发送 - -``` -@<机器人名称> /开启ai -``` - -实现对AI功能的开关。若此前AI功能处于关闭状态,则机器人会回复 - -``` -成功开启语言模型对话功能。一起来聊天吧~ -``` - -表示AI功能启动成功。反之则回复 - -``` -成功关闭语言模型对话功能。 -``` - -AI功能为每个群单独启动,默认关闭。 - -
- -#### 🔆CodeForces比赛查询 - -机器人通过访问CodeForces官方API实现获取CF近期比赛。 - -对机器人发送 - -``` -/cf -``` - -可查询近期比赛。 - -
- -#### 📺B站视频搜索 - -##### 介绍: - -机器人使用哔哩哔哩视频API,可将视频文件发送至群聊。 - -指令: - -``` -@<机器人名称> /BV搜索 -``` - -🚨注意:由于QQ的限制,官方bot无法发送时长超出2分钟的视频。 - -##### 使用: - -您需要首先确保自己的电脑安装了[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库完成,下载可能较慢,需要稍等一会儿。 diff --git a/src/plugins/check.py b/src/plugins/check.py index e81cb15..6e07697 100644 --- a/src/plugins/check.py +++ b/src/plugins/check.py @@ -8,15 +8,15 @@ from src.clover_openai import ai_chat from src.clover_sqlite.models.chat import GroupChatRole from src.clover_sqlite.models.user import UserList -menu = ['/重启','/今日运势','/今日塔罗','/图','/日报','/点歌','/摸摸头','/群老婆','/今日老婆', "/开启ai","/关闭ai","/角色列表","/添加人设", "/更新人设", "/删除人设", "/切换人设", "/管理员注册", - '/待办', '/test','/天气','我喜欢你', "❤", "/待办查询", "/新建待办", "/删除待办" ,"/cf","/B站搜索", "/BV搜索", "/喜报", "/悲报", "/luxun","/鲁迅说", - "/奶龙", "/repo", "/info", "/menu", "/轻小说",'/本季新番','/新番观察'] +menu = ["/重启","/今日运势","/今日塔罗","/图","/日报","/点歌","/摸摸头","/群老婆","/今日老婆", "/开启ai","/关闭ai","/角色列表","/添加人设", "/更新人设", "/删除人设", "/切换人设", "/管理员注册", + "/待办", "/test","/天气","我喜欢你", "❤", "/待办查询", "/新建待办", "/删除待办" ,"/cf","/B站搜索", "/BV搜索", "/喜报", "/悲报", "/luxun","/鲁迅说", + "/奶龙", "/repo", "/info", "/menu", "/轻小说","/本季新番","/新番观察"] -send_menu = ["/开启ai","/关闭ai","/角色列表","/添加人设", "/更新人设", "/删除人设", "/切换人设", "/管理员注册", '/待办', '/test', '我喜欢你', "❤", "/menu"] +send_menu = ["/开启ai","/关闭ai","/角色列表","/添加人设", "/更新人设", "/删除人设", "/切换人设", "/管理员注册", "/待办", "/test", "我喜欢你", "❤", "/menu"] async def check_value_in_menu(message: MessageEvent) -> bool: value = message.get_plaintext().strip().split(" ") - if hasattr(message, 'group_openid'): # 是否有属性group_openid,即是否为群聊消息 + if hasattr(message, "group_openid"): # 是否有属性group_openid,即是否为群聊消息 group_id = message.group_openid else: group_id = "C2C" # 非群聊消息,存为c2c @@ -32,7 +32,7 @@ check = on_message(rule=to_me() & Rule(check_value_in_menu) ,block=True, priorit @check.handle() async def handle_function(message: MessageEvent): - if hasattr(message, 'group_openid'): + if hasattr(message, "group_openid"): group_openid = message.group_openid else: group_openid = "C2C" @@ -46,11 +46,11 @@ async def handle_function(message: MessageEvent): await check.finish(message=Message(random.choice(text_list))) text_list = [ - "是什么呢?猫猫没有识别到,喵~"+'\n'+"(๑>ڡ<)☆ 给个准信,别让我瞎猜", - "是想让我干嘛呢?猫猫一头雾水,喵~" + '\n' + "(๑•̀ㅂ•́)و✧ 直接跟我说,别这么含蓄,喵~", - "是啥意思呀?猫猫完全没搞懂,喵~" + '\n' + "(๑・.・๑) 别折腾我啦,说明白,喵~", - "是特殊信号?猫猫听不懂,喵~" + '\n' + "(๑・̀︶・́)و 下个明确指令,喵~", - "难道是新指令?猫猫一脸茫然,喵~" + '\n' + "(๑>ڡ<)☆ 说详细点,别这么隐晦,喵~", + "是什么呢?猫猫没有识别到,喵~"+"\n"+"(๑>ڡ<)☆ 给个准信,别让我瞎猜", + "是想让我干嘛呢?猫猫一头雾水,喵~" + "\n" + "(๑•̀ㅂ•́)و✧ 直接跟我说,别这么含蓄,喵~", + "是啥意思呀?猫猫完全没搞懂,喵~" + "\n" + "(๑・.・๑) 别折腾我啦,说明白,喵~", + "是特殊信号?猫猫听不懂,喵~" + "\n" + "(๑・̀︶・́)و 下个明确指令,喵~", + "难道是新指令?猫猫一脸茫然,喵~" + "\n" + "(๑>ڡ<)☆ 说详细点,别这么隐晦,喵~", ] get_menu = on_command("menu", rule=to_me(), priority=10, block=True)