在QQ群机器人中使用ChatGPT
Nayn3
2022年12月05日 10:33

不知道本周你的朋友圈有没有被 ChatGPT 攻陷呢?一个可以帮你写代码、找 bug、写小说、写注释,各种工作都能搞定的文本机器人。比如,知乎的『电光幻影炼金术』提问过如何找男友的问题。

就这个神奇的聊天模型,也引发了 GitHub 的 ChatGPT 热潮,仅仅 2 天时间,便有 115 个相关的 repo。其中的revChatGPT库使用逆向工程解析了ChatGPT的API,从而可以使得我们将ChatGPT集成到自己的应用中!

ChatGPT 逆向工程地址: https://github.com/acheong08/ChatGPT

安装配置

要在机器人中使用API,仅需要简单的安装和配置

首先使用pip安装revChatGPT库

代码块
JavaScript
自动换行
复制代码
pip3 install revChatGPT --upgrade
复制成功

随后在转到https://chat.openai.com/chat并登录或注册

  1. F12打开Chrome控制台

  2. 打开Application选项卡 > Cookie

  1. 复制值__Secure-next-auth.session-token并将其粘贴到configsession_token的值。不需要管Authorization的值

配置机器人

安装nonebot之后(nonebot文档地址:https://v2.nonebot.dev/),在合适的路径下生成一个py文件即可。

在py文件中就可以编写自己的插件逻辑,为了使得能够与机器人直接对话设置为一个【。】句号来触发对话,最后将revChatGPT封装一下即可在nonebot中直接开始对话

代码块
JavaScript
自动换行
复制代码
from nonebot import get_driver
from .config import Config
from nonebot import on_command
from nonebot.adapters.onebot.v11 import Message, MessageEvent
from nonebot.params import CommandArg
from nonebot.log import logger
from revChatGPT.revChatGPT import Chatbot
from nonebot import require
import time
import asyncio

scheduler = require("nonebot_plugin_apscheduler").scheduler
global_config = get_driver().config


# 配置token
config = Config.parse_obj(global_config)

chatGPT = on_command("。", aliases={"."}, priority=10, block=True)

config = {
        "Authorization": "<Your Bearer Token Here>", # This is optional
        "session_token": config.session_token
}

user_session = dict()
# 初始化bot
chatbot = Chatbot(config)

def get_chat_response(session_id, prompt):
    if session_id in user_session:
        # 如果在三分钟内再次发起对话则使用相同的会话ID
        if time.time() < user_session[session_id]['timestamp'] + 60 * 3:
            chatbot.conversation_id = user_session[session_id]['conversation_id']
            chatbot.parent_id = user_session[session_id]['parent_id']
        else:
            chatbot.reset_chat()
    else:
        chatbot.reset_chat()
    

    try:
        resp = chatbot.get_chat_response(prompt, output="text")

        user_cache = dict()
        user_cache['timestamp'] = time.time()
        user_cache['conversation_id'] = resp['conversation_id']
        user_cache['parent_id'] = resp['parent_id']
        user_session[session_id] = user_cache

        return resp['message']
    except Exception as e:
        print(e)
        return f"发生错误: {str(e)}"

@chatGPT.handle()
async def _(event: MessageEvent, arg: Message = CommandArg()):
    session_id = event.get_session_id()
    msg = arg.extract_plain_text().strip()
    logger.debug(f"{session_id} {msg}")

    resp = await asyncio.get_event_loop().run_in_executor(None, get_chat_response, session_id, msg)
    await chatGPT.send(resp, at_sender = True)

# 定时刷新seesion_token
@scheduler.scheduled_job("interval", minutes=10)
async def refresh_session():
    logger.debug("refresh chatGPT session")
    chatbot.refresh_session()
scheduler.add_job(refresh_session)
复制成功

最后效果如下:

我们能够通过回复继续,让其继续补充说明

相关仓库

关于ChatGPT还有其他有趣的仓库例如:

  • 跑在你 macOS 状态栏的 ChatGPT https://github.com/vincelwt/chatgpt-mac

  • ChatGPT 的 Node.js 包装器。在官方 API 发布之前使用 headless Chrome。https://github.com/transitive-bullshit/chatgpt-api