【技术】基于Mirai构建多功能QQ机器人

Dymay
Dymay
发布于 2023-02-08 / 122 阅读
0
0

【技术】基于Mirai构建多功能QQ机器人

命令列表

最近玩了一下mirai,加了点插件什么的,搞了个bot可以实现如下功能:

命令 功能
/说 文本 绫地宁宁模型 日文语音生成
/中文 文本 绫地宁宁模型 中文语音生成
/ai text 词条 NovelAl 文字转图像,支持中文词条
/pic 张数 词条 使用Lolicon API发送指定张数 (<=10) 和tag (<=3) 的色图,不填写tag则随机tag(有概率被腾讯吞图)
chat chatGPT 聊天模型触发前缀
Q&A chatGPT 问答模型触发前缀
stop 停止聊天或回答
ptst- 图片 搜索图源(多引擎,比较慢)
ptsf- 图片 以图搜番
rank-选项-页码 获取 Pixiv 对应选项排行榜对应页码页的内容,可选项包括 daily|weekly|monthly|rookie|original|male|female
user-id-页码 获取 Pixiv 对应id作者对应页码的插画内容
psid-id 获取 Pixiv 对应id的图片
tag-标签-页码 获取 Pixiv 对应标签排行榜对应页码的内容
来点色图 来点色图,直球R-18概率较大,两分钟后自动撤回

安装

模块 备注
MCL 一键下载JavaiTXTech Mirai Console Loader
OpenAI插件 需要你有个OpenAI的账号来获取chatGPT的api,每个账号有18美刀的免费使用
Pixiv插件 其中部分功能需要科学上网
NovelAI插件 需要本地部署Stabel Diffusion WebUI
MoeGoe插件 需要本地部署Python环境,下载预训练模型,同时MCL安装mirai-api-http

先装MCL,然后下载各类插件Release的jar包放到mcl文件夹下的plugin文件夹(如果使用mirai2.0.0以上建议下载后缀为.mirai2.jar的包),启动mcl.cmd,正常都是自动安装。

备注要求参考教程/资源:

修改

基本没动,就修改了MoeGoe插件的命令格式稍作统一,并将其图片功能的图源api改为Lolicon API,根据其文档重写了plugins/picGet.py文件的图片获取逻辑(Pixiv插件也有从该api发图的功能,但是测试不支持多tag,故只保留了一个非Lolicon API的“来点色图”):

import os
import requests
import json
from plugins.RandomStr.RandomStr import random_str

headers ={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
}

def pic(picTag=None):
    setu_api = 'https://api.lolicon.app/setu/v2'
    if picTag != None:
        setu_api = setu_api + '?'
        for tag in picTag:
            setu_api = setu_api + 'tag=' + tag + '&'
        setu_api = setu_api.strip('&')
    info = requests.get(setu_api, headers=headers)
    setu = info.json()
    if setu["data"] != []:
        r = requests.get(setu["data"][0]["urls"]["original"], headers=headers)
        # 下载图片
        ranpath=''
        while True:
            ranpath = random_str()
            exist = os.path.isfile("pictures\\" + ranpath + ".jpg")
            direxist =os.path.isdir("pictures")
            if direxist:
                if exist:
                    continue
                else:
                    break
            else:
                os.mkdir("pictures")
                continue

        with open("pictures\\" + ranpath + ".jpg", mode="wb") as f:
            f.write(r.content)  # 图片内容写入文件
        return "pictures\\" + ranpath + ".jpg"
    else:
        return ""
        
if __name__ == '__main__':
    s=input("输入1开始执行")
    i=0
    if s=="1":
        while i<=10:
            pic()
            i+=1

其它各个插件的设置参考各项目的文档修改即可。


评论