Skip to content

附加功能

神代綺凛 edited this page Mar 27, 2024 · 72 revisions

这部分功能只是开发者一拍大腿加上去的 _(:3」∠)_

复读

相关配置项:bot.repeat

  1. 当某个群里出现复读现象时(复读不能被打断),如果复读次数大于设定的次数,则机器人会根据设定的复读概率进行概率复读
  2. 如果成功复读,则不会再次参与本句的复读
  3. 同一个人复读自己刷屏不算复读
  4. 日常复读即为平时群员说话时有概率直接进行复读

setu

自行看bot.setu意会(

R18 和关键词参数

可以支持根据正则表达式的捕获组匹配指令,发送 R18 或含有关键词 tag 的 setu

请参考默认正则表达式^竹竹.*[来來发發给給][张張个個幅点點]?(?<r18>[Rr]18的?)?(?<keyword>.*?)?的?[色瑟][图圖]|^--setu$,在这之中,(?<r18>r18的?)(?<keyword>.*)即为两个捕获组,尖括号对中的内容为捕获组的名字,程序会取r18keyword两个捕获组作为 R18 和关键词参数

只要 <r18> 有匹配内容,就开启 R18;<keyword> 有匹配时会被作为关键词

以下是指令实际得到参数的例子:

  • 竹竹来张r18色图 -> r18=true 无keyword
  • 竹竹来张r18萝莉色图 -> r18=true keyword=萝莉
  • 竹竹来张萝莉色图 -> r18=false keyword=萝莉

注意:在群内 setu 在不开启“反和谐”的情况下,普通 setu 小概率会被 tx 屏蔽,r18 setu 大概率会被屏蔽,私聊不会屏蔽

可以使用 &| 将多个关键词进行组合,| 的优先级永远高于 &,例如 竹竹来张萝莉|少女&白丝|黑丝色图 将会查找 tag 含有(“萝莉”或“少女”)且含有(“白丝”或“黑丝”)的 setu

反和谐

开启后 setu 将有概率不再被 tx 和谐,目前有两种方式

  • 1 轻微修改:对图片四角 1x1 的像素区域填充一个随机颜色以改变图片
  • 2 旋转:将图片逆时针旋转90°

由于使用 base64 最大只能发送 4M 的图片,因此当原图过大时会强制启用 size1200

P站图片本地反代

  • pximgServerHostpximgServerPort 可用于自定义P站本地反代服务的监听地址和端口,默认情况下为了安全仅监听 127.0.0.1 上的随机端口
  • usePximgAddr 可用于指定发送图片时使用的本地反代服务地址(将由 go-cqhttp 请求),支持 <IP> <IP>:<Port> :<Port> 三种格式,不指定的部分会取反代服务实际监听的地址和端口

如果 cqps 与 go-cqhttp 在不同的主机或 docker 容器中运行 ,则可能需要利用这些设置(若 cqps docker 容器使用 host 网络模式运行,则相当于直接在宿主机上运行,不需要额外设置),docker 容器内可以通过 host.docker.internal 访问宿主机

  • 例一:go-cqhttp 在 10.0.0.1 上运行,cqps 在 10.0.0.2 上运行并暴露 2333 端口作为反代服务端口
    "pximgServerHost": "0.0.0.0",
    "pximgServerPort": 2333,
    "usePximgAddr": "10.0.0.2",
    
  • 例二:go-cqhttp 在宿主机上运行,cqps 在 docker 上运行并映射端口 -p 2333:2333 作为反代服务端口
    "pximgServerHost": "0.0.0.0",
    "pximgServerPort": 2333,
    "usePximgAddr": "127.0.0.1",
    
  • 例三:go-cqhttp 在宿主机上运行,cqps 在 docker 上运行并映射端口 -p 1234:5678 作为反代服务端口
    "pximgServerHost": "0.0.0.0",
    "pximgServerPort": 5678,
    "usePximgAddr": "127.0.0.1:1234",
    

本地反代服务内含一个随机字符串校验,因此即使将服务暴露在公网一般也不用担心被他人滥用,但能不暴露建议还是不要暴露

P站图片在线反代

pximgProxy 可以自定义 i.pximg.net 的在线反代服务,以起到在国内可以加速下载 pixiv 图片并解决防盗链问题的作用

该设置项为空字符串时不会启用该功能,而是直接使用本程序自建的本地反代下载图片以解决防盗链问题,本质上是直连下载

如需开启,则填写反代网址开头部分,程序会将其与 pximg 图片链接拼接组成图片地址,还可以包含占位符 {{pid}} {{p}} {{uid}} {{ext}} {{path}} 实现更自由的链接拼接

例如原图地址 https://i.pximg.net/img-original/img/2019/01/16/01/49/12/72685648_p0.jpg,则占位符为

  • {{pid}} - 72685648
  • {{p}} - 0
  • {{uid}} - 5151250
  • {{ext}} - jpg
  • {{path}} - img-original/img/2019/01/16/01/49/12/72685648_p0.jpg
  1. 若不包含任何占位符,则按照相对路径法则拼接组成图片地址
    • https://abc.com -> https://abc.com/img-original/img/2019/01/16/01/49/12/72685648_p0.jpg
    • https://abc.com/ -> https://abc.com/img-original/img/2019/01/16/01/49/12/72685648_p0.jpg
    • https://abc.com/xyz -> https://abc.com/img-original/img/2019/01/16/01/49/12/72685648_p0.jpg
    • https://abc.com/xyz/ -> https://abc.com/xyz/img-original/img/2019/01/16/01/49/12/72685648_p0.jpg
  2. 若包含占位符,则使用实际值替换占位符
    • https://abc.com/{{pid}}_p{{p}} -> https://abc.com/72685648_p0
    • https://abc.com/{{path}} -> https://abc.com/img-original/img/2019/01/16/01/49/12/72685648_p0.jpg

以下是实际配置示例:

  • https://pixiv.re
    配置为 https://i.pixiv.re/
    最终得到图片地址 https://i.pixiv.re/img-original/img/2019/01/16/01/49/12/72685648_p0.jpg

OCR 文字识别

相关配置项:bot.ocr

修改use配置项以选择一个 OCR 服务来使用,目前支持qqocr.spacebaidubcetencent

若你使用的 go-cqhttp ≥ v0.9.26,建议直接使用qq

qq

使用手机 QQ 客户端 OCR,需要 go-cqhttp ≥ v0.9.26

使用时不支持自定义目标语言,为自动检测

ocr.space

国内部分地区可能无法访问该服务或访问有困难

配置项说明:

  • defaultLANG - 不指定语言时的默认识别语言(支持的语言
  • apikey - 可以到这里申请免费的(每日可用 500 次),但你也可以留空不填,此时会使用官方默认的helloworld(限制次数不明)

使用方法:

与搜图类似,发送图片时附加--ocr参数即可,同时需要用--lang=语言来指定需要识别的语言,不指定时使用配置中的defaultLANG

语言在上面“支持的语言”中都有列出,格式均为3字母,但本程序也支持使用以下缩写形式

  • ch / cn / zh / zhs -> chs (简体中文)
  • zht -> cht (繁体中文)
  • en -> eng
  • jp -> jpn
  • ko -> kor
  • fr -> fre
  • ge -> ger
  • ru -> rus

baidubce

百度 OCR 每日送免费使用额度,不手动开通付费的情况下不会额外计费,请放心使用

请先到百度 AI 开放平台登录并新建一个应用

配置项说明:

  • useApi - 指定 OCR 的 API,默认为accurate_basic,有以下可选项
    • general_basic - 通用文字识别:每日免费 50000 次
    • accurate_basic - 通用文字识别(高精度版):每日免费 500 次
    • 其他支持的 API 请查阅文档
  • apiKey - 为应用的 API Key
  • secretKey - 为应用的 Secret Key

使用方法:

与搜图类似,发送图片时附加--ocr参数即可,可用--lang=语言来指定需要识别的语言,不指定时默认为中英混合(支持的语言

通用文字识别(高精度版)只支持识别中英混合内容,自定义语言无效

语言在上面“支持的语言”中都有列出,格式均为3字母,大小写无所谓,但本程序也支持使用以下缩写形式的语言表示

  • ch / cn / zh -> CHN_ENG (中英混合)
  • en -> ENG
  • jp -> JAP
  • ko -> KOR
  • fr -> FRE
  • ge -> GER
  • ru -> RUS

tencent

腾讯 OCR 每个 API 每会赠送 1000 次免费使用额度(某些特殊的 API 除外),如果你超出额度,默认情况下将自动转变为后付费模式进行计费,可前往设置关闭“自动转入后付费"

注:程序会统计每月使用次数(仅为通过该程序调用的次数),当某个 API 使用次数达到950次后会阻止继续请求该 API 来防止产生费用,但这也不是绝对安全的保护措施;使用腾讯 OCR 请务必关闭“自动转入后付费",我不对任何超额使用导致的扣费负责

请先到腾讯云 OCR 控制台登录并开通通用印刷体识别、通用印刷体识别(高速版)、通用印刷体识别(高精度版),然后在这里查看 SecretId 和 SecretKey,填入到设置项中

开通三个 API 的作用是,程序可以轮流调用这三个 API,相当于每个月可以有 3000 次的免费额度

如果你只想使用某些 API,可以修改配置文件中的useApi数组

  • GeneralBasicOCR - 通用印刷体识别
  • GeneralFastOCR - 通用印刷体识别(高速版)
  • GeneralAccurateOCR - 通用印刷体识别(高精度版)

Region设置项可以下取值,是必要参数,腾讯 API 文档的解释是“地域参数,用来标识希望操作哪个地域的数据”,但该值与请求的 API 服务器无关,具体用途不明;当刚开通某个 API 时,某些地域可能无法使用,仍提示“服务未开通”

  • ap-beijing
  • ap-guangzhou
  • ap-hongkong
  • ap-shanghai
  • na-toronto

你可以在此处查看 API 免费额度使用情况

明日方舟公开招募计算器

相关配置项:bot.akhr

该功能默认关闭,需要配置config.jsonc启用

修改ocr配置项以选择一个 OCR 服务来使用,目前支持qqocr.spacebaidubcetencent

若你使用的 go-cqhttp ≥ v0.9.26,建议直接使用qq

国内部分地区可能无法访问ocr.space服务或访问有困难

发送公开招募含有词条的界面截图并在消息内含有akhr公招一词(群内需@),会生成词条组合结果图片并发送,效果类似于下面这样

akhr

干员数据来自我自己在维护的方舟工具箱,首次运行时会在线拉取,后会根据配置文件定时更新,向机器人私聊发送--update-akhr可手动更新

定时提醒

相关配置项:bot.reminder

该功能未设计完善的限制机制,请不要轻易开放给群友使用以免被玩坏
设计初衷用于定时发送“xx提醒小助手.jpg”,但发现实际上没什么卵用

该功能用于创建高度自定义的定时文字提醒功能,可在私聊、群组、讨论组中创建,每个区域的上限各为 20 条

该功能默认关闭,需要配置config.jsonc启用

功能启用时,无论onlyPM如何设置,管理者(bot.admin)一定可以在群内使用

创建

无需@,也不要@机器人,直接发送 --time=时间表达式 --rmd=提醒内容,这两个参数的先后顺序没有关系,提醒内容如果含有空格和换行也无所谓,该怎么输入就怎么输入,支持包含图片

如果提醒需要@人(@自己也是),请在提醒内容中直接附上@(必须是真实的@,纯文字@是无效的)

时间表达式的格式与 crontab 相同,如下所示,只不过需要将空格换成英文分号;,即格式应为 a;b;c;d;e

*    *    *    *    *
┬    ┬    ┬    ┬    ┬
│    │    │    │    │
│    │    │    │    └ 星期 (0 - 7) (0 或 7 是星期天)
│    │    │    └───── 月 (1 - 12)
│    │    └────────── 日 (1 - 31)
│    └─────────────── 小时 (0 - 23)
└──────────────────── 分钟 (0 - 59)

crontab 表达式的每一位都可以配合,或者/或者-符号指定时间范围,也就是说不单单只能固定时间提醒,详情请自行百度

注意:为了防止刷屏现象,不允许使用秒级 cron 表达式,并且分钟级的最小分度为5,即最低只能*/5;*;*;*;*

查看提醒列表

直接发送--rmd-list,只能查看当前区域创建的提醒

删除

查看提醒列表时可以看到提醒对应的 ID,然后直接发送--rmd-del=ID即可,只能删除当前区域创建的提醒

防止 CQ 转义

如果需要让机器人发出 CQ 码,则可以加上 --origin 参数,这样消息内容就不会被转义

--time=时间表达式 --origin --rmd=[CQ:record,file=xxxx]

精华消息

若消息以 <精华消息> 开头,则该消息发送成功后会自动将其设置为精华消息(当然,<精华消息> 这几个字是不会发出去的,仅仅充当一个标识)

每次设置精华消息前,上一次通过同一条定时提醒发送的消息会被移出精华消息

setu

可以用于定时发 setu,只能在群内由 bot.admin 添加,格式为 <setu>用于触发机器人色图的文字指令

此处的文字指令和普通的文字指令作用完全一致,可以用于控制 r18 和关键词

时区问题

如果你发现定时提醒没有正常工作,请检查服务器时区是否与你本地的时区相同

如果服务器时区正确,但定时提醒仍然使用了错误的时区,请在项目根目录创建一个 .env 文件,写入 TZ=时区,例如

TZ=Asia/Shanghai

然后重启 bot 即可

哔哩哔哩解析

相关配置项:bot.bilibili

启用鄙视的话检测到发的是视频小程序会发张图

鄙视

支持:

  • 视频(不包括番剧)
  • 动态
  • 专栏
  • 直播

默认仅开启视频解析

为防止刷屏,同个群组中在三分钟之内发送的相同视频将不会被解析

如果出现 -352 错误,请配置 bot.bilibili.cookie

哔哩哔哩推送

相关配置项:bot.bilibili.push

可推送指定 UID 的新动态和直播开播提醒

该配置项为一个对象,key 为 UID,value 为一个数组,数组成员为 群号 或这样的对象

{
  // 群号
  "gid": 1234567890,
  // 是否推送动态
  "dynamic": false,
  // 是否只推送视频动态(和 dynamic 冲突,dynamic 设为 true 时 video 设置将无效;沿用 dynamicAtAll)
  "video": false,
  // 是否推送直播
  "live": false,
  // 推送动态是否@全体成员
  "dynamicAtAll": false,
  // 推送直播是否@全体成员
  "liveAtAll": false,
  // 订阅视频合集
  "seasons": [],
  // 推送视频合集是否@全体成员
  "seasonAtAll": false,
  // 订阅视频列表
  "series": [],
  // 推送视频列表是否@全体成员
  "seriesAtAll": false
}

例:下面这个配置的推送规则为

  • 对于 UID 11111
    • 向群 22222 推送动态和直播
    • 向群 33333 仅推送直播
    • 向群 44444 仅推送动态
  • 对于 UID 55555
    • 向群 66666 推送动态和直播
    • 向群 77777 推送动态和直播,且推送直播会@全体成员
    • 向群 88888 推送视频动态且会@全体成员,还会推送 id 为 123456 的视频合集更新,以及 id 为 12345678 的视频列表更新
{
  "11111": [
    22222,
    {
      "gid": 33333,
      "live": true
    },
    {
      "gid": 44444,
      "dynamic": true
    }
  ],
  "55555": [
    {
      "gid": 66666,
      "dynamic": true,
      "live": true
    },
    {
      "gid": 77777,
      "dynamic": true,
      "live": true,
      "liveAtAll": true
    },
    {
      "gid": 88888,
      "video": true,
      "dynamicAtAll": true,
      "seasons": [123, 456],
      "series": [1234, 5678]
    }
  ]
}

特别地,该配置项内部的注释不会被清除,以方便对 uid 或 gid 进行备注

因B站鉴权变严,可能会无法推送或出现 -352 错误,更推荐使用信息流推送方式

区分视频合集与视频列表

链接中带有 collectiondetail 的为视频合集

https://space.bilibili.com/10462362/channel/collectiondetail?sid=658

链接中带有 seriesdetail 的为视频列表

https://space.bilibili.com/10462362/channel/seriesdetail?sid=348102

特殊逻辑

  • 抽奖系统自动发送的抽奖结果不会被推送
  • 对于某一个视频合集或视频列表,当出现批量更新时,一次最多推送 10 个视频

信息流推送

相关配置项:bot.bilibili.useFeed bot.bilibili.feedCheckInterval bot.bilibili.cookie

通过启用 bot.bilibili.useFeed 并配置 bot.bilibili.cookie 可以使用信息流推送代替普通推送

  • 普通推送
    无需 cookie,但对于每位 UP 都需要单独轮询,API 调用频率过高容易被拉黑,因此规定了较长的检测间隔(最少30s)且效率不高
    因B站鉴权变严,如无法推送或出现 -352 错误请使用信息流推送方式
  • 信息流推送
    需要 cookie,但只用轮询检查信息流更新的 API,因此检测间隔可以很短而不被拉黑(最少5s)且十分高效

提供 cookie 的帐号必须关注需要推送的所有 UP(除了自己),不关注的将不会推送,不在推送配置中的 UP 也不会被推送

如果你使用自用帐号 cookie,那么建议使用浏览器无痕模式登录后获取 cookie 而不是直接使用常用环境下的 cookie,否则可能会因 cookie 自动刷新导致配置中的旧 cookie 失效

也可以直接使用我部署的扫码登录获取 cookie 服务:https://bql.lolicon.app

语言库(自动回复)

相关配置项:bot.corpus

该功能类似酷Q的语言库插件,请知晓修改配置文件后可以使用配置热重载指令,而无需重启程序

bot.corpus为一个数组,其成员为具有如下结构的对象

{
  "regexp": "^东京府福立第一中学!片山新太郎!$",
  "reply": "好!很有精神!",
  "scene": "all",
  "users": [123456789],
  "groups": [234567890, 345678901]
}
  • usersgroups 为可选参数
  • regexp reply scene 不为字符串或为空字符串,将视为无效的回复规则,不会被使用
  • 规则匹配顺序为数组成员顺序,一但某个规则匹配成功则终止匹配
  • 若有规则匹配成功,则不会再触发机器人的其他功能

regexp

触发回复需满足的正则表达式

酷Q的语言库插件除了“正则表达式”外提供还有“完整匹配”和“模糊匹配”的选项,它们也可以简单的写成正则表达式的形式:

  • 完整匹配:^匹配内容$
  • 模糊匹配:匹配内容(什么都不加)

你可以使用 regex101 这一工具来测试你的正则表达式

需要注意的是,由于某些半角符号在正则表达式中属于特殊字符,因此在必要时需要使用反斜杠\进行转义,并且在 JSON 中反斜杠也需要用反斜杠进行转义,即写入配置时\\才代表正则表达式的一个\

例如需要匹配纯文本的(匹配内容),则配置应为\\(匹配内容\\)

reply

消息内容满足正则表达式时的回复内容

  • 可以使用 CQ 码
  • 可以使用 [CQ:at],会被替换成对消息发送者的@;在私聊中无效,会被替换成空字符串;若使用 go-cqhttp 则@会被自动加上尾空格,不需要自己加
  • 可以使用 [CQ:delete],会撤回触发该规则的消息,reply 可以只有 [CQ:delete],这样可以用来撤回消息而不会回复任何消息
  • 与酷Q语言库插件的正则表达式一样,支持特殊变量名,但 $`$' 为空字符串

多个回复项

reply 可以是一个数组 Array<string | { text: string; weight?: number }>,其中 weight 为权重,大于 0 即可,此时机器人会从中按照权重随机挑选一个进行回复

不符合上述类型定义的回复项会被忽略,weight <= 0 的回复项也会被忽略,当不提供 weight 时,默认为 1

下面是一个合法的配置示例

{
  "regexp": "^test$",
  "reply": [
    "1",
    {
      "text": "2",
    },
    {
      "text": "3",
      "weight": 2
    }
  ],
  "scene": "all"
}

触发时,将有 25% 概率回复 1,25% 概率回复 2,50% 概率回复 3

scene

规则生效的场景

  • aall - 全部
  • pprivate - 私聊
  • ggroup - 群组

联动其他功能

你可以通过将 reply 设置为 <replace>可以触发其他功能的发言 来联动其他功能,必须由 <replace> 开头,后续文字将会代替当前用户的发言去触发其他功能

例如以下配置和色图联动

{
  "regexp": "^碧蓝档案!$",
  "reply": "<replace>竹竹来点碧蓝档案&幼女色图",
  "scene": "all"
}

配合上面提到的正则表达式特殊变量名,可以进行更高自由度的联动

{
  "regexp": "^(\\d+)d(\\d+)$",
  "reply": "<replace>chatgpt你是一个掷骰子工具,帮我掷$1次骰子,每个骰子的面数为$2",
  "scene": "all"
}

users & groups

这两个参数为可选,类型为 number[]

作用是使该回复项仅对某些用户或组生效,这两项之间为“与”关系

不设置或为空数组则为对所有用户或组生效

ChatGPT

相关配置项:bot.chatgpt

这里并不会教你怎么注册 OpenAI 帐号,请自行搞定

具体配置在配置文件中已有详细说明

该功能目前使用官方 API,并且不支持上下文,因为上下文可能会消耗非常多的 token,让你的免费额度更快见底,并且直接通过 API 使用的 token 上限也非常低,我目前也是白嫖玩一下所以暂时没有打算支持

选项覆盖

相关配置项:bot.chatgpt.overrides

你可以通过这个选项来根据不同的正则匹配发言来覆盖默认配置

{
  "chatgpt": {
    "enable": true,
    "regexp": "^chatgpt([\\s\\S]+)",
    "model": "gpt-3.5-turbo",
    "useChatAPI": true,
    "maxTokens": 0,
    "prependMessages": [],
    "additionParams": {},
    "apiKey": "xxxxxxxx",
    "organization": "",
    "blackGroup": [],
    "whiteGroup": [],
    "overrides": [
      {
        "regexp": "^chatgptcode([\\s\\S]+)",
        "model": "code-davinci-002",
        "useChatAPI": false,
        "maxTokens": 3072,
      }
    ]
  }
}

例如上面的配置,如果你发送消息 chatgptcode阿巴阿巴,那么将会匹配到这个覆盖而使用 code-davinci-002 模型

overrides 的每个对象中都必须要有 regexp,支持覆盖除了 enableoverrides 之外的所有配置

消息会优先在 overrides 中按数组顺序匹配,最后才会使用 chatgpt.regexp 匹配

使用语言库预设对话

你可以通过语言库功能来达到使用特定发言去触发具体的对话的效果,详情参考 语言库-联动其他功能

VITS

相关配置项:bot.vits

准备

  1. Artrajz/vits-simple-api,参照文档部署即可,有提供 docker
    • 一些预训练模型可以在 CjangCjengh/TTSModels 下载(注意是下载 VITS 的,不是 HuBERT-VITS 或 W2V2-VITS)
    • 设置 bot.vits.enabletrue 并确保 bot.vits.apiUrl 正确
  2. 安装 FFmpeg,供 go-cqhttp 调用

使用

所有 vits 指令都以 bot.vits.command 开头,并支持中英两种指令后缀(为了在 command 为中文时也有比较顺手的体验)

这里以默认值 "vits" 为例

功能 英文后缀指令 中文后缀指令
语音合成 vits
帮助 vits-help vits帮助
查看模型列表 vits-list vits列表
设置默认模型 vits-default vits默认
重载模型列表 vits-reload vits重载

帮助功能输出的指令示例会判断 bot.vits.command,如果是纯英文数字则使用英文后缀,否则使用中文后缀

具体使用方法看帮助即可

关于 FFmpeg 依赖

需要 FFmpeg 是因为 go-cqhttp 要将 vits-simple-api 生成的 wav 转成 silk 才能发送

虽然 vits-simple-api 支持直接生成 silk,但是好像有点问题,iOS 上会无法播放,而 FFmpeg 转的就没问题

如果你不想或无法安装 FFmpeg,也可以设置 bot.vits.noFFmpegtrue,这样就会发送 vits-simple-api 生成的 silk