跳转至

配置与部署

如果你也想自己折腾一只小鱼,那么以下的内容可能会适合你,否则请直接忽略这一部分的内容。

前提条件

  • 必须有一个持续开机的电脑或买一台服务器。
  • 必须有一个能自动运行的联萌账号。
  • 建议面对问题时保持探索精神和乐观的心态。
  • 最好使用过一种 QQ 机器人的框架。

安装小鱼

  • 安装go-cqhttp(很可能不可用)。
  • 安装Python 3.8+
  • 安装依赖项:

    pip install -r requirements.txt
    
    pip3 install -r requirements.txt
    
  • 根据go-cqhttpnonebot2文档修改相关配置。

  • 运行配置程序:

    py -3 wizard.py
    
    python3 wizard.py
    
  • 运行小鱼:

    py -3 bot.py
    
    python3 bot.py
    

环境变量的进一步配置

  • Nonebot 相关环境变量:

  • host: 监听 IP

  • port: 监听端口
  • superusers: 超级用户
  • access_token: API 上报密钥

  • 联萌相关环境变量:

  • mswar_uid: 联萌关联账号

  • autopvp_uid: 联萌 autopvp 账号
  • superusers: 联萌关联账号登录 token
  • mswar_host: 联萌服务器地址与端口
  • mswar_version: 联萌版本
  • mswar_encryption_key: 联萌加密密钥
  • mswar_decryption_key: 联萌解密密钥

  • 本地数据库环境变量:

  • database_location: 本地数据库地址(建议以.gz结尾)

  • database_compress_level: 数据库压缩程度(0-9, 默认为9)
  • database_backup_max_storage: 数据库最大备份数目(正整数, 小于等于 0 时不限制备份数, 默认为0)

  • 本地资源库环境变量:

  • resource_location: 本地资源索引文件地址(建议以.csv结尾)

  • resource_separator: 资源文件分隔符(默认为|)
  • frequent_face_id: 常用 QQ 表情 ID,用于变形复读时表情替换(默认为[146])

  • 权限配置环境变量:

  • policy_config_location: 本地配置文件地址(建议以.json结尾)

  • 42 点小游戏环境变量:

  • ftpts_max_number: 42 点最大可选择数字(默认为13)
  • ftpts_target: 42 点目标数字(默认为42)
  • ftpts_random_threshold: 42 点目标阈值,该值越高, 目标不为 42 点可能性越大(默认为0.0025)

Tip

以上环境变量中,末尾含有的环境变量可以使用wizard.py进行配置,其余环境变量必须手动配置。

Danger

请务必注意,环境变量中的数据相当敏感一定不要泄露给他人

更精细的权限控制

  • 为了使小鱼在不同的群内使用不同的功能,需要新建一个权限控制文件policy.json,内部的结构需要写成这样:
{
    "bot_id": {
        "group_id": {
            "command_name": {
                "+": [1, 2, 3],
                "-": [3, 4, 5],
                "@": {
                    "day_of_week": "*",
                    "hour": 10,
                    "minute": 20,
                    "second": 30
                },
                "@.another": {
                    "hour": 20,
                    "minute": 30,
                    "second": 40
                }
            },
            "another_command_name": {
                // write another configuration for a command
            }
        },
        "another_group_id": {
            // write another configuration for a group
        }
    },
    "another_bot_id": {
        // write another configuration for a bot
    }
}
  • 以下对上述配置文件的结构进行一些解释:
  • 配置文件中可以对每条小鱼所在的每个群组进行配置。其中小鱼需要提供其bot_id,即小鱼的 QQ 号,对于需要配置的每个群组,需要提供其group_id,即群号,对于需要配置的每个命令(组),需要提供其command_name,一般情况下为每个插件的文件名。这一部分是配置的宏观部分,当需要配置指令时,必须准确填写。
  • 对于每个命令(组),目前提供了三个选项(键),白名单筛选黑名单筛选广播时间控制。白名单筛选需要采用+键配置,配置值为一个数组,其中包含所有在白名单中的用户 QQ 号。黑名单筛选需要采用-键配置,配置值为一个数组,其中包含所有在黑名单中的用户 QQ 号。广播时间控制需要采用@键配置(或自定义键配置,并在程序中显式指明配置内容),配置值为一个键值对,完全遵守cron语法规则。
  • 对于黑白名单筛选,当某用户位于白名单且不位于黑名单时,小鱼会响应用户指令。对于以上的例子,对于所有在group_id使用bot_id触发的command_name命令,小鱼只会响应 QQ 号为12的用户。如果不进行黑白名单筛选,小鱼默认相应所有用户的指令。
  • 对于广播时间控制,只有当前时间在控制时间范围内(误差为 30 秒),小鱼才会广播相应的命令或执行相应操作。对于以上的例子,具有bot_id的小鱼会在每天的10:20:3020:30:40,在group_id这个群中执行command_name相关的两个不同任务。
  • 此外,小鱼还提供了简单识别配置的功能,小鱼会获取bot_idgroup_idcommand_name非空的所有值,并将bot_idgroup_id装配成一个元组,并将所有符合条件的元组构成一个列表。该功能目前只在version指令中使用到。

Warning

权限配置较为复杂,而且向着越来越复杂的方向发展,仅建议在小范围(如supercmd等权限)内使用,项目本身不提供配置文件,通过wizard.py可以配置一些广播时间控制的默认值,其余部分仍需要自行编写。强烈建议先通过wizard.py进行配置,这将对权限配置的格式有所帮助。

此外,权限控制中存在所谓临时权限的规则,临时权限需要手动生成和手动清除,只在小鱼本次运行过程中保留,终止运行后就会自动清空。

请务必注意,权限配置文件中的数据比较敏感建议不要泄露给他人

资源文件

  • 为了使小鱼表达能力更强,需要新建一个资源文件resource.csv,每个资源条目由资源内容资源分类资源是否为图片加载权重四个部分构成。示例资源文件如下:
太强了|1|0|2
tql|1|0|2
冲鸭|1|0|1
!|-1|0|1
[CQ:face,id=41]|-1|0|1
加油鸭|2|0|3
加油冲鸭|2|0|1
💪|-2|0|1
!|-2|0|1
resource/exclaim/1.gif|1|1|1
  • 以下进一步解释资源文件中的细节:
  • 资源内容为纯文本形式,支持除图片与音频以外的所有 CQ 码格式,图片 CQ 码格式将单独处理,音频 CQ 码格式暂不支持。
  • 资源分类为一个字符串,小鱼在构建资源数据库时,会将同类的资源自动整合到一起。目前小鱼用到的分类号为1(膜佬),2(加油),3(输入错误),4(打断复读),10~19(基于时间的打招呼)。
  • 资源是否为图片为布尔型变量(填写01即可),决定是否将资源内容中的文件转化为图片型 CQ 码。小鱼会基于运行路径进行自动转化,所以如果资源为图片,不需要在资源内容中给出 CQ 码,只需要给出文件相对于小鱼的路径即可。
  • 加载权重为正整数,决定资源被发送的概率,权重越大,被发送的概率越大。
  • 在不发送图片时,基于资源文件的消息由三部分组成: 作用对象称谓消息体消息尾。目前设计分类时,消息体消息尾需要保持相同的分类号,且消息尾的分类号前面需要加入-进行标识,具体操作已经在示例资源文件中指出,此处不再赘述。

Tip

由于 CQ 码中含有逗号,资源文件中的默认分隔符为|,可以通过resource_separator这一配置项进行修改。

数据库相关

  • 数据库采用gzip压缩的JSON格式,将所有数据存放在一起。索引使用universal_id,当数据为共用的全局数据时,universal_id = 0,当数据为群组相关的局部数据时,universal_id = 小鱼QQ号拼接群号
  • 每次写入数据库时,小鱼会对当前数据进行全量备份,可以通过设置database_backup_max_storage限制最大备份数目。

Danger

由于作者能力有限,数据库的形式可能会不断变化,甚至出现版本间不兼容的情况,请谨慎开启数据库功能。

B 站直播推送相关

  • 直播推送采用了双队列模式,即群组内部的订阅队列全局的订阅队列。群组内部队列只负责从全局队列中取数据,而全局队列需要负责从 B 站获得用户的直播状态。
  • 为了减少被风控的风险,本推送功能完全采用了线性的查询方式,对于全局队列而言,每 20 秒只对一个 UID 发送查询请求,并更新其状态。
  • 为了减少查询流量,除队列元素更新以外,内部队列不进行任何网络访问。同时,小鱼采用了活跃度机制,每次全局队列的 UID 更新状态时,会检查其活跃度,当活跃度小于或等于 0 时,小鱼会将该 UID 移除全局队列;更新状态完成后,小鱼将降低1点该 UID 活跃度;而内部队列查询全局队列中的 UID 信息时,将恢复该 UID 的活跃度至5点。所以在权限控制中设置群组内部查询频率时,需要保证查询间隔小于2分钟。当然,建议将权限控制写为如下形式:
{
    "bot_id": {
        "group_id": {
            // other command plugins
            "bilipush": {
                "@": {
                    "hour": "8-23",
                    "minute": "*",
                    "second": "*/20"
                }
            }
            // other command plugins
        }
    }
}

最后更新: 2023-10-18