项目来由
用于halo博客,继上次 PR 的海报功能,总体来说,作为一个个人博客的小程序端已经很完善了,看到在评论处设有留言回复通知(这个是用于邮件通知),由于我一般很少打开邮箱,就想到了微信推送,另外在海报功能处用到了云函数生成小程序码,考虑到免费用户的月额度有限,于是也一并写成了接口。
功能预览
安装
git clone https://gitee.com/ufec/GBlog-wxpush.git
运行
npm install
npm start //默认端口5000,可在package.json文件中修改
node /utils/schedule.js //启动定时器程序
这里用宝塔PM2 管理器作为演示
不用宝塔也可以,后台挂起这两个服务(或者使用 nodejs 的 forever/nodemon 模块),主服务用 nginx 反向代理即可实现一样的效果。
需要服务器可以入手腾讯云,618 优惠 1 核 2G1M50G 硬盘,标准型 SA2 服务器三年 288RMB
用户端效果
实现过程
项目由 NodeJS + MongoDB + Redis 构成,搭建方便,性能高效,快速开发。
目录结构
├── app.js //主程序
├── config //配置目录
│ ├── config.js //主要配置
│ ├── database.js //数据库配置
│ └── log4js.json //日志配置
├── db //数据库目录
│ ├── collection //数据模型
│ │ ├── article.js //文章模型
│ │ └── comment.js //评论模型
│ └── db.js //数据库文件
├── log //日志目录
├── package.json
├── routes //路由文件目录
│ ├── article.js //文章路由
│ ├── comment.js //评论路由
│ ├── getOpenId.js //获取用户openid路由
│ └── getQRCode.js //生成小程序码路由
└── utils //功能
├── getToken.js //获取微信AccessToken
├── log.js //初始化日志配置
├── redis.js //redis
├── schedule.js //定时器
├── sendMsg.js //下发模板信息
用到的模块:
express
fs
log4js
mongoose
node-schedule
path
redis
request
项目共有两个推送功能:留言审核和新作品推荐,需要前往小程序后台
功能->订阅消息处添加,格式如下图
!注:由于发送信息格式写死,请务必按照上图添加
app 为项目主服务,主要用于接收处理用户请求,utils/schedule 为项目的推送服务,用于定时定点发送(此项目定于每天晚上 21:30:30 执行,一般那个时候都下班了),你也可以自定义,详见 node-schedule 文档
routes 下为项目路由,comment 为评论订阅,article 为文章订阅,其他两个就显而易见。
更多选项
你可以更改 halo 博客的微信分享功能,如下图:
这是基于寒山主题的修改版本,前提是小程序为GBlog-wx
做如下修改:
在 post.ftl 的最后一行添加如下代码
<script>
var img = null;
var articleId = ${post.id?c};
function share(e){
$.ajax({
url: "你的服务端地址/getQRCode?scene=id="+articleId+"&page=pages/details/index",
success:function(result){
img.attr('src', result.base);
}
});
}
$(document).ready(function () {
img = $("div.social-share > a.social-share-icon.icon-wechat > div.wechat-qrcode > div.qrcode > img");
});
</script>
并在 74 行添加
onclick="share(this);">
80 行改为如下内容
<div class="social-share" data-disabled="${settings.share_disabeld!''}" data-wechat-qrcode-title="打开微信扫一扫" data-wechat-qrcode-helper="添加到我的小程序,更方便"></div>
即可实现。
一些可能的 Bug
- 当你看到生成小程序码出现如图所示,他明显不是一个正确的小程序码,但为什么
结果还是 0?,这....这我遇到了好多次,原因是在你的 token 重复获取,导致上一次的 token 失效,这个有待更新,解决的方法就是:本地调试无误后上传程序到服务端运行,本地不要再获取 token,如有必要测试,请测试完成后务必删除缓存中的 token,设置的有效期与微信官方给出的一致,为:7200。在程序运行期间可能出现延迟等种种问题,你可以将他改为 3600, - 文章标题建议尽量简短,微信限制为 20 个字(服务以及做了处理,但为了用户体验请在发布时斟酌)。