微信公众号(一)每日推送,天气推送 (含实时定位,天气预报,每日英语,纪念日等,可快速自定义消息模板并指定订阅者类型发送),另有小白网页版配置
- 版本介绍
- 1. 相关API接口申请
- 1.1 微信
- 1.2 百度
- 1.3 天行API
- 2 模板配置
- 3 配置与部署
- 3.1 本地版
- 3.2 服务器版
- 4 个性化
- 5 新增
- 5.1 给Special的下午模板
- 5.2 给Special的晚安模板
(含实时定位,天气预报,每日英语,纪念日等,可快速自定义消息模板并指定订阅者类型发送),另有小白网页版配置)
小白配置版本已出,点击查看微信公众号每日定时推送,天气推送(小白网页版配置)
效果图如下
以下内容有不懂的地方欢迎留言询问~(也可以直接看GitHub上的README.md文档加我咨询)
Git项目地址: https://github.com/asleepyfish/wx-pusher(基础版本请直接下载v1.0.0)
v1.0.0源码下载地址:
https://github.com/asleepyfish/wx-pusher/archive/refs/tags/1.0.0.zip
最近加我咨询的人有点多,很多人都没有相关Java开发的基础,所以做一下说明:
这篇博客适用于对Java和Spring有相关的了解的读者或者对搭建一个自己独立控制的应用有兴趣的读者阅读。
后续有时间我会出一个网页自动编辑定时任务发送的小白版本(小白版本已出)
版本介绍
v1.0.0
基本功能支持,包括:
1.消息推送
2.实时定位
3.天气预报
v1.1.0
支持ChatGPT对话机器人
1. 相关API接口申请
1.1 微信
首先打开微信公众平台申请测试账号。
网页链接:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
点击登录按钮微信扫码进入,这里需要记录下页面上以下几个数据。等会添加到项目中的常量类中。
把上面几个信息填入WxConstants
常量类相应位置。
然后让你想发送模板信息的人关注你的公众号。
用微信扫描左侧二维码关注。
项目里把所有关注者分为两类,一类是Special,一类是Other,比如说自己和对象是Special里面的,那么你可以指定模板只发送给Special。其他的你的朋友们,你想要他们关注你,但是不想把自己和对象使用的私密模板的内容每天发送给他们,不把他们加入Special列表即可。
经过配置以后,你可以自定义模板发送给三类人群
- 第一种是发送给Special(比如发送带有纪念日内容的模板给你和你的对象)
- 第二种是发送给Other(Other就是除了Special以外的其他关注者,比如发送带有天气预报的模板给其他人)
- 第三种是发送给所有人(比如发送其他一些你和对象和朋友都可以)
那么怎么配置呢,很简单,在项目的配置文件application.yml
中定义好了special的配置。
只需要把接收Special模板的特殊订阅者(比如你和你的对象)的openId定义在这就可以了。
1.2 百度
打开百度地图开发平台 https://lbsyun.baidu.com/index.php?title=%E9%A6%96%E9%A1%B5
登录以后点击右上方控制台
依次点击我的应用,创建应用
输入一个应用名称,应用类型选择服务端
然后往下拉,请求校验方式选择IP白名单校验,然后IP白名单设置为0.0.0.0/0,表示允许所有IP进行API的请求,然后提交,返回控制台首页。
这里就会显示刚创建好的应用了,把鼠标移动到访问应用(AK)的地方,会弹出来可以复制的图标,复制这个AK,填入项目的常量配置类WxConstants中相应位置。
1.3 天行API
打开天行API官网https://www.tianapi.com/
注册登录后每天会赠送免费的请求次数。
搜索框搜索每日英语并进入
进入每日英语
然后点击进行申请。
申请完成后,我们点击右上角的控制台进入
然后点击左侧我的密钥KEY,然后复制粘贴APIKEY到项目里的常量类WxConstants的相应位置。
至此当前项目所需要的调用相关的KEY申请完成。
2 模板配置
在上面已经讲解了模板可以给三类人发送,这里就讲解分别给Special和Other分别发送模板。
首先项目里有一个WxTemplateType
的枚举类
四个参数的含义分别如上面所示,枚举类中已经定义好了两个模板,第一个是给Special的关注者发送的模板,第二个是Other关注者发送的模板(除了定义好的Special以外的订阅者都叫Other)
其中第一个参数templateId使用了一个常量类WxTemplateConstants
去维护
这里面的模板id就是等会我们在微信测试公众平台上创建的模板对应的模板id。
进入微信测试公众平台,往下拉,找到模板消息接口配置的地方。
这里我已经定义好了两个模板,分别给Special和Other来发送的
20230505更新
由于微信公共平台策略更改,现在模板不支持尾部/备注内容、自定义颜色、表情符号。
详细公告见:关于规范公众号模板消息的再次公告
以下是20230505
更新的最新模板
给Special的模板样式如下
当前位置:{{location.DATA}}实时天气:{{now_temp.DATA}}°C {{now_weather.DATA}}
气象:{{now_wind_dir.DATA}}{{now_wind_class.DATA}} | 湿度{{now_rh.DATA}}%
今天:{{today_weather.DATA}} {{today_high.DATA}}/{{today_low.DATA}}°C
明天:{{tomorrow_weather.DATA}} {{tomorrow_high.DATA}}/{{tomorrow_low.DATA}}°C恋爱已经:{{love_days.DATA}}天 ❤
下次见面还有:{{next_meet_days.DATA}}天 ❤英:{{daily_english_en1.DATA}}{{daily_english_en2.DATA}}中:{{daily_english_cn1.DATA}}{{daily_english_cn2.DATA}}
给Other的模板样式如下
当前位置:{{location.DATA}}实时天气:{{now_temp.DATA}}°C {{now_weather.DATA}}
气象:{{now_wind_dir.DATA}}{{now_wind_class.DATA}} | 湿度{{now_rh.DATA}}%
今天:{{today_weather.DATA}} {{today_high.DATA}}/{{today_low.DATA}}°C
明天:{{tomorrow_weather.DATA}} {{tomorrow_high.DATA}}/{{tomorrow_low.DATA}}°C英:{{daily_english_en1.DATA}}{{daily_english_en2.DATA}}中:{{daily_english_cn1.DATA}}{{daily_english_cn2.DATA}}
创建好后,我们复制粘贴模板id替换掉WxTemplateConstants里的模板ID即可。
上述模板中给Special发送的时候有一个纪念日的日期,定义在WxConstants中,可以根据实际情况进行修改。
以上说法简单点做就是:
把模板样式复制以后去微信平台新增模板
创建好模板后,把模板ID复制粘贴到WxTemplateConstants
类的相应位置即可。
3 配置与部署
项目中使用到了sqlite数据库对信息进行保存,只需要在application.yml中配置好地址即可。
根据自己项目中wx.db的实际位置情况,复制粘贴全路径来覆盖下方红框位置即可。
接下来我们需要对接口信息进行配置,来使用微信提供的实时定位功能(后面实时天气会用到)。
下面会分为本地版(没有自己的服务器)和服务器版进行说明。
3.1 本地版
没有服务器的,可以使用内网穿透工具,将本机服务启动端口映射到一个公网域名上。
这里推荐一种内网穿透工具Cpolar,点击链接下载对应版本并安装即可。
下载完以后,我们可以打开本地的Cpolar的端口http://localhost:9200/随便注册以下进入下面界面。
点击左侧创建隧道,然后选择号以后点击创建,然后就建立了一个公网域名到你本地启动项目端口的一个映射。
然后点击左侧在线隧道列表就可以看到映射的公网地址,http和https协议任选其一复制粘贴。
然后启动我们的SpringBoot项目。
打开微信公众平台,找到接口配置信息的URL那里,将刚复制好的公网ip地址填到下面的地方。下面的Token字段也是在WxConstants常量类中定义好的,用来校验的。可以自定义(这一步默认不用管也可以,下面的Token直接配置成asleepyfish)。
然后将刚才的公网地址粘贴到下方图片红框位置,输入项目中定义好的对应的Token,点击提交。
然后会在上方弹出一个配置成功的绿色的框。
接下来,在微信公众平台页面向下拉,找到获取用户地理位置的API,然后需要打开。这个意思是申请访问订阅者的地理位置,以便于实时根据订阅者地理位置推送天气。
这里需要让订阅者打开位置信息服务,微信打开关注好的接口测试号,进入设置,
然后将聊天中使用地理位置按钮点开即可。
注意:这里第一次设置完成后,退出关注的公众号的聊天对话框界面,然后再次进入,来记录当前的位置。(只有第一次打开位置信息需要这样,以后每次收到信息之后,会自动更新一次实时位置)
3.2 服务器版
首先将项目打包到服务器上,然后使用FTP工具传送到服务器上。
我这里将项目放在了software下。
config文件夹下是application.yml和db文件夹,db文件夹下是wx.db数据库。
相对于在windows上部署而言只需要修改wx.db的位置即可。我这里是把wx.db放到了/software/config/db/wx.db的位置。
然后使用启动脚本启动项目即可。直接输入:
nohup java -jar wx-pusher.jar >log.out 2>&1 &
启动以后参考3.1,对接口配置信息进行配置。
不同的点在于配置公网IP地址的地方可以配置自己服务器的地址,使用IP+端口的方式(有域名的使用域名+端口也可),如下图
接下来开启定位的方法参考3.1即可。
4 个性化
上面的步骤完成后能够使用的定时任务在TimedTaskController
类中,有两个
分别是早上五点给Special信息的人发送Special模板和早上六点给Other信息的人发送Other信息的模板。具体可以根据自己的实际需要对cron表达式进行修改来实现哪个时间发送模板。
如果想创建其他个性化的模板的话,只需要在微信公众平台上创建好一个新的模板,记录下模板ID,然后,在WxTemplateConstants
类中新建一个变量保存新的模板ID。
然后在WxTemplateType
枚举类中定义新的模板的信息,以及需要推送给订阅者的类型。
然后新建模板推送策略来实现WxTemplateStrategy
,具体新建策略怎么编写,可以参考CommonMorningStrategy
和SpecialMorningStrategy
类。需要注意的是,新建的模板策略的Service中需要对应好这个策略对应的是WxTemplateConstants
中的哪一个模板,如下所示。
然后在TimedTaskController
类中仿照已经定义好的任务,新建定时任务对新模板进行推送。
具体新增的结果就如第5章新增所示。