1 介绍
开源项目 "chatgpt-on-wechat" 支持通过微信公众号进行调用,这意味着用户可以在与公众号的交互中体验 ChatGPT。由于服务是部署在远端服务器上的,因此用户只需拥有一部手机,就可以在任何环境下与 ChatGPT 进行交流。例如:
为了实现这一功能,至少需要以下资源:
- 拥有 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 服务器端配置
下载配置文件:
$ wget https://open-1317903499.cos.ap-guangzhou.myqcloud.com/docker-compose.yml
修改 yml 文件,我在其中加入了目录映射,以方便后续调试;另外,千万注意映射端口。由于该项目默认以普通聊天模型启动,因此并未对外映射端口。然而,微信公众号的服务模型需要通过 Web 方式提供服务,这就需要端口进行外部映射。
volumes:
- /home/ubuntu/wechat/:/opt/wechat/```
ports:
- "80:80"
启动镜像
$ su # 切换 root 用户
$ apt-get install docker-compose
$ docker-compose up -d
$ docker images
用 docker images 可以看到 zhayujie/chatgpt-on-wechat 大小为 1.48GB,也不算太大。
进入 docker:
$ docker exec -it chatgpt-on-wechat bash
如果帐号主体为个人,则无法开通微信认证。个人用户在 config.py 中需设置 channel_type 为 wechatmp。
修改 config.json,至少设置以下内容:
"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
2.2 设置公众号
- 使用浏览器登录微信公众号界面。
- 在公众号界面,选择左侧的 " 设置与开发 " -> " 基本配置 "。
- 进行服务器配置的修改。
- 特别需要注意的是,服务器地址必须加上 /wx,例如:http://xxx.com/wx。
- 点击“启用”按钮。如果操作反应较慢,没有立即生效,可以稍等一会再刷新。
如果希望提供其他公众号调试功能,可以通过以下路径进行开发调试:公众号界面 -> 开发者工具 -> 在线接口调试工具。
由于我的微信公众号是个人号,因此并未开启客服接口,这意味着公众号无法主动发送消息,只能被动回复。微信官方对被动回复设有 5 秒的时间限制,并且最多只能重试 2 次,这就意味着只有最多 15 秒的自动回复时间窗口。也就是说,如果在 15 秒内 ChatGPT 还没有返回结果,那么就无法对用户回复。
另外,由于对话功能需要使用 token,会产生一定的费用。因此,在我的公众号中,我会在稍微限制一下这项功能后才会开启它。