Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

个人微信公众号channel #686

Merged
merged 12 commits into from Apr 4, 2023
Merged

个人微信公众号channel #686

merged 12 commits into from Apr 4, 2023

Conversation

JS00000
Copy link
Contributor

@JS00000 JS00000 commented Mar 29, 2023

个人微信公众号channel

鉴于个人微信号在服务器上通过itchat登录有封号风险,这里新增了个人微信公众号channel,提供无风险的服务。
但是由于个人微信公众号的众多接口限制,目前支持的功能有限,实现简陋,提供了一个最基本的文本对话服务,支持加载插件,优化了命令格式,支持私有api_key。暂未实现图片输入输出、语音输入输出等交互形式。
如有公众号是企业主体且可以通过微信认证,即可获得更多接口,解除大多数限制。欢迎大家提供更多的支持。

使用方法

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

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

pip3 install web.py

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

然后根据接入指南的说明,在微信公众平台的“设置与开发”-“基本配置”-“服务器配置”中填写服务器地址(URL)和令牌(Token)。这个Token是你自己编的一个特定的令牌。消息加解密方式目前选择的是明文模式。相关的服务器验证代码已经写好,你不需要再添加任何代码。你只需要将本项目根目录的config.json中加入配置"channel_type": "wechatmp",将上述的Token也填写在config.json中,例如"wechatmp_token": "Your Token", 然后运行python3 app.py启动web服务器,然后在刚才的“服务器配置”中点击提交即可验证你的服务器。

随后在微信公众平台启用服务器,关闭手动填写规则的自动回复,即可实现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。

命令优化

之前plugin中#和$符号混用,且$这个符号在微信中和中文会有较大间隔,体验实在不好。这里我将所有命令更改成了以#开头。添加了一个叫finish的plugin来最后处理所有#结尾的命令,防止未知命令变成ChatGPT的query。

测试范围

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

@JS00000 JS00000 changed the title Wechatmp 个人微信公众号channel Mar 29, 2023
@lanvent lanvent requested a review from zhayujie March 29, 2023 18:47
@lanvent
Copy link
Collaborator

lanvent commented Mar 29, 2023

Hi,感谢PR,很好的扩展途径。我目前大致浏览了,还没有实际运行。

我先介绍下当时设计命令时的思路:"#"开头代表控制指令,是负责控制聊天系统的一类指令,而"$"代表插件指令,是负责用户和系统间交互的一类指令。所以我并不建议将它们两者合并。 我推荐的一种思路是,可以增加一个插件指令的设置项,用于规定指令的符号,"/&!^"这些都可以作为插件指令的开头,但不建议使用“#”。

目前不建议使用redis,减少用户需要安装的依赖,可以在config.py中维护一个字典使用pickle持久化,或者如果觉得并发控制有问题使用python自带的sqlite也是可以的。

因为插件名字是插件作者取的,还是不建议修改插件的name,而且name跟插件文件夹名不同可能会有未知问题(考虑可以在注册函数中增加一个新参数namecn来填写插件的中文名)

godcmd的这个简略版帮助我认为是很好的,但插件代码里不建议硬编码其他插件的名称来忽略打印帮助,忽略插件名列表可以作为Godcmd的一项新配置项来实现。 role插件中的指令也不建议硬改哈,也建议role中增加一个新配置项来修改指令。

@JS00000
Copy link
Contributor Author

JS00000 commented Mar 30, 2023

Hi,感谢PR,很好的扩展途径。我目前大致浏览了,还没有实际运行。

我先介绍下当时设计命令时的思路:"#"开头代表控制指令,是负责控制聊天系统的一类指令,而"$"代表插件指令,是负责用户和系统间交互的一类指令。所以我并不建议将它们两者合并。 我推荐的一种思路是,可以增加一个插件指令的设置项,用于规定指令的符号,"/&!^"这些都可以作为插件指令的开头,但不建议使用“#”。

目前不建议使用redis,减少用户需要安装的依赖,可以在config.py中维护一个字典使用pickle持久化,或者如果觉得并发控制有问题使用python自带的sqlite也是可以的。

因为插件名字是插件作者取的,还是不建议修改插件的name,而且name跟插件文件夹名不同可能会有未知问题(考虑可以在注册函数中增加一个新参数namecn来填写插件的中文名)

godcmd的这个简略版帮助我认为是很好的,但插件代码里不建议硬编码其他插件的名称来忽略打印帮助,忽略插件名列表可以作为Godcmd的一项新配置项来实现。 role插件中的指令也不建议硬改哈,也建议role中增加一个新配置项来修改指令。

谢谢这些有用的建议,我会修改一下

@LeafBanks
Copy link

1.既然是公众号,能不能把所有的公众号补全?
2.有私有化key,就有免费的共有key,它的长度能不能控制
3.能不能在公众号这个插件里再接各种插件

@lichengzhe
Copy link
Contributor

企业号可以合并进来么,这个能跑通企业号应用,已实测,但基于的老版本的fork,谢谢。
https://github.com/mostlittlebee/chatgpt-on-wecom

@JS00000
Copy link
Contributor Author

JS00000 commented Apr 1, 2023

企业号可以合并进来么,这个能跑通企业号应用,已实测,但基于的老版本的fork,谢谢。 https://github.com/mostlittlebee/chatgpt-on-wecom

稍后我一并处理一下

@lichengzhe
Copy link
Contributor

企业号可以合并进来么,这个能跑通企业号应用,已实测,但基于的老版本的fork,谢谢。 https://github.com/mostlittlebee/chatgpt-on-wecom

稍后我一并处理一下

大恩不言谢,兄弟后面还有个猛的,上安卓类RPA企微小bot就可以出圈到微信里了~这个可以晚点再看,方便可以微信交流leeczleecz
https://github.com/gallonyin/worktool

@6vision
Copy link
Collaborator

6vision commented Apr 4, 2023

这个更新可以啊,目前公众号比较稳!微信实在遭不住,什么时间可以合并或者可以先测试一下嘛~~微信:Bear_Ab

@oreeke
Copy link

oreeke commented Apr 4, 2023

bot-on-anything
这个作者不是已经做好了一个嘛,用werobot一直挺稳定的,要做的可能就是添加更多功能

@lichengzhe
Copy link
Contributor

bot-on-anything
这个作者不是已经做好了一个嘛,用werobot一直挺稳定的,要做的可能就是添加更多功能

咱这项目最纠结的就是功能都在这边,any那边支持的前端多😭😭😭

@oreeke
Copy link

oreeke commented Apr 4, 2023

bot-on-anything
这个作者不是已经做好了一个嘛,用werobot一直挺稳定的,要做的可能就是添加更多功能

咱这项目最纠结的就是功能都在这边,any那边支持的前端多😭😭😭

确实,而且大部分前端在git上都有更专一的项目在进行,尤其web,不知道作者的规划是什么样的,希望能加强公众号这一块儿

lanvent added a commit that referenced this pull request Apr 4, 2023
@lanvent lanvent merged this pull request into zhayujie:master Apr 4, 2023
@lanvent
Copy link
Collaborator

lanvent commented Apr 4, 2023

再次感谢,刚合并的时候好像操作错了一些东西,merge没有识别到,还好是合进去了

@oreeke
Copy link

oreeke commented Apr 5, 2023

刚简单测试了一下真香😊

@hdyyds666
Copy link

我要死了,用railway一键部署搞两天了,就是验证不了微信公众号的token。
而用个人微信号毫无问题
环境变量的json也改过了,日志也显示了是wechatmp,扫码登陆也消失了
variable 里面也把公众号的方式加进去了
"channel_type": "wechatmp", "wechatmp_token": "fbi", "wechatmp_port": "443", "wechatmp_app_id": "", "wechatmp_app_secret": ""

url用的这个
https://chatgpt-on-wechat-production-cbde.up.railway.app/wx
自定义域名也试过了
两个域名都可以正常访问,但就是验证不了token
求大佬指点一下

@zhayujie
Copy link
Owner

url用的这个 https://chatgpt-on-wechat-production-cbde.up.railway.app/wx 自定义域名也试过了 两个域名都可以正常访问,但就是验证不了token 求大佬指点一下

好像railway就是部署不了公众号,你看这个issue #764
感觉公众号还是用服务器靠谱点

@qcoltma
Copy link

qcoltma commented Apr 18, 2023

image
订阅号用下来还是不错的,就是由于订阅号15秒的限制,我在使用中发现经常有“该公众号提供服务出现故障,请稍后再试”的错误提示(如上图),实际情况是只要稍等一会儿,随便发个信息就能返回结果了,请问怎样才能不出现这个故障提示?因为这对使用者的体验不好。

@JS00000
Copy link
Contributor Author

JS00000 commented Apr 18, 2023

image 订阅号用下来还是不错的,就是由于订阅号15秒的限制,我在使用中发现经常有“该公众号提供服务出现故障,请稍后再试”的错误提示(如上图),实际情况是只要稍等一会儿,随便发个信息就能返回结果了,请问怎样才能不出现这个故障提示?因为这对使用者的体验不好。

消息发快了确实会出现这种情况,原因是目前使用的web.py存在最大并发限制 Max Concurrent Requests to 10。计划过段时间调整一下依赖的web服务器或者框架。

@qcoltma
Copy link

qcoltma commented Apr 19, 2023

赞,期待中。。

@1925262525
Copy link

可以加一个查询key余额的命令吗

@LumingMelody
Copy link

公众号的服务器是不是也要能科学上网啊 我AWS 被墙了 都ping不通

@JS00000
Copy link
Contributor Author

JS00000 commented May 25, 2023

公众号的服务器是不是也要能科学上网啊 我AWS 被墙了 都ping不通

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet