AI客服对接微信公众平台

兰涛 lands

前言

我之前使用了 FastGPT + oneAPI 、自主选择模型的方式进行智能客服对话,在开源的产品中,这样的效果是比较 OK 的,由于需要对接微信公众平台,因此,我选择了 chatgpt-on-wechat。

准备工作

docker-compose.yml
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
version: "2.0"
services:
chatgpt-on-wechat:
ports:
- "8080:8080" # 将容器的8080端口映射到宿主机的8080端口
image: zhayujie/chatgpt-on-wechat
container_name: chatgpt-on-wechat
security_opt:
- seccomp:unconfined
environment:
MODEL: "gpt-3.5-turbo"

OPEN_AI_API_KEY: "xxx-xxxx"
OPEN_AI_API_BASE: "https://-xxx.xxx.com/api/v1"
# wechatmp的配置
channel_type: "wechatmp_service" # wechatmp
wechatmp_token: "xxx" # 微信公众平台的Token
wechatmp_port: 8080 # 微信公众平台的端口需要端口转发到80或443
wechatmp_app_id: "xxx" # 微信公众平台的appID
wechatmp_app_secret: "xxxx" # 微信公众平台的appsecret
wechatmp_aes_key: "xxx" # 微信公众平台的EncodingAESKey,加密模式需要
voice_reply_voice: "True"
PROXY: ""
HOT_RELOAD: "False"
SINGLE_CHAT_PREFIX: '[""]'
SINGLE_CHAT_REPLY_PREFIX: ""
GROUP_CHAT_PREFIX: '[""]'
GROUP_NAME_WHITE_LIST: '[""]'
IMAGE_CREATE_PREFIX: '[""]'
CONVERSATION_MAX_TOKENS: 1000
SPEECH_RECOGNITION: "False"
CHARACTER_DESC: "你是AI机器人, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。"
SUBSCRIBE_MSG: "感谢您的关注!😊😉我是人工智能客服,请问有什么可以帮您。"
EXPIRES_IN_SECONDS: 3600
USE_GLOBAL_PLUGIN_CONFIG: "True"
USE_LINKAI: "False"
LINKAI_API_KEY: ""
LINKAI_APP_CODE: ""
执行命令
1
docker-compose up -d

关键点

  • 微信公众平台的 Token、EncodingAESKey、appID、appsecret,需要到微信公众平台的后台获取,官方都有介绍我不再追述。
  • 需要将容器内部的wechatmp_port: 8080 映射到外部,issues:1960
  • 在公众平台开启了消息服务器配置后,微信公众平台会自动关闭自动回复功能,菜单功能等等。需要通过配置 IP 白名单,将当前服务器 IP 添加到白名单中,通过调用接口生成菜单,详情见下文。
  • fastGPT 使用的规范是和 OPENAI 的gpt-3.5-turbo一致的,所以可以直接使用这个规则进行配置,但是fastGPT使用的一个独立的设置chatID,他通过了chatID来进行会话的判断,但是在 COW 中适配的模型中、包括gpt-3.5-turbo自身也是没有chatID这一机制的,issues:1617 issues:12031 ,在这两个 issues, 能看到有热心网友提供能临时解决这个问题的办法,可以通过源码部署的方式修改代码解决;也能看到两家都不想解决这个问题,我也不想解决,谁有时间去研究一下提一个 PR 吧。

菜单配置

config.py
1
2
3
4
5
# 配置文件,用于存储微信公众号的相关配置信息

WECHAT_APPID = 'xxx'
WECHAT_SECRET = 'xxx'
TOKEN = 'xxx'
menu.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"button": [
{
"name": "合作方",
"sub_button": [
{
"type": "view",
"name": "入围xxx",
"url": "https://xxxxx"
},
{
"type": "view",
"name": "入围xxx",
"url": "https://xx.xxx.com/o/xx"
}
]
},
{
"type": "view",
"name": "联系客服",
"url": "xxxx"
}
]
}
wechat_menu.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
import requests
import json
from config import WECHAT_APPID, WECHAT_SECRET

# 获取 access token


def get_access_token(appid, secret):
url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={secret}"
print("发出请求获取 access token")
response = requests.get(url)
if response.status_code == 200:
data = response.json()
return data.get('access_token')
else:
print(f"获取 access token 失败: {response.text}")
return None

# 创建菜单


def create_menu(access_token, menu_data):
print("进入create_menu")

url = f"https://api.weixin.qq.com/cgi-bin/menu/create?access_token={access_token}"
response = requests.post(url, data=menu_data.encode('utf-8'))
if response.status_code == 200:
data = response.json()
if data.get('errcode') == 0:
print("菜单创建成功")
else:
print(f"菜单创建失败: {data}")
else:
print(f"请求失败: {response.text}")


print("开始")
access_token = get_access_token(WECHAT_APPID, WECHAT_SECRET)
print(f"access_token: {access_token}")
if access_token:
with open('menu.json', 'r', encoding='utf-8') as file:
menu_data = file.read()
create_menu(access_token, menu_data)

执行 wechat_menu.py,注意需要配置 IP 白名单

菜单设置参考文档

  • 标题: AI客服对接微信公众平台
  • 作者: 兰涛
  • 创建于 : 2024-06-11 09:12:31
  • 更新于 : 2024-06-11 09:57:30
  • 链接: https://lands.work/e34b2898/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
此页目录
AI客服对接微信公众平台