/YusamiBot

一个实验性的项目,做出来单纯因为好玩(shittycode 警告),实现了一些有意思的功能,当然后续会持续加入新功能

Primary LanguageGoGNU General Public License v3.0GPL-3.0

YusamiBot

一个实验性的项目,做出来单纯因为好玩,实现了一些有意思的功能

注:该项目是基于 go-cqhttp 消息框架,使用 golang 开发的 qq 机器人

实现功能:

  • 学习,包含精确学习与模糊学习(所以就没做 help 指令,你看毕竟可以学更有成就感……)
  • 加精与查看,直接存入 MongoDB 中
  • 看看新闻(获取 60 秒读懂世界内容)
  • 新番查询(与 Bangumi 同步)
  • 番剧查找(整合同步多个动漫网站数据,包含动漫花园数据)
  • pixiv 美图,特别感谢 LoliconApi 现在由于鹅的大力封锁,全部转成了扫码观看
  • 原神抽卡(?别看我,群友让我加的,原神什么的真不熟)
  • jm 本子查询与观看(有傻冒放着人家图床不用给自己服务器流量冲业绩,后面真会改的
  • 日记功能,每天写日记多是一件美式,实时更新,有专门的页面可供查看
  • 课表查询,目前属于 UESTC 限定功能,没什么验证(飞书:锅来),绑对了你连住你隔壁的男同今天上什么课都一清二楚
  • ai 绘图,曾经可以使用,现在穷了,给点(
  • ai 聊天,使用的是 CharacterAi
  • openAi 最近比较火,加了一个 openAi 的 chat 功能,但是要求你自己有一个 openAi 的账号(且账号上有额度),因为是为了玩玩匆忙写出来的,很多功能不完善。
  • b站订阅提醒,包含直播和动态提醒

准备实现:

  • 准备实现对 nonebot 插件的兼容
  • 利用 go plugin 实现 go 原生插件支持

安装:

首先下载最新的 release 文件,将其解压到文件夹中

本项目使用 websocket 以及 http 连接至 go-cqhttp,因此将 go-cqhttp 的 config 文件中的相关配置项改成如下样式,并且在初始化 go-cqhttp 时也请将 http 和反向 ws 两种通信方式打开哦~:

  # 反向WS设置
  - ws-reverse:
      # 反向WS Universal 地址
      # 注意 设置了此项地址后下面两项将会被忽略
      universal: ws://127.0.0.1:8081/msg

项目由于其他功能会使用部分路径,因此反向 ws 接口为 /msg,其余配置如账号等并没有特别特殊的地方

在启动 go-cqhttp 之后,运行项目文件夹中的 Lealra 文件,bot 启动

然后请下载安装对应平台的 MongoDB,本项目使用其作为数据存储,安装好后请正确配置其服务端口,不需要对库及表进行额外操作

相关功能:

学习

相关配置

learnAndResponse:
#  只有在你空间属实不够的情况下,考虑白嫖qq图床,否则仍然建议base64,因为qq图床的定期清理很讨厌,虽然做了相应的续期措施,但该措施可能导致其它隐患
  renewSwitch: false
  groupToRenew: 608203511 # 用于续期的群,最好私人群,太吵了
  msgInterval: 2 # 消息间隔,单位s,过短容易出事
  useBase64: true # 空间够用的话强烈建议打开
  compress: true #是否对获取到的数据进行压缩,采用的是 zlib 压缩,可以节省存储空间

压缩开启后,之前未压缩的回复不受影响

相关指令

指令 效果
[回复] 学习 XXX 将回复内容作为 XXX 的精确匹配响应
[回复] 模糊学习 XXX 将回复内容作为 XXX 的模糊匹配响应
[回复] 忘记 XXX 若回复内容是 XXX 的响应,则删除对应记录
清理僵尸回复
仅限私聊且需要 admin 账号
清理所有僵尸回复,并返回执行结果
存储回复图片
仅限私聊且需要 admin 账号
将所有回复中包含的图片存至本地,推荐先备份数据库并清理僵尸回复后再执行

该功能模块主要有两种不同的模式,一种是精确学习,另一种是模糊学习:

  • 精确学习会精确匹配全字段,模糊匹配则检测是否包含
  • 优先精确匹配,其次再模糊匹配

让 bot 遗忘只用回复需要遗忘的消息即可:

遗忘也会优先遗忘精确学习的回复,其次才是模糊学习

清理僵尸回复

由于本项目使用的是 qq 图床(也就是最方便 CQ 码操作的格式),很多情况下容易出现图片过期的情况。如果回复是纯图片,就会造成无回复的现象。

针对这个问题项目有三点应对策略:

  1. 清除僵尸回复

    所谓僵尸回复就是占用数据库存储空间但实际上已经过期且无法使用的回复,只要回复中图片存在过期那么都可以将其视为失去了原本的表述意义,因此需要将其全部清理:

    切记该功能仅能在私聊中使用!且要求使用者是预先设置好的 admin 用户!

  2. 通过发送图片保存图床稳定性

    不推荐使用,在配置文件中有详细说明,频繁发送消息还可能让你更容易被鹅盯上最后 bot 死翘翘就不好玩了

    配置中设置后自动执行,周期为 48 小时

  3. base64备份(推荐)

    实际上发出图片后被 go-cqhttp 解析为 CQ code 会有两个属性:一个是 file 为 go-cqhttp 文件名,另外一个 url 是 qq 图床地址。因为 go-cqhttp 数据库里实际上只存了图片 url 等信息没有具体文件内容,所以 qq 图床失效后该图片就会发不出去,本地缓存文件名为图像的 md5,qq 图床也使用 md5 进行标识,我们可以创建一个 md5->base64 的映射表,缺什么补什么,并且一旦使用 base64 重新发送一次,前面两个属性就又会重新生效(md5 不变)

加精与查看

指令 效果
[回复某消息] 设精
只要最后两个字是设精都会触发
将回复的消息加入精华
精华 [date=x][uid=x][name=x][word=x] 查询精华消息,四个参数可以随意使用

实际上该功能在使用过程中还是发现有诸多问题,因此后续会加以更正

目前支持聊天记录加精(包括单层转发),根据内容(word)、昵称(name)、uid(uid)、时间(date)进行匹配,四项参数可以任意搭配

只要回复消息尾部包含“设精”,则会自动设精,有相应权限还可以直接加入群聊精华:

看看新闻

输入看看新闻即可查询当天新闻,有时可能未更新,则显示前一天新闻

指令 效果
看看新闻 返回当天的 60 秒读懂世界新闻图片

如图:

番剧助手

相关功能分为两部分:

新番查询

该功能是基于在 Bangumi 的网站上爬取的数据进行开发的,所有番剧情报均和 Bangumi 上一致

指令 效果
番剧 今日更新 显示今日更新的番剧
番剧 全部番剧 显示当周全部番剧
番剧 搜索 [参数]
参数数量>0
在新番更新表中查询番剧,返回包含搜索字段的结果,大小写敏感

番剧查找

该功能爬取了三个网站:NT 动漫网次元城动漫以及动漫花园资源站

其中 NT 动漫网和次元城动漫是可以在线观看的网站,动漫花园资源站则只提供资源链接

指令 效果
我要看|我现在就要看|番剧搜索 [参数]
参数数量>0
在三个网站上搜索番剧相关资讯并返回

配置参数

功能相关配置参数有:

bangumi:
  bangumiSearch: true # 是否开启相关功能
  maxPoolSize: 3 # 同一时间的最大搜索数,所有组群共用

Ai Chat

目前为止使用了两个不同的源,一个是前段时间非常火的 openAi,另一个是国外 Ai 聊天网站 characterAi

openAi

使用该功能要求在官网有供模型使用的 Token,注册一个账号有十多刀的免费额度。

功能相关配置如下:

openAi:
  token: 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 #your token
  settings: # 详细配置见官方 api 文档
    chat:
      memory: false # 是否开启记忆化,不建议,token 烧太快
      model: text-davinci-003
      maxTokens: 1024
      temperature: 0.9
      topP: 1
      frequencyPenalty: 0
      presencePenalty: 0.6
    edit:
      model: code-davinci-edit-001

配置参数的名字和官方 API 请求参数基本一致,详细释义请查阅官方 API 文档

上面这个 Token 当然是过期的

指令 效果
/talk [聊天内容] 发送聊天内容
/talk 刷新 清除所有内容,包括预设
/talk 配置 显示当前配置
/talk 撤回 在允许记忆化的情况下有效,让 ai 重新回复你的上一句话
/preset [预设内容] 添加预设
/edit [原始句子] [修改要求] 按照要求修改句子

目前记忆化有一点小问题,主要是 go 好像没有解析 openAi 内容 token 长度的库,所以可能会出现必须要刷新的情况,这个我后面想办法解决

还有就是,开记忆化 token 烧的实在是太快了!慎开!

如果你想他记住什么信息,更建议使用预设而不是记忆化

CharacterAi

相关配置
characterAi:
  token: # 你的 characterAi 的账户 token,不填写默认使用游客登录(每次会话最多七句)
  timeout: 10 #人格选择过期时间,单位秒

如果要使用该功能,需要挂代理,并在配置文件中正确填写 antiCf 相关的配置:

antiCf: # 针对相关反爬的设定
  ja3: "771,4865-4867-4866-49195-49199-52393-52392-49196-49200-49162-49161-49171-49172-51-57-47-53-10,0-23-65281-10-11-35-16-5-51-43-13-45-28-21,29-23-24-25-256-257,0"
  userAgent: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0"
  timeout: 200 # 单位s,设置太小了容易收不到回复,看个人情况调整
  proxy: "http://127.0.0.1:7890" # 代理地址,characterAi要翻墙所以必须挂

如果请求出现被拦截的情况,可以尝试更换 ja3 和 user-agent

相关指令
指令 效果
[@ 机器人] 聊天 开启新的会话
刷新人格列表 重新从 characterAi 配置文件中读取信息
刷新
会话中使用
清空聊天记录
重连
会话中使用 由于游客续期措施失效,该功能已移除
不清空聊天记录,尝试重新连接
换一句
会话中使用
更换另一个回答
再见
会话中使用
暂时结束会话,但记录仍旧存在,下次与相同人格对话可以继续上次聊天
chattoken [你的 token]
私聊使用
如果配置文件中没有写 token,则可以使用这个指令手动输入

人格列表配置文件格式如下:

- botId: Bo7tKlIwU_BWQBxXjiZ9X65KtXtAVfMVAFKmw8M_vjg
  botName: Yusami

一定要按照这样填写为数组格式,botId 就是 url 后面那一串:

关于个人 token 配置

打开浏览器,按 F12 打开开发者工具,点击 网络 一栏,随意发起连接,点击向站点发送的请求,查看其请求头,每次请求时 Header 中的 authorization 中的 Token 值就是用户 Token:

可以在配置文件中配置,也可以手动导入:

很显然这个逼设置了一个不合法的无效 Token,由于没有相关验证使得这一操作会成功,但是执行相关指令时会出错

关于该功能还有几点要说的:

  • 为了避免有大聪明忘记关会话,bot 6 分钟内得不到下一条会话内容自动退出
  • 该会话是私人的,彼此之间不影响
  • 在等待回复时,bot 收到的所有消息都会主动丢弃

Pixiv 美图

因为鹅的风控简直太离谱了,所以现在全部都是存到本地然后给二维码自行访问,注意开放服务运行的端口(不过这风控说实话挺玄学,之后会把相关配置改成自定义,并考虑获取多个涩图源的信息)

指令 效果
给N张 | 来N张 | 来点 | 给点 | 我要N张 [图片类型(少女、巨乳……)] 涩图 | 色图 | 🐍图
满足任意一种即可触发,下方有使用案例
获取多张涩图,可指定类型,不同类型间用 隔开,一次性最多请求五张

不够涩?

在描述图片类型时,在字段中加上 R18 关键词,即可获取 NSFW 涩图。有效关键词表:

R18 关键词
r18
R18
nsfw
NSFW

随便看看?

在描述图片类型时,不输入字段,会随机返回涩图(nsfw 关键字不算做字段)

支持汉字替换

在描述张数时,可以直接使用汉字代替阿拉伯数字,但仅限 1-5(即图片获取的上限)

多条图片

go-cqhttp 暂时不支持相关合并转发发送至私聊,因此在私聊中采用逐条发送,群聊中使用合并转发

关于风险

现在在 QQ 上 GHS 已经不像当年那么容易了,而且还伴随着风险。好点儿只是把你发送的消息拦截了,糟糕点儿直接就封你号了,所以最好不要去赌,能不直接原图发送最好

下面是功能相关的配置,最好就是都拿二维码访问,这样也没有什么被封杀的可能了,鹅要是这还封你号就有点离谱了

setu:
  picMode: 11 # 图片发送的形式,1为转换为二维码访问,2为原图访问,默认直接发送,十位对应非 nsfw 图,个位对应 nsfw 图
  setuGroupSender: true # 是否能群发,现在改了显示方式已经没有多少被封杀的可能了
  api: https://api.lolicon.app/setu/v2 # https://lolisuki.cc/api/setu/v1

日记功能

更准确的说是一个实时日志,可以记录自己一天干了什么事,方便晚上睡觉前复盘或者是留作记录,通过 bot 录入后既可以直接在 bot 处查看,也可以通过在线网页进行查看

待续