escape-wechat是一个微信助手,通过简单的可视化的配置,实现微信好友、微信群的指定消息的自动回复、自动转发或自动处理,让你从微信中“逃”出来,拯救你宝贵的注意力。
最新功能: 提供发送消息的api接口供第三方应用调用,可发送群消息或个人消息。
为什要做这个东西?
小故事:
我的孩子正在上小学,学校各项事务都会通过微信群进行发布,包括作业和各项通知。而群里家长也会进行提问和完成作业情况的打卡,群里核心信息密度不高。如果你需要了解群里的核心消息,你可能需要翻看很长时间的历史消息,这会消耗你的注意力。另外就是孩子的校车群,每天我需要关注的就是校车到达到某个特定站点的消息。在收到这个消息后,我出发去接孩子即可。可是校车老师会从发车起就开始发消息,并且伴随不少家长的提问。这会大大分散你的注意力,甚至会导致你无法及时关注你最应该关注的那条消息。
于是我开发了这东西。
在实现上述功能后,我还把这个东西也对接上了大语言模型,只要api使用了openAI的api,你就可以经过简单的配置实现智能回复。
本项目基于wechaty项目,感谢wechaty项目组提供的开源项目。
https://github.com/wechaty/wechaty
一、使用docker安装 docker安装是最简单,最快捷的方案
- 拉取镜像 docker pull hmllsnow/escape-wechat
- 运行容器
docker run -d -p 443:443 -p 8080:8080 -e LOGIN_PWD="your_login password use fro login control Panel" --name escape-wechat-container hmllsnow/escape-wechat
API_KEY参数配置使用api接口发送消息时的apikey
LOGIN_PWD参数配置登录配置页面的密码
核心功能都在配置页面完成。根据你的安装方法,进入配置页面略有不同
如果使用docker镜像方式运行,配置页面:http://localhost
不适用docker,且没有修改配置文件,配置页面:http://localhost:7788
首先是:启动,停止,重启按钮 启动:启动微信机器人,如果已经启动,则不会重复启动。 停止:停止微信机器人,如果已经停止,则不会重复停止。 重启:重启微信机器人
大类分为个人和群,分别对应个人微信消息、群消息的配置
收到白名单(*表示任何人)用户发送的文本消息,如何文本消息包含Keyword关键字(或文本消息符合Regex配置的正则表达)则执行Handler配置的回复函数。默认已经开发了greet函数,会回复dang
keyword、regex 兩個條件可以同時存在,但必須同時符合,才会触发,所以這樣做意義不大,所以建議這兩個條件互斥存在。
回复函数实现了调用函数传参的功能,函数名和参数之间通过##分隔,参数使用json格式
举例:
replyOpenAI##{baseurl:"https://api.deepseek.com",apikey:"sk-**************",model:"deepseek-chat" }
--说明:1、baseurl:大模型api地址,2、apikey:大模型api key,3、model:大模型模型名称
举例使用的deepseek模型(原因:接口格式与openai一致且价格较低)
收到白名单(*表示任何人)用户发送的文本消息,如何文本消息包含Keyword关键字(或文本消息符合Regex配置的正则表达)则转发到指定的群Target Rooms或联系人Target Contacts。
收到白名单(*表示任何人)用户发送的文本消息,如何文本消息包含Keyword关键字(或文本消息符合Regex配置的正则表达)则执行Handler配置的函数内写好的动作。
回复函数实现了调用函数传参的功能,函数名和参数之间通过##分隔,参数使用json格式
举例:
actionCozeTextChat##{apikey:\"pat_************************c\", bot_id:\"12345678901234564\", user_id:\"123\" }
要求: 转发A群,B用户,发送的包含文字C的文本消息,转发给D群和E用户。
在配置面板找到群组->转发配置,点击新增按钮,填入以下信息:
要求: 群A中,只要被@就把消息发送给大模型,大模型响应后,把响应消息发回群A。
配置如图
由于keyword、regex为一组条件(如都配置就需要都满足),@Me,@all,共三组条件,满足任意一组就触发动作。所以设置了永远无法满足的keyword,只有@Me时才能触发。
可以使用api调用,是程序开放与否的重要衡量。为了让您体验开放带来的快感,我也设计了两个api接口。可以实现调用api接口发送消息(两个接口分别对应群和个人消息)。
https://ip:443/api/
接口必须携带参数apiKey,apikey为docker run 启动容器时API_KEY配置的参数
Method: POST
/chat/room
总体结构
参数名 | 必填 | 类型 | 说明 | 默认值 |
---|---|---|---|---|
apiKey | 是 | string | apiKey | 无 |
roomName | 是 | string | 群名 | 无 |
message | 是 | object | 消息内容,数据格式参考message数据类型说明 | {} |
message字段结构
参数名 | 必填 | 类型 | 说明 | 默认值 |
---|---|---|---|---|
type | 是 | number | 消息类型:1 文字 2 图片url 3 图片base64 (暂时仅支持1) | 1 |
content | 否 | string | 消息内容,如果type为1必填,内容换行使用\n | 无 |
url | 否 | string | type 为2,3必填,图片地址,或者文件地址,例如png,jpg或者zip,excel都可以,必须是网络地址(暂时不支持) | 无 |
Method: POST
/chat/contact
总体结构
参数名 | 必填 | 类型 | 说明 | 默认值 |
---|---|---|---|---|
apiKey | 是 | string | apiKey | 无 |
name | 是 | string | 好友昵称,不能带特殊字符和表情 | 无 |
alias | 否 | string | 好友备注,如果昵称带特殊字符,建议使用备注,name为空,alias有值即可 | 无 |
wxid | 是 | string | 好友列表查看wxid 对于web协议此id 不唯一,可能不生效(插件>1.6.10支持) | 无 |
message | 是 | object | 消息内容,数据格式参考message数据类型说明 | {} |
message字段结构
参数名 | 必填 | 类型 | 说明 | 默认值 |
---|---|---|---|---|
type | 是 | number | 消息类型:1 文字 2 图片url 3 图片base64 (暂时仅支持1) | 1 |
content | 否 | string | 消息内容,如果type为1必填,内容换行使用\n | 无 |
url | 否 | string | type 为2,3必填,图片地址,或者文件地址,例如png,jpg或者zip,excel都可以,必须是网络地址(暂时不支持) | 无 |
curl -k --location 'https://127.0.0.1/api/chat/contact' \
--header 'Content-Type: application/json' \
--data '{
"apiKey": "your apikey",
"name": "联系人",
"alias":"",
"message": {
"type": 1,
"content":"消息内容"
}
}'
curl -k --location 'https://127.0.0.1/api/chat/room' \
--header 'Content-Type: application/json' \
--data '{
"apiKey": "your apikey",
"roomName":"群名",
"message": {
"type": 1,
"content":"群消息"
}
}'
windows cmd 请求示例(注意不是power shell)
curl -k -X POST "https://127.0.0.1/api/chat/contact" ^
-H "Content-Type: application/json" ^
-d "{\"apiKey\": \"your apikey\", \"name\": \"联系人\", \"alias\": \"\", \"message\": {\"type\": 1, \"content\": \"消息内容\"}}"
curl -k -X POST "https://127.0.0.1/api/chat/room" ^
-H "Content-Type: application/json" ^
-d "{\"apiKey\": \"your apikey\", \"roomName\": \"群名\",\"message\": {\"type\": 1, \"content\": \"消息内容\"}}"
加入 -k
参数忽略自签名证书,否则会报错。咱们的程序暂时使用的是自签名证书,所以需要忽略。