#公众号 #聊天

1 介绍

开源项目 "chatgpt-on-wechat" 支持通过微信公众号进行调用,这意味着用户可以在与公众号的交互中体验 ChatGPT。由于服务是部署在远端服务器上的,因此用户只需拥有一部手机,就可以在任何环境下与 ChatGPT 进行交流。例如:

|250

为了实现这一功能,至少需要以下资源:

  • 拥有 OPENAI 账号,并能通过 token 来调用聊天工具。
  • 注册并管理一个微信公众号。
  • 拥有一个配备域名的服务器,或者可以使用托管服务器

实现这项功能的工作流程可以分为两个主要步骤:

  • 在服务器上部署并配置 chatgpt-on-wechat 服务。
  • 在微信公众号后台设置并链接服务器。

虽然 chatgpt-on-wechat 的开源项目中已经提供了详细的使用指南,但在实际部署过程中,我还是遇到了一些小问题。以下记录了我操作的大致步骤,及注意事项。

chatgpt-on-wechat 帮助文档:https://github.com/zhayujie/chatgpt-on-wechat/blob/master/channel/wechatmp/README.md

2 方法

2.1 服务器端配置

下载配置文件:

1
$ wget https://open-1317903499.cos.ap-guangzhou.myqcloud.com/docker-compose.yml

修改 yml 文件,我在其中加入了目录映射,以方便后续调试;另外,千万注意映射端口。由于该项目默认以普通聊天模型启动,因此并未对外映射端口。然而,微信公众号的服务模型需要通过 Web 方式提供服务,这就需要端口进行外部映射。

1
2
3
4
volumes:
- /home/ubuntu/wechat/:/opt/wechat/```
ports:
- "80:80"

启动镜像

1
2
3
4
$ su # 切换 root 用户
$ apt-get install docker-compose
$ docker-compose up -d
$ docker images

用 docker images 可以看到 zhayujie/chatgpt-on-wechat 大小为 1.48GB,也不算太大。

进入 docker:

1
$ docker exec -it chatgpt-on-wechat bash

如果帐号主体为个人,则无法开通微信认证。个人用户在 config.py 中需设置 channel_type 为 wechatmp。

修改 config.json,至少设置以下内容:

1
2
3
4
5
6
7
8
9
"channel_type": "wechatmp",     # 如果通过了微信认证,将"wechatmp"替换为"wechatmp_service",可极大的优化使用体验
"wechatmp_token": "xxxx", # 微信公众平台的Token
"wechatmp_port": 80, # 微信公众平台的端口,需要端口转发到80或443
"wechatmp_app_id": "xxxx", # 微信公众平台的appID
"wechatmp_app_secret": "xxxx", # 微信公众平台的appsecret
"wechatmp_aes_key": "", # 微信公众平台的EncodingAESKey,加密模式需要
"single_chat_prefix": [""], # 推荐设置,任意对话都可以触发回复,不添加前缀
"single_chat_reply_prefix": "", # 推荐设置,回复不设置前缀
"plugin_trigger_prefix": "&", # 推荐设置,在手机微信客户端中,$%^等符号与中文连在一起时会自动显示一段较大的间隔,用户体验不好。请不要使用管理员指令前缀"#",这会造成未知问题。

设置好之后启动 app.py

1
$ python app.py

2.2 设置公众号

2.2.1 设置方法

  • 使用浏览器登录微信公众号界面。
  • 在公众号界面,选择左侧的 " 设置与开发 " -> " 基本配置 "。
  • 进行服务器配置的修改。
  • 点击“启用”按钮。如果操作反应较慢,没有立即生效,可以稍等一会再刷新。

2.2.2 注意事项

  • 如果希望提供其他公众号调试功能,可以通过以下路径进行开发调试:公众号界面 -> 开发者工具 -> 在线接口调试工具。
  • 服务只允许设置 http 端口 80 和 https 端口 443,而一般情况下我们网站的 Web 端口都会被占用,如果遇到这种情况,建立使用 nginx 反向代理 对请求分流。Web服务_Nginx

由于我的微信公众号是个人号,因此并未开启客服接口,这意味着公众号无法主动发送消息,只能被动回复。微信官方对被动回复设有 5 秒的时间限制,并且最多只能重试 2 次,这就意味着只有最多 15 秒的自动回复时间窗口。也就是说,如果在 15 秒内 ChatGPT 还没有返回结果,那么就无法对用户回复。

另外,由于对话功能需要使用 token,会产生一定的费用。因此,在我的公众号中,我会在稍微限制一下这项功能后才会开启它。