diff --git a/README.md b/README.md index 35d001b..10aea62 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # 消息推送服务 ## 描述 -1. 利用微信公众号测试号或者微信企业号来给自己的微信推送消息。 -2. 也可推送邮件消息,在微信中开启 QQ 邮件提醒后,也可以达到同样效果。 -3. 支持 Markdown。 -4. 可以使用 Heroku 的免费服务器,[详见此处](#在-Heroku-上的搭建步骤)。 -5. 无需手动配置数据库,这里使用的是 SQLite3 嵌入式数据库。 +1. 多种消息推送方式: + + 使用微信公众号测试号推送, + + 使用微信企业号推送, + + 使用邮箱进行推送, + + 使用专门的桌面客户端进行推送,消息直达你的电脑,需要额外安装一个非常小的客户端,[详见此处](./client/README.md)。 +2. 支持 Markdown。 +3. 支持部署在 Heroku 上,无需自己的服务器,[详见此处](#在-Heroku-上的搭建步骤)。 ## 用途举例 1. [整合进自己的博客系统,每当有人登录时发微信消息提醒](https://github.com/songquanpeng/blog/blob/486d63e96ef7906a6c767653a20ec2d3278e9a4a/routes/user.js#L27)。 @@ -68,7 +70,7 @@ |:--|:--| |MODE|1(1 代表 Heroku 模式,该模式下应用从环境变量中读取必要信息)| |PREFIX|你的前缀,如 admin(前缀用于区分用户,出现在请求的 api 路径中)| -|DEFAULT_METHOD|默认推送方式(test 代表微信测试号,corp 代表微信企业号,email 代表邮件推送)| +|DEFAULT_METHOD|默认推送方式(test 代表微信测试号,corp 代表微信企业号,email 代表邮件推送,client 代表客户端推送)| |HREF|服务的 href,如 https://wechat-message.herokuapp.com/ ,注意后面要有 /| |WECHAT_APP_ID|你的测试号的 APP ID| |WECHAT_APP_SECRET|你的测试号的 APP Secret| @@ -92,7 +94,8 @@ 1. `type`:(可选)发送方式 + `test`:通过微信公众号测试号推送 + `email`:通过发送邮件的方式进行推送 - + `corp`:通过微信企业号的应用号发送 + + `corp`:通过微信企业号的应用号推送 + + `client`:通过桌面客户端推送 2. `title`:(可选)消息的标题 3. `description`:(必填)消息的描述 4. `content`:(可选)消息内容,支持 Markdown @@ -107,5 +110,6 @@ - [x] 支持在 Heroku 上部署 - [ ] 更加便于部署的 Go 语言的版本。 - [x] 适配企业微信应用。 +- [x] 客户端推送。 敬请期待。 diff --git a/client/README.md b/client/README.md new file mode 100644 index 0000000..fb17ed7 --- /dev/null +++ b/client/README.md @@ -0,0 +1,13 @@ +# Message Pusher 桌面客户端 +## 描述 +该客户端用于支持 `client` 消息推送方式。 + +注意,为防止未授权的 WebSocket 连接,使用该消息推送方式你**必须**设置 ACCESS_TOKEN。 + +## 原理 +客户端启动后与 message-pusher 服务器建立一个 WebSocket 连接,通过该连接接受要推送消息,并调用系统的消息通知接口进行消息通知。 + +## 安装 +推荐将其注册为开机启动的服务,二进制包请前往 [Release 页面](https://github.com/songquanpeng/message-pusher/releases)下载。 + +启动参数:`./client.exe -server your.domain.com:port -prefix admin -token private` diff --git a/common/client.js b/common/client.js index 110c1ac..dd8df47 100644 --- a/common/client.js +++ b/common/client.js @@ -1,8 +1,9 @@ +const WebSocket = require('ws'); const { tokenStore } = require('./token'); async function pushClientMessage(userPrefix, message) { let user = tokenStore.get(userPrefix); - if (!user || !user.ws) { + if (!user || !user.ws || user.ws.readyState !== WebSocket.OPEN) { return { success: false, message: `客户端未连接`, @@ -12,11 +13,10 @@ async function pushClientMessage(userPrefix, message) { title: message.title, description: message.description, }; - console.log(JSON.stringify(data)); user.ws.send(JSON.stringify(data)); return { success: true, - message: '消息已发送给 WebSocket 客户端', + message: '消息已发送至客户端', }; }