聊天机器人的探索笔记

本文最后更新于:2023年3月3日 下午

这里会记录一些尝试做个能够进行交流的机器人的笔记

1 QQ对话机器人

安装Mirai

通过Mirai来收发QQ消息,安装前需要弄java环境,我是WIN11直接winget

1
winget install Microsoft.OpenJDK.17

下载MCL并且解压,找个好位置,之后通过终端执行里面的命令。
或者MCL Installer Auto Release

1
2
./mcl --update-package net.mamoe:mirai-api-http --channel stable-v2 --type plugin
./mcl -u

输入自动登录的账号密码

1
/autoLogin add QQ号 QQ密码

然后Ctrl+C退出mcl

可对配置文件进行修改mcl-2.1.0\config\net.mamoe.mirai-api-http\setting.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
adapters:
- http
- ws
debug: false
enableVerify: true
verifyKey: 123456
singleMode: false
cacheSize: 4096
adapterSettings:
http:
host: '0.0.0.0'
port: 12345 #开发的端口,被占用就换一个
cors: [*]
ws:
host: '0.0.0.0'
port: 12346
reservedSyncId: -1

之后再运行mcl

1
./mcl

这时候会让你验证,弹个这个出来

手机打开开发者模式,打开USB调试,插上电脑,然后电脑和手机都打开谷歌浏览器,电脑浏览器输入地址chrome://inspect/#devices显示如下界面

1
![](聊天机器人的探索笔记/p_2.png)

在几个标签中随便点击一个inspect,弹出新窗体,就是同步了手机浏览器,右边会自动打开网络调试

将mcl弹窗出来的那个地址复制到这里,然后手动进行验证,完成后再网络消息中找到个叫cap_union_new_verify的消息,点开后再preview中找到ticket,复制粘贴到mcl的弹窗中,回车。之后就显示登录成功Bot login successful
这时候给QQ发个消息,控制台也能看见了

conda下安装graia-ariadne

创建个新环境

1
2
3
conda create -n robot python=3.10
activate robot
pip install graia-ariadne

自动回答示例

test.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from creart import create
from graia.ariadne.app import Ariadne
from graia.ariadne.connection.config import (
HttpClientConfig,
WebsocketClientConfig,
config,
)
from graia.ariadne.event.message import GroupMessage
from graia.ariadne.message.chain import MessageChain
from graia.ariadne.model import Group
from graia.broadcast import Broadcast
from graia.ariadne.entry import Ariadne, Friend, MessageChain, config

app = Ariadne(
config(
3507824822, # 你的机器人的 qq 号
"123456", # 填入你的 mirai-api-http 配置中的 verifyKey
# 以下两行(不含注释)里的 host 参数的地址
# 是你的 mirai-api-http 地址中的地址与端口
# 他们默认为 "http://localhost:8080"
# 如果你 mirai-api-http 的地址与端口也是 localhost:8080
# 就可以删掉这两行,否则需要修改为 mirai-api-http 的地址与端口
HttpClientConfig(host="http://localhost:12345"),
WebsocketClientConfig(host="http://localhost:12346"),
)
)

@app.broadcast.receiver("FriendMessage")
async def friend_message_listener(app: Ariadne, friend: Friend,msg: MessageChain):
if msg.display == "你好":
await app.send_message(
friend,
MessageChain(f"你说 {msg.display},我说滚"),
)

@app.broadcast.receiver("GroupMessage")
async def Group_message_listener(app: Ariadne, group: Group,msg: MessageChain):
if msg.display == "你好":
await app.send_message(
group,
MessageChain(f"你说 {msg.display},我说滚"),
)

Ariadne.launch_blocking()

再conda的robot环境下执行,然后发个消息

1
python test.py

各种问题

在mcl运行报错

估计是plugins文件夹里面有重复插件,全部删掉重新./mcl -u,下面是错误消息

1
2
2022-12-15 16:00:56 E/main: Failed to init MiraiConsole.
net.mamoe.mirai.console.plugin.loader.PluginLoadException: Exception while enabling net.mamoe.mirai-api-http

执行Ariadne是报链接错误

首先检测一下端口和verifyKey是否匹配,然后尝试换个端口

1
graia.amnesia.builtins.aiohttp:connection_manage:231 - 404, message='Invalid response status', url=URL('http://localhost:8080/all?qq=3507824822&verifyKey=12345')

Mirai登录时:当前网络不稳定,登录失败

  • 删除 bots/…/ 下全部文件
  • 保持机器人账号手机端QQ登录
  • 在手机端QQ 设置/账号安全/登陆设备管理 中将历史设备删除

Mirai登录时:当前QQ版本 过低

1
vim ./config/Console/AutoLogin.yml

修改:

1
protocol: ANDROID_PAD

删除bots,重新滑块登录,其他登录问题可见这里,如果登录被限制可以尝试等待1日。

openAI对话模型

官网,需要梯子,账号注册还屏蔽了很多梯子,并且需要国外手机号,可以使用虚拟号搞定。
建立好账号后在这里获取API 密钥,之后就不需要梯子了。

这个API是openAI的,和chatgpt的区别是,chatgpt是一个固定的模型,而openAI的API是一个通用的API,选择模型执行功能。chatgpt它没有开发API,但是有逆向工程,等之后我去玩玩了在写,不过听说泄密的模型也不是真正的chatgpt,text-chat-davinci-002-20221122是一个早期的版本。

3月3日更新:官网已经给出了类似chatgpt的模型turbo,详细使用可见官网文档,关于openai之后应该会在写一文,就不在这儿缝补了

直接请求方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests
api_key = 'sk-xxx'
response = requests.post(
'https://api.openai.com/v1/completions',
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {api_key}'
},
json = {
'model': 'text-davinci-003', # 选择模型,问答就选它,其他没试过
'prompt': '你好', # 对话
'temperature': 0.4, # 回答选取范围,越大越随机,如果为0则选取最大概率的回答
'max_tokens': 300, # 最大回答长度
'n': 2, # 返回的回答数量,比如你选择2,则会回复两种回答
stop : ['a', 'b'] # 结束符,当回答中出现这些字符时,结束回答
}
)
json = response.json()
print(json['choices'][0]['text'])

openai官方的python库

1
2
3
4
5
6
7
8
import openai
openai.api_key = f'sk-xxx'
response = openai.Completion.create(
engine = 'text-davinci-003',
prompt = '你好',
temperature = 0.7,
max_tokens = 300)
response['choices'][0]['text']

acheong08的chatgpt反向工程

2.13补充:鉴于这东西日新月异,以下很可能过时了,还是以下方逆向工程的仓库为准吧
2.21补充:下文的确过时了,懒得改,可以参考 我用它的方案对接chatgpt和bingchat的机器人仓库,因为我会自己用,所有肯定会更新到能用的版本

官网,需要梯子,就是上面的openAI开发的,注册后可以直接网页端玩。以下是使用逆向工程进行。
工程文档中有官方API和网站版两种方式,前者是用泄露的模型,调用chatgtp的官方接口进行的,完全没有任何限制,但是收费,每个账号有免费额度,也可以用用

网站版方式实际上就是模拟了网站访问,所以它和网站有相同的限制,即每小时通话次数限制和相应速度慢等问题。不过它是完全不要钱的并且觉得是真真实实的chatgpt。麻烦就是运行环境的梯子要没被它给屏蔽了

这东西迟早要收费,和github copilot一样。所有以下实现摇摇欲坠,不知道那天就不能用咯~

Official API方式

1
export GPT_ENGINE="text-davinci-003"

仓库提供的示例

直接使用提供的示例,还是去OPENAI负责api-key

1
2
pip3 install revChatGPT
OfficialChatGPT --api_key API_KEY --stream

OfficialChatGPT命令有三个参数,–api_key就是填写注册后的key,–stream输出是如同打字一般逐个吐出来还是等待接收完成后全部显示。–temperature表示回答的随机程度,越大越随机,越小越不随机,但是如果为0则会选取最大概率的回答。

进入问答后有如下几个参数

1
2
3
4
5
6
7
8
9
!help - Display this message
!rollback - Rollback chat history
!reset - Reset chat history
!prompt - Show current prompt
!save_c <conversation_name> - Save history to a conversation 保存对话记录
!load_c <conversation_name> - Load history from a conversation 加载对话记录
!save_f <file_name> - Save all conversations to a file 保存对话记录到文件
!load_f <file_name> - Load all conversations from a file 加载对话记录到文件
!exit - Quit chat 退出聊天会话

浓缩

先假定已经具备能对微信、QQ电报啥的进行收发的功能,那么只需要要写的部分就只有传入消息,得到结果,传出消息,以下就是个简单示例

1
2
3
4
from revChatGPT import Official
def liteAI(inputText):
response = chatbot.ask(inputText, temperature=0.5)
return response["choices"][0]["text"]

结合前面的对接到QQ上,效果如下:

用着用着可能会遇到这个问题

1
InvalidRequestError: That model does not exist

也可能遇到这个问题:

1
The server is overloaded or not ready yet.

简而言之,摇摇欲坠,毕竟用的泄露出来的接口,不知道啥时候就没了

ChatGPT网站版

这种方式内在其实就是用你的openai的账号密码登录了那个chatgpt试用网站来对话。 先自己直接登录chatgpt试用一下,能上去在尝试用这个方式了。

启用

在revChatGPT文件夹下添加配置文件config.json

1
2
3
4
{
"email": "<your email>",
"password": "your password"
}

然后执行:

1
python Unofficial.py

参考


聊天机器人的探索笔记
https://blog.kala.love/posts/c367c10b/
作者
Lissettecarlr
发布于
2022年12月15日
许可协议