From ce8635dd998c1bcdfea05689787d4d6bb82e84c3 Mon Sep 17 00:00:00 2001 From: JS00000 Date: Thu, 30 Mar 2023 01:01:00 +0800 Subject: [PATCH] pull request ready --- app.py | 2 +- channel/channel_factory.py | 2 +- channel/wechatmp/README.md | 32 ++++++++++++++++++++++++++++++++ config.py | 5 ++++- 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 channel/wechatmp/README.md diff --git a/app.py b/app.py index 8b9203f..a2e6b9c 100644 --- a/app.py +++ b/app.py @@ -19,7 +19,7 @@ def run(): # os.environ['WECHATY_PUPPET_SERVICE_ENDPOINT'] = '127.0.0.1:9001' channel = channel_factory.create_channel(channel_name) - if channel_name in ['wx','wxy']: + if channel_name in ['wx','wxy','wechatmp']: PluginManager().load_plugins() # startup channel diff --git a/channel/channel_factory.py b/channel/channel_factory.py index 905ea02..3d06154 100644 --- a/channel/channel_factory.py +++ b/channel/channel_factory.py @@ -17,7 +17,7 @@ def create_channel(channel_type): elif channel_type == 'terminal': from channel.terminal.terminal_channel import TerminalChannel return TerminalChannel() - elif channel_type == 'mp': + elif channel_type == 'wechatmp': from channel.wechatmp.wechatmp_channel import WechatMPServer return WechatMPServer() raise RuntimeError diff --git a/channel/wechatmp/README.md b/channel/wechatmp/README.md new file mode 100644 index 0000000..c0e7db1 --- /dev/null +++ b/channel/wechatmp/README.md @@ -0,0 +1,32 @@ +# 个人微信公众号channel + +鉴于个人微信号在服务器上通过itchat登录有封号风险,这里新增了个人微信公众号channel,提供无风险的服务。 +但是由于个人微信公众号的众多接口限制,目前支持的功能有限,实现简陋,提供了一个最基本的文本对话服务,支持加载插件,优化了命令格式,支持私有api_key。暂未实现图片输入输出、语音输入输出等交互形式。 +如有公众号是企业主体且可以通过微信认证,即可获得更多接口,解除大多数限制。欢迎大家提供更多的支持。 + +## 使用方法 + +在开始部署前,你需要一个拥有公网IP的服务器,以提供微信服务器和我们自己服务器的连接。或者你需要进行内网穿透,否则微信服务器无法将消息发送给我们的服务器。 + +此外,需要在我们的服务器上安装额外的依赖web.py和redis,其中redis用来储存用户私有的配置信息。 +以ubuntu为例(在ubuntu 22.04上测试): +``` +sudo apt-get install redis +sudo systemctl start redis +pip3 install redis +pip3 install web.py +``` + +然后在[微信公众平台](mp.weixin.qq.com)注册一个自己的公众号,类型选择订阅号,主体为个人即可。 + +然后根据[接入指南](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html)的说明,在[微信公众平台](mp.weixin.qq.com)的“设置与开发”-“基本配置”-“服务器配置”中填写服务器地址(URL)和令牌(Token)。这个Token是你自己编的一个特定的令牌。消息加解密方式目前选择的是明文模式。相关的服务器验证代码已经写好,你不需要再添加任何代码。你只需要将本项目根目录的`app.py`中channel_name改成"mp",将上述的Token填写在本项目根目录的`config.json`中,例如`"wechatmp_token": "Your Token",` 然后运行`python3 app.py`启动web服务器,然后在刚才的“服务器配置”中点击`提交`即可验证你的服务器。 + +随后在[微信公众平台](mp.weixin.qq.com)启用服务器,关闭手动填写规则的自动回复,即可实现ChatGPT的自动回复。 + +## 个人微信公众号的限制 +由于目前测试的公众号不是企业主体,所以没有客服接口,因此公众号无法主动发出消息,只能被动回复。而微信官方对被动回复有5秒的时间限制,最多重试2次,因此最多只有15秒的自动回复时间窗口。因此如果问题比较复杂或者我们的服务器比较忙,ChatGPT的回答就没办法及时回复给用户。为了解决这个问题,这里做了回答缓存,它需要你在回复超时后,再次主动发送任意文字(例如1)来尝试拿到回答缓存。为了优化使用体验,目前设置了两分钟(120秒)的timeout,用户在至多两分钟后即可得到查询到回复或者错误原因。 + +另外,由于微信官方的限制,自动回复有长度限制。因此这里将ChatGPT的回答拆分,分成每段600字回复(限制大约在700字)。 + +## 私有api_key +公共api有访问频率限制(免费账号每分钟最多20次ChatGPT的API调用),这在服务多人的时候会遇到问题。因此这里多加了一个设置私有api_key的功能,私有的api_key将储存在redis中。另外后续计划利用redis储存更多的用户个人配置。目前通过godcmd插件的命令来设置私有api_key。 diff --git a/config.py b/config.py index d455f45..7009c00 100644 --- a/config.py +++ b/config.py @@ -74,11 +74,14 @@ available_setting = { # wechaty的配置 "wechaty_puppet_service_token": "", # wechaty的token + # wechatmp的配置 + "wechatmp_token": "", # 微信公众平台的Token + # chatgpt指令自定义触发词 "clear_memory_commands": ['#清除记忆'], # 重置会话指令 # channel配置 - "channel_type": "wx", # 通道类型,支持wx,wxy和terminal + "channel_type": "wx", # 通道类型,支持:{wx,wxy,terminal,wechatmp} }