侧边栏壁纸
博主头像
雨探青鸟博主等级

遥知蓬山雨途险 却看青鸟意决探

  • 累计撰写 61 篇文章
  • 累计创建 67 个标签
  • 累计收到 19 条评论

目 录CONTENT

文章目录

ChatGPT+Mirai打造QQ机器人

雨探青鸟
2023-03-14 / 0 评论 / 0 点赞 / 196 阅读 / 1,232 字
温馨提示:
本文最后更新于 2023-03-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

获取Key

OpenAI点击+ Create new secret key创建新的SECRET KEY,并且记住,因为之后没法找到。

并且,安装openaipython接口:

pip install openai

安装Mirai

 使用 Mirai Console Loader来使用过 Mirai,点击 mcl-2.1.2.zip下载,然后解压,然后命令行输入 ./mcl,不限系统

cd mcl-2.1.2
# 加载后...
> login <QQ号> <密码> <协议> # 协议包括 MACOS ANDROID_PHONE等,建议用MACOS

# 还可以设置自动登录
> autoLogin <QQ号> <密码>
> setConfig <QQ号> <协议>

 然后在./config/net.mamoe.mirai-api-http下新建setting.yml,填入以下内容:(如果没有文件夹,记得创建文件夹)

adapters:
  - ws  # websocket协议,后面用的这个
  - http # http协议
debug: true
enableVerify: true
verifyKey: yirimirai # verifyKey,后面写代码用
singleMode: false
cacheSize: 4096 
adapterSettings:
  ws:
    host: localhost
    port: 8080
    reservedSyncId: -1
  http:
    host: localhost
    port: 80
    cors: [*]
    unreadQueueMaxSize: 500

云服务器上设置后台运行

# 使用screen,安装
apt install screen # Ubuntu
yum install screen # centos

screen -S <name> # 创建名为name的screen,名自己取
./mcl # 运行你的mcl
# Ctrl + A, Ctrl + D之后,screen进入后台
screen -ls # 查看正在运行的screen
screen -r <id> # 打开id为<id>的screen

安装 Mirai 第三方 API

 我们将使用一个名为 Ariadne 的第三方库,它是一个异步通信库

安装

pip install graia-ariadne

编写代码

Ariadne代码


from graia.ariadne.app import Ariadne
from graia.ariadne.message.element import Plain
from graia.ariadne.message.parser.base import MentionMe
from graia.ariadne.model import Member
from graia.ariadne.model import Group


app = Ariadne(
    config(
        verify_key="verifyKey",  # 输入
        account=机器人QQ号 
    )
)

# 如果有艾特机器人的消息,那么就进入该函数
@app.broadcast.receiver("GroupMessage", decorators=[MentionMe()])
async def group_message_listener(app_bot: Ariadne, group: Group, chain: MessageChain, src: Source, member: Member):
    input_message = "" # 保存了文本消息
    tmpcontent = chain.content[1:] # 第一个应该是艾特机器人的,所以跳过
    for msg in tmpcontent:
        if msg.type == 'Plain': # 只使用文本消息
            input_message += str(msg)
	
    print(group.id) # 群qq号
    print(member.id) # 发送人qq号
    # 其中quote是表示回复的方式发送消息
    await app_bot.send_message(group, MessageChain([Plain("hello world")]), quote=src)


app.launch_blocking()

OpenAi代码

import openai
openai.api_key = "sk********************1" # 你的 SECRET KEY
# msgList: [ {'role': 'user', 'content': your question}, {'role': 'assistant', 'content': gpt reply} ]
try:
    completion = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=msgList # 列表格式,形如上面注释
    )
    reply = completion.choices[0].message["content"]
except BaseException as e: # 异常处理
	print(e) 

文字以图片形式发送

 考虑到很多关键字不好过滤,那么就以图片发送文字

from PIL import Image, ImageDraw, ImageFont
import time
import unicodedata

# 图片需要自己设置长宽,如果使用我的默认设置,那就不需要更改,否则有些显示不全自动调整

max_tab = 5 # 最大允许缩进tab
line_length_max = 50 # 一行字符最长能容纳50个单字符,自行设置
font_size = (24, 48)  # 字体 (宽,高)
line_space = 5

# 需要自行下载微软雅黑字体(可用其他字体,但需要是ttf或otf,woff不行)
# 目前我没找到支持 emoji 的ttf字体
myfont = ImageFont.truetype("weiruanyahei.ttf", 48) 
start_point = (100, 100) # 开始写字的点

def toImg(strs: list[str], path: str) -> str:
    w = line_length_max * (font_size[0]) + 3 * start_point[0] # 图宽
    h = len(strs) * (font_size[1] + line_space) + 3 * start_point[1] # 图高
    # 以黑色,半透明的形式画
    img = Image.new("RGBA", (w, h), color=(255,255,255,50))
    cavens = ImageDraw.Draw(img, "RGBA") 
    
    # 拼接字符串,方便而已
    news = ""
    for s in strs:
        news += s
    news = news.strip() # 去除多余空白字符
    
    cavens.text(start_point, news, font=myfont, fill="#00FF00") # 以绿色书写
    # img.show('测试') # 显示
    newpath = path + '_' + time.strftime("%Y%m%d%H%M%S", time.localtime()) + '.png'
    img.save(newpath) # 保存
    return newpath # 返回路径


def wrap(text) -> list[str]:
    text += '\n' # 只是为了方便写代码,所以多加一行无实际意义的换行
    tabs = max_tab
    str_list = []
    tmp = ""
    line_size = 0
    text = text.replace('    ', '\t') # 以四个空格作为tab
    for ch in text:
        if ch == '\t':
            if line_size + 2 > line_length_max:
                str_list.append(tmp)
                tmp = ""
                line_size = 0
            if tabs > 0:
                tmp += '  '
                line_size += 2
            tabs -= 1
        elif ch == '\n':
            tabs = max_tab
            if len(tmp) > 0:
                str_list.append(tmp + '\n')
                tmp = ""
            else:
                str_list.append('\n')
            line_size = 0
        else:
            tabs = max_tab
            if line_size >= line_length_max:
                str_list.append(tmp + '\n')
                tmp = ""
                line_size = 0
            tmp += ch
            if unicodedata.east_asian_width(ch) == 'W':
                line_size += 2
            else:
                line_size += 1
    return str_list


def textToIMG(text: str, path: str) -> str:
    strs = wrap(text)
    file = toImg(strs, path)
    return file


if __name__ == '__main__':
    t = textToIMG("这是一个测试字符串\nfjlaksdfjalsgj", "测试路径")

完整工程

在我的GitHub,直接换自己的key和密码就能用

0

评论区