您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
lanvent 8f72e8c3e6 formatting code 1年前
..
README.md formatting code 1年前
ServiceAccount.py formatting code 1年前
SubscribeAccount.py formatting code 1年前
common.py formatting code 1年前
receive.py formatting code 1年前
reply.py formatting code 1年前
wechatmp_channel.py formatting code 1年前

README.md

微信公众号channel

鉴于个人微信号在服务器上通过itchat登录有封号风险,这里新增了微信公众号channel,提供无风险的服务。 目前支持订阅号(个人)和服务号(企业)两种类型的公众号,它们的主要区别就是被动回复和主动回复。 个人微信订阅号有许多接口限制,目前仅支持最基本的文本对话和语音输入,支持加载插件,支持私有api_key。 暂未实现图片输入输出、语音输出等交互形式。

使用方法(订阅号,服务号类似)

在开始部署前,你需要一个拥有公网IP的服务器,以提供微信服务器和我们自己服务器的连接。或者你需要进行内网穿透,否则微信服务器无法将消息发送给我们的服务器。

此外,需要在我们的服务器上安装python的web框架web.py。 以ubuntu为例(在ubuntu 22.04上测试):

pip3 install web.py

然后在微信公众平台注册一个自己的公众号,类型选择订阅号,主体为个人即可。

然后根据接入指南的说明,在微信公众平台的“设置与开发”-“基本配置”-“服务器配置”中填写服务器地址URL和令牌Token。这里的URLexample.com/wx的形式,不可以使用IP,Token是你自己编的一个特定的令牌。消息加解密方式目前选择的是明文模式。

相关的服务器验证代码已经写好,你不需要再添加任何代码。你只需要在本项目根目录的config.json中添加

"channel_type": "wechatmp",
"wechatmp_token": "Token",  # 微信公众平台的Token
"wechatmp_port": 8080,      # 微信公众平台的端口,需要端口转发到80或443
"wechatmp_app_id": "",      # 微信公众平台的appID,仅服务号需要
"wechatmp_app_secret": "",  # 微信公众平台的appsecret,仅服务号需要

然后运行python3 app.py启动web服务器。这里会默认监听8080端口,但是微信公众号的服务器配置只支持80/443端口,有两种方法来解决这个问题。第一个是推荐的方法,使用端口转发命令将80端口转发到8080端口(443同理,注意需要支持SSL,也就是https的访问,在wechatmp_channel.py需要修改相应的证书路径):

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo iptables-save > /etc/iptables/rules.v4

第二个方法是让python程序直接监听80端口。这样可能会导致权限问题,在linux上需要使用sudo。然而这会导致后续缓存文件的权限问题,因此不是推荐的方法。 最后在刚才的“服务器配置”中点击提交即可验证你的服务器。

随后在微信公众平台启用服务器,关闭手动填写规则的自动回复,即可实现ChatGPT的自动回复。

个人微信公众号的限制

由于人微信公众号不能通过微信认证,所以没有客服接口,因此公众号无法主动发出消息,只能被动回复。而微信官方对被动回复有5秒的时间限制,最多重试2次,因此最多只有15秒的自动回复时间窗口。因此如果问题比较复杂或者我们的服务器比较忙,ChatGPT的回答就没办法及时回复给用户。为了解决这个问题,这里做了回答缓存,它需要你在回复超时后,再次主动发送任意文字(例如1)来尝试拿到回答缓存。为了优化使用体验,目前设置了两分钟(120秒)的timeout,用户在至多两分钟后即可得到查询到回复或者错误原因。

另外,由于微信官方的限制,自动回复有长度限制。因此这里将ChatGPT的回答拆分,分成每段600字回复(限制大约在700字)。

私有api_key

公共api有访问频率限制(免费账号每分钟最多20次ChatGPT的API调用),这在服务多人的时候会遇到问题。因此这里多加了一个设置私有api_key的功能。目前通过godcmd插件的命令来设置私有api_key。

语音输入

利用微信自带的语音识别功能,提供语音输入能力。需要在公众号管理页面的“设置与开发”->“接口权限”页面开启“接收语音识别结果”。

测试范围

目前在RoboStyle这个公众号上进行了测试(基于wechatmp分支),感兴趣的可以关注并体验。开启了godcmd, Banwords, role, dungeon, finish这五个插件,其他的插件还没有测试。百度的接口暂未测试。语音对话没有测试。图片直接以链接形式回复(没有临时素材上传接口的权限)。

TODO

  • 服务号交互完善
  • 服务号使用临时素材接口,提供图片回复能力
  • 插件测试