/botchan

基于微信测试号的ChatBot,对接OpenAI API

Primary LanguageJavaScriptGNU General Public License v3.0GPL-3.0

BotChan · Bot酱

Bot酱使用微信测试号对接任何兼容OpenAI规范的API接口(例如API+API2D),实现ChatBot。

⚠️ 特别提示

如果配置好以后,服务器端有日志输出,但微信无反应,日志提示 get access token failed,那么恭喜你遇到微信测试号平台的Bug了。尤其是对于刚开通的账号。可以试试手动退出微信测试号平台,重新扫码登录,查看 appsecret 是不是变了,然后改用新的 appsecret 。

安装和配置

准备资料

  1. 访问并开通微信测试号

将页面上的 appID、appsecret作为环境变量

- MP_APPID=appID
- MP_APPSECRET=appsecret
  1. 随机编写一个Token
- MP_TOKEN=your-random-token
  1. 设置 OpenAI 接口

如果要使用 OpenAI 官方接口,需要将镜像部署在海外,否则很可能网络不通

OpenAI 配置示例

- DEFAULT_API_URL=https://api.openai.com
- DEFAULT_API_KEY=sk...
- DEFAULT_MODEL=gpt-3.5-turbo

API2D 配置示例

- DEFAULT_API_URL=https://oa.api2d.net
- DEFAULT_API_KEY=fk...
- DEFAULT_MODEL=gpt-3.5-turbo
  1. 设置触发词

可通过以下环境变量设置触发词,设置后只有包含触发词的对话才会触发AI答复。如果测试为空,那么每一句都可以触发AI答复。

DEFAULT_API_WORD=
  1. 对话命令和默认参数锁定

设置的默认值可以通过 /setXXX 命令(针对每个人)进行配置,可通过 /help 查看。

但某些参数你可能不希望用户修改,可以用以下环境变量锁定:

LOCK_API_URL=true
LOCK_API_KEY=true
LOCK_API_WORD=true
LOCK_MODEL=true
  1. 启动服务后(见后),记得将回调地址和Token回填到微信测试号设置页面。

Docker

请按上文介绍修改环境变量

确保对 ./data 有写权限,或者挂到有权限的地方去

docker run -d --name bot \
-e MP_APPID= \
-e MP_APPSECRET= \
-e MP_TOKEN= \
-e DEFAULT_API_URL=https://oa.api2d.net \
-e DEFAULT_API_WORD= \  
-e DEFAULT_API_KEY=fk... \
-e LOCK_API_URL=true \
-e LOCK_API_KEY=true \
-e LOCK_MODEL=true \
-e DB_TYPE=json \
-v ./data:/data \
-p 80:9000 \
easychen/botchan:latest

Docker-compose

请按上文介绍修改环境变量

确保对 ./data 有写权限,或者挂到有权限的地方去

复制 docker-compose.example.ymldocker-compose.yml,并根据需要修改环境变量:

version: '3'
services:
  bot:
    image: easychen/botchan
    environment:
      - MP_APPID=
      - MP_APPSECRET=
      - MP_TOKEN=
      - DEFAULT_API_URL=https://oa.api2d.net
      - DEFAULT_API_WORD=
      - DEFAULT_API_KEY=fk...
      - LOCK_API_URL=true
      - LOCK_API_KEY=true
      - LOCK_MODEL=true
      - DB_TYPE=json
    volumes:
      - ./data:/data
    ports:
      - 80:9000

启动服务

docker-compose up -d

nodejs 安装见最后

回填Token和回调地址

启动服务后,我们可以获得回调地址。如果IP/域名是xxx.xxx.xxx.xxx:xxxx,那么回调地址http://xxx.xxx.xxx.xxx:xxxx/wechat

如果你在本机测试,需要使用 ngrok 等内网穿透工具创建一个公网可以访问的域名

回到测试号设置页面,点击 接口配置信息 后的修改链接,会将 回调地址TOKEN( 即 MP_TOKEN ) 填入并保存。

使用

用微信扫描测试号设置页面的二维码,关注测试号以后,可以发送问题。也可以通过 /setXXX 命令进行针对个人的配置。

可以通过 /help 查看可用命令。

你可以将测试号「发送到桌面」,作为快速进入的入口。这样就不用在微信里边到处找了

高级配置

模型配置

可以进一步指定模型参数优化需要的答复

- MAX_TOKEN=1000 #返回的最大token数
- TEMPERATURE=0.8 #模型的temperature
- TIMEOUT=180 #超时秒数
- STREAM=true #是否采用流式传输 

AZURE 支持

Bot酱兼容 Azure 接口,将 DEFAULT_API_URL 指定为 Azure Endpoint( https://xxx.openai.azure.com ) 即可。

Azure 的 Deployment 需要和 azure 的 model name 保持一致。

在通过命令或者配置文件指定模型时,请使用 OpenAI 官方的名称,如 gpt-3.5-turbo

截断设置

过长文字可能导致内容无法返回,会截断为多条。

注意:受微信平台限制,每次互动,只能最多回复五条消息,因此不要将字数设置太低,可能导致超过五条

- REPLY_CHUNK_LENGHT=1000 #字数

使用 NodeJS 架设服务

包依赖安装

node18

yarn add api2d body-parser cors cross-fetch dotenv express express-xml-bodyparser knex mysql2 simple-json-db

node16.13.1

yarn add api2d body-parser cors cross-fetch dotenv express express-xml-bodyparser knex mysql2@3.0.1 simple-json-db

启动服务 node index.js 端口 9000

将用户设置保存到数据库

默认情况下,用户设置保存在 /data/db.json ,这要求运行环境可写;你也可将用户设置保存在 MySQL中。

MySQL 表初始化

CREATE TABLE `data` (
  `id` int NOT NULL AUTO_INCREMENT,
  `key` varchar(255) NOT NULL,
  `value` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `key` (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

MySQL 环境变量

- DB_HOST
- DB_PORT
- DB_USER
- DB_PASSWD
- DB_NAME

切换用户配置保存模式

- DB_TYPE=mysql2