简介

说明

Cirno(琪露诺)是由社会易姐QwQ开发的qq机器人。这是一个事件响应型机器人,可响应群聊消息、好友私信消息,由mirai强力驱动,自动化消息处理部分由python语言完成,
目前整个系统部署在docker上。

声明:本qq bot不是产品,本qq bot的开发及使用旨在学习相关技术和方便群友

关于名字

本项目名以及图标来自东方Project中的角色琪露诺(Cirno)

更新日志

猛戳展开

2021-03-12 开始搭建主服务
2021-03-13 完成事件响应网关和权限管理器
2021-03-13 业务模块:帮助一言疫情速报归属地查询Q绑查询答题统计完成
2021-03-14 业务模块桌面截图完成
2021-03-15 业务模块系统状态完成
2021-03-19 群事件处理及qq群成员变动广播完成
2021-03-22 业务模块易姐语翻译完成
2021-03-28 业务模块b23短链解析B站视频解析完成
2021-04-10 业务模块身份证号解析完成
2021-04-13 统一异常抛出系统与报错系统完成,答题统计模块升级为爬虫综合统计
2021-04-14 统一消息发送和处理机制
2021-04-18 改用bcc截获并作为消息反馈bot内部事件的异常抛出
2021-04-19 使用graia-saya大规模重构各个模块和模块管理机制,即同时废除事件响应网关和路由式的事件处理机制
2021-04-23 整体程序使用aio套件,并采用mysql连接池,权限管理器重构为独立的设置管理器,添加业务模块今日简报
2021-04-24 为易姐语翻译添加自动识别加密及解密功能
2021-04-25 添加业务模块5000兆円
2021-04-29 添加业务模块东方角色及角色歌查询,并建立相关数据库和收集相关资源
2021-05-02 添加业务模块缩写rua
2021-05-06 添加业务模块Pornhub
2021-05-12 添加业务模块化学方程式配平
2021-05-17 添加业务模块SSTV(虽然效果很差...)
2021-05-20 添加基于mysql的群消息及群聊图片实时记录功能
2021-05-21 添加业务模块XML反射
2021-07-18 添加业务模块saucenao搜图
2021-07-21 添加业务模块头像截取
2021-07-21 全部指令添加!前导符
2021-07-28 添加业务模块藏头诗
2021-08-28 修改截屏模块为“VNC远程截屏”
2021-08-30 修改东方角色数据库为mysql
2021-09-17 添加业务插件NSFW图片识别
2021-09-21 优化bot引用回复消息
2021-09-21 添加业务插件Youtube解析
2021-10-09 模块帮助信息修改为用“!help xxx”统一处理,同时废除--help参数
2021-10-10 将自定义抛出报错与异常上报独立为一个saya模块,并为报错消息加入自动或指定引用消息
2021-10-13 添加业务插件亲亲
2021-10-18 添加业务插件节日提醒
2021-10-25 升级业务模块身份证号解析身份证号解析与生成
2021-10-25 更换参数解析器为argparse
2021-10-26 将设置管理器改为模块及设置管理器并重建权限数据库,以权限等级和功能禁用列表控制,并使用dao和api层
2021-10-28 添加业务插件ping
2021-10-29 添加禁言上报、加群、踢出上报
2021-10-31 添加业务插件复读姬
2021-11-19 升级mah版本为v2.x,更新框架为graia-Ariadne

架构

本bot由graia框架提供支持,采用MVC架构设计

  • graia-ariadne:Graia for mah2框架
  • graia-broadcast:异步事件引擎
  • graia-saya:业务模块管理器
  • graia-scheduler:异步定时器
  • graia-template:消息链模板
    IMG_20210424_231318.jpg

计划实现的功能

以下功能未实现,开发完毕将会被移除
优先级为顺序

猛戳展开

  • Latex渲染
  • 动态模块管理器
  • 瑟图(目前计划图源为K站以及P站)
  • niconico视频解析、B站轻视频解析、B站直播解析、B站专栏解析
  • Pixiv综合解析
  • 增加消息响应风控系统
  • ip归属地查询
  • 型近汉字转写(基于unvcode)
  • 姓名判断性别概率(基于ngender)
  • 群聊词云图生成(基于jieba与wordcloud)
  • 二维码生成(图案 背景 样式自定义)
  • B站追番&UP主更新订阅(指令增删)
  • B站答题查询(题图url或关键字)
  • B站直播订阅广播
  • 早安晚安
  • 网易云id解析
  • qq音乐/网易云解析真实mp3地址(B站api)
  • B站应援团消息同步推送
  • 知乎热榜(排版为图片)

功能

bot的功能分为响应、定时、广播等
指令格式:[ ]为可选参数,< >为必选参数,|为或逻辑,@为在群内at特定的人
注:以上指示符实际使用不需要包含!

基础类

ping

功能:ping机器人,机器人响应,即随机返回提示语或Cirno的表情图一张
权限级别:0
对应模块:ping.py
技术栈:XML、graia-broadcast
参数:无
备注:也可响应“戳一戳”事件,返回对应的提示

指令:

<Cirno|cirno|琪露诺|@Cirno>

帮助

功能:获取机器人的帮助文档(本文档),或获取对应模块的帮助信息
权限级别:0
对应模块:bot_help.py
技术栈:XML、graia-broadcast
参数:
module:模块名
备注:无

指令:

!<help|帮助> [module]

-17277960b4b16622.png

查询系统状态

功能:查询bot运行平台的框架版本、CPU状态、RAM使用情况以及系统运行时间
权限级别:0
对应模块:bot_status.py
技术栈:psutil
参数:无
备注:无

指令:

!status

-1ed99c68c0ba3947.png

截屏

功能:截取bot运行os(Docker下新开的lxde界面)的桌面环境的整个屏幕,并作为图片发送
权限级别:1
对应模块:screen_shot.py
技术栈:vncdotool、scrot
参数:无
备注:无

指令:

!截屏

IMG_20210829_001713.jpg

模块与设置管理器

功能:配置群或用户的权限及设置、设置bot基本参数、管理模块
权限级别:仅主人可用
对应模块:MM
技术栈:MySQL、graia-broadcast、graia-saya
参数:无
备注:无

尚未完工

异常报错器

功能:为其他模块提供统一报错服务,并可以报未知异常以及禁言异常
权限级别:无
对应模块:bot_catch_and_report.py
技术栈:graia-broadcast、traceback
参数:无
备注:错误类型有以下几种:

错误类型解释
无权限用户请求的功能被禁用或等级不足
命令错误机器人在解析请求指令时出错
拉取错误机器人在获取外部资源时出错
解析错误机器人在解析内部或外部数据时出错
运行出错机器人在处理数据时出错
指令超时异步等待的下一条消息未在指定时间内收到
发送超长机器人欲发送的消息超出qq限制
机器人被禁言机器人所在的群将机器人账号禁言,而机器人试图发送消息
未知异常任何未被catch的异常类型

解析类

B站综合解析

功能:用于解析聊天消息中关于B站的特定消息,
可用于无需打开链接既可预览相应的内容,也可用于下载封面或头像
权限级别:1
对应模块:parse_bilibili
技术栈:bilibiliAPI、gRPC、pydantic
参数:无
备注:支持解析以下类型:

类型解析内容
b23短链接(小程序分享/客户端分享)进一步解析以下重定向的内容
av/bv号/视频链接/视频分享卡片标题、封面、UP主、TAG、合作成员、简介、互动数据等
用户空间链接/UID:xxx用户头像、昵称、等级、性别、粉丝数等
直播链接尚未完工
动态链接尚未完工
专栏链接/cv号尚未完工
音频链接/au号尚未完工
ep/ss/md号/番剧/影视链接尚未完工

无特定指令,机器人通过正则表达式自行判断类型
-47cbfaef34b524d1.png

Youtube解析

功能:用于解析聊天消息中Youtube视频的链接
权限级别:1
对应模块:parse_youtube.py
技术栈:YoutubeAPI、SSR
参数:无
备注:无

无特定指令,机器人通过正则表达式自行判断类型
IMG_20210922_210403.png

查询类

一言

功能:获取一条一言
权限级别:1
对应模块:hitokoto.py
技术栈:无
参数:
type:欲获取的一言类型
备注:使用官方API
有如下类型可用:动画、漫画、游戏、文学、原创、网络、其他、影视、诗词、网易云、哲学

指令:

!一言 [type]

-31e4ca89b969a1be.png

疫情速报

功能:快速查询实时新冠疫情数据
权限级别:1
对应模块:ncov_num.py
技术栈:lxml
参数:
-d,--detail:是否展示为精确到个位的数据(如“12000”否则精确为“1.2万”)
categorie:可选查询国内或国际数据,如不做指定则默认国内
备注:内容实时爬取自丁香医生
在早上时新增数据未被统计。则不会显示

指令:

!疫情速报 [-d] [国内|国际]

-380ac5f347a14f7d.png

缩写

功能:从一段文本中检索并翻译缩写
权限级别:1
对应模块:abbr.py
技术栈:无
参数:
target:检索目标文本
备注:API使用能不能好好说话?

指令:

!缩写 <target>

-45ac4bf9f30f2325.png

归属地查询

功能:查询手机号或ip的归属地
权限级别:1
对应模块:query_location.py
技术栈:无
参数:
target:查询目标
备注:接口由ip138提供

指令:

!<手机号|ip>归属地 <target>

phone:欲查询的目标手机号
-1f8b1348df58ec1b.png

东方角色检索

功能:查询《东方Project》中官方角色的基本信息
权限级别:1
对应模块:touhou_avatar
技术栈:MySQL
参数:
target:查询目标,支持使用中文/英文/日文名以及简称或代号(eg:灵梦、莉莉白、uuz)
备注:
只收录新作中的角色,现在整理进度为《永夜抄》前
当指令为"东方角色歌"时回复2min限制qq语音形式的角色歌(Lo-Fi音质)

指令:

!东方角色[歌] <target>

58d6c56595053c4c.png

身份证号解析

功能:解析18位中华人民共和国公民身份证号的信息(归属地、生日、性别等)
权限级别:1
对应模块:ident_code
技术栈:sqlite、易姐自己写的ident_util
参数:
target:解析目标
备注:最后一位如果是‘X’请大写

指令:

!身份证号 <target>

-3a47c47121f82917.png

藏头诗

功能:生成五言或七言藏头/藏尾诗
权限级别:1
对应模块:cts.py
技术栈:无
参数:
-l, --length :生成长度 可选5或7
target:生成目标
备注:使用cts.chazhi.net的API

指令:

!藏<头|尾>诗 [-l 5|7] <target>

IMG_20210829_001649.jpg

saucenao搜图

功能:使用saucenao以图搜图
权限级别:1
对应模块:search_img
技术栈:pydantic
参数:图片
备注:类型仅匹配了几个常用的

指令:

!搜图 [图片]

-1c19897310f1c39e.png

NSFW图片识别

功能:基于Tensorflow的NSFW图片识别器
权限级别:1
对应模块:nsfw_detecter.py
技术栈:nsfwjs
参数:图片
备注:
可识别出:自然 图画 绅士 性感 黄片这五种类型,后三者为NSFW,如果该类型的可能性<=10%将被隐藏
使用模型进行识别,人工智障属于是了

指令:

!鉴黄

Screenshot_2021-09-22-22-30-37-131_com.tencent.mo.png

爬虫综合统计

功能:统计该服务器上运行的爬虫的数据库
权限级别:2
对应模块:爬虫数据库实时统计
技术栈:MySQL
参数:
type:目标类型
备注:目前支持的类型:bili-exambili-tag

指令:

!爬虫统计 <type>

-74c03c8619ca0b26.png

订阅与推送类

今日简报

功能:获取《今日简报》图片版本,订阅后bot将会在每天9:00时自动向群内发送简报,现已应用易姐精心设计的主题蒙版
权限级别:1
对应模块:daily_news.py
技术栈:PIL
参数:
sub:群内订阅
unsub:群内退订
备注:该功能仅限9:00-23:59可使用,且订阅功能仅可用于群聊

指令:

!今日简报 [sub|unsub]

-a0ad483ca064b20.png

群成员变动提醒

功能:在群成员发生变动时,做出相应的提醒
权限级别:1
对应模块:notice.py
技术栈:graia-broadcast、MySQL
参数:无
备注:无

新群员进群时会@该群员,并发送欢迎消息
当有群员退群时,会向群内报告该群员的昵称及qq号
进群欢迎:
-775f1a5b26714dd.png
退群欢送(doge):
-6ce644e030cddf18.png

生成与处理类

易姐语翻译

功能:基于base16和AES的文本加密
权限级别:1
对应模块:AneE_crypt.py
技术栈:AES、base16
参数:
value:明文或密文文本
备注:程序将自动识别加密或解密内容

指令:

!易姐语翻译 <value>

335248f4c02d94c0.png

截取头像

功能:截取图片中的头像
权限级别:1
对应模块:face_cuter
技术栈:OpenCV、PIL
参数:图片
备注:可截取二次元图片或真实照片中的头像

指令:

!截头像 [图片]

-5e9dde2fc67b6197.png

5000兆円

功能:生成双行“5000兆円 欲しい!”风格文字图片
权限级别:1
对应模块:5k.py
技术栈:node.js
参数:
upper:第一行文字
lower:第二行文字
备注:每行最大支持20字符

指令:

!5k <upper> <lower>

1197092a4eb613b1.png

Pornhub

功能:生成Porn hub LOGO风格文字效果
权限级别:1
对应模块:PH
技术栈:PIL
参数:
left:左边文字
right:右边文字
备注:每行最大支持10字符

指令:

!PH <left> <right>

2f8ca2f158f1f01b.png

rua

功能:生成对应头像的petpet gif动图
权限级别:1
对应模块:rua
技术栈:PIL、moviepy
参数:
member:需要生成的目标用户,可at或@+用户id
备注:可同时生成1-9个目标头像

指令:

!rua <@member> [@member....]

1f21b5f3c2e19dd6.png

亲亲

功能:生成对应两个用户头像互相亲亲的gif
权限级别:1
对应模块:kisskiss
技术栈:PIL、moviepy
参数:
operator:要亲亲的目标用户,可at或@+用户id
target:被亲亲的目标用户,可at或@+用户id
备注:如果为同一用户,会收到来自bot的特殊问候

指令:

!rua <@operator> <@target>

化学方程式配平

功能:基于算法的化学方程式自动配平
权限级别:1
对应模块:BCE.py
技术栈:BCE
参数:
target:待配平的表达式
备注:
用a+b=ab表示等量关系,或用a;b;ab表示模糊关系
别名请用[xx]表达
电子请用表达
语法详情请看文档

指令:

!配平 <target>

-153281c099a57d61.png

SSTV

功能:SSTV(慢扫描电视)信号调制器,即将收到的图片或文字编码为,并通过语音发送
权限级别:1
对应模块:SSTV.py
技术栈:pySSTV
参数:
-m, --mode:模式
备注:由于silk编码的原因,播放效果很差,header都不能被识别,解调后更是糊成了一坨,tx.sb
支持以下制式(默认为MartinM1):
MartinM1,MartinM2,ScottieS1,ScottieS2,Robot36,PasokonP3,PasokonP5,PasokonP7,PD90,PD120,PD160,PD180,PD240,Robot8BW,Robot24BW
指令:

!SSTV [-m mode]

-2311328329604342.png

XML反射

功能:将文本格式的XML序列反射为XML消息类型
权限级别:2
对应模块:XML.py
技术栈:无
参数:
content:XML内容
备注:XML内容也可以进行中断下一条发送

指令:

!XML [content]

54670052648bbb88.png