
不知道本周你的朋友圈有没有被 ChatGPT 攻陷呢?一个可以帮你写代码、找 bug、写小说、写注释,各种工作都能搞定的文本机器人。比如,知乎的『电光幻影炼金术』提问过如何找男友的问题。
就这个神奇的聊天模型,也引发了 GitHub 的 ChatGPT 热潮,仅仅 2 天时间,便有 115 个相关的 repo。其中的revChatGPT库使用逆向工程解析了ChatGPT的API,从而可以使得我们将ChatGPT集成到自己的应用中!
ChatGPT 逆向工程地址: https://github.com/acheong08/ChatGPT

要在机器人中使用API,仅需要简单的安装和配置
首先使用pip安装revChatGPT库
pip3 install revChatGPT --upgrade 随后在转到https://chat.openai.com/chat并登录或注册
按F12打开Chrome控制台
打开Application选项卡 > Cookie

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

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

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