之前总是在小红书上看到有小姐妹分享类似的推送,今天我就来分享一下类似这样的是怎么做的,本篇文章的源码是在该博主- 东东学不会分享的源码基础上稍加修改的。 源码链接文档点此
1.注册微信测试号
-
首先扫码进入微信公众测试平台
生成的appID以及secret后面需要用到
-
将测试号二维码发送给需要推送的人,返回回来的就是openid,这个也是很重要的东西,在后台由这个决定你需要推送的人
-
生成推送模板,在{{}}中写参数,以.DATA结尾,模板内容可以自定义
早安模板:
今天是{{riqi.DATA}}
{{beizhu.DATA}}
今日天气:{{tianqi.DATA}}
最高温度:{{high.DATA}} 度🌡
最低温度:{{low.DATA}} 度❄
今天是我们恋爱的第 {{lianai.DATA}} 天
距离小乖的生日还有 {{shengri.DATA}} 天
距离阿靳的生日还有 {{shengri2.DATA}} 天
距离我们的纪念日还有 {{jinianni.DATA}} 天
{{caihongpi.DATA}}
{{jinju.DATA}} 💗
喝水模板:
记得喝水呀,宝贝,爱你哦
{{caihongpi.DATA}}
{{jinju.DATA}} 💗
2.进行后台的编写
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--微信模版消息推送三方sdk-->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.8.5</version>
</dependency>
-
编写properties文件
spring.application.name=weixin.tuisong server.port=19999 #自定义接口 lianAi=恋爱日期 # 农历生日(阴历)M:月份 D:天 M=12 D=23 M2=8 D2=8 #用户id openID1=xxxx openID2=xxxx #小程序id appId=xxxxxx #小程序密钥 secret=xxxxx #早安模板 templateId=9SEOd41KOMss3nL96Ep__KkgsLN1WB2fcucB11lo5n4 # 喝水模板 templateId2=bjqwd6yC-OJYoRWdhbmhIliJcAV_5ew0c40ArlK9IXQ
-
获取各种天气,纪念日以及彩虹屁等的信息
获取天气(以下为获取武汉市的天气):
注册百度开发者,申请开放百度天气的api------->控制台 | 百度地图开放平台 (baidu.com)
public class Tianqi { private static String ak = " "; #填写开放百度天气的API private static String district_id = "420100"; #填写所在城市的区号 public static JSONObject getNanjiTianqi() { String result = null; JSONObject today = new JSONObject(); try { result = HttpUtil.getUrl("https://api.map.baidu.com/weather/v1/?district_id=" + district_id + "&data_type=all&ak=" + ak); JSONObject jsonObject = JSONObject.parseObject(result); if (jsonObject.getString("message").equals("success")) { JSONArray arr = jsonObject.getJSONObject("result").getJSONArray("forecasts"); today = arr.getJSONObject(0); } } catch (Exception e) { e.printStackTrace(); } return today; } public static void main(String[] args) { System.out.println(getNanjiTianqi()); } }
获取纪念日以及双方生日,自动注入配置类中的生日信息等
@Component public class JiNianRi { @Value("${lianAi}") private String LIANAI; @Value("${M}") private int M; @Value("${D}") private int D; @Value("${M2}") private int M2; @Value("${D2}") private int D2; /** * 农历转公历 * * @param chineseDate * @return */ private static LocalDateTime ChineseDateToLocalDataTime(ChineseDate chineseDate) { return LocalDateTimeUtil.of(chineseDate.getGregorianDate()); } /** * 当前日期是否已过生日或者纪念日,若是则年份+1 * * @param localDateTime * @return */ private int getLast(LocalDateTime localDateTime) { return LocalDateTime.now().isAfter(localDateTime) ? 1 : 0; } //转化为天数 public int getDays(LocalDateTime target) { Duration between = LocalDateTimeUtil.between(LocalDateTime.now(), target); return (int) (Math.abs(between.toDays())) + 1; } //获取恋爱天数 public int getLianAi() { return getDays(LocalDateTime.parse(LIANAI)); } //距离XX生日还有多少天 public int getShengRi() { ChineseDate birth = new ChineseDate(LocalDateTime.now().getYear(), M, D); LocalDateTime date = ChineseDateToLocalDataTime(new ChineseDate((LocalDateTime.now().getYear() + getLast(ChineseDateToLocalDataTime(birth))), M, D)); return getDays(date); } //距离XX生日还有多少天 public int getShengRi2() { ChineseDate birth = new ChineseDate(LocalDateTime.now().getYear(), M2, D2); LocalDateTime date = ChineseDateToLocalDataTime(new ChineseDate((LocalDateTime.now().getYear() + getLast(ChineseDateToLocalDataTime(birth))), M2, D2)); return getDays(date); } //距离恋爱纪念日还有多少天 public int getjinianri() { LocalDateTime time = LocalDateTime.parse(LIANAI).withYear(LocalDateTime.now().getYear()); return getDays(time.plusYears(getLast(time))); } public static void main(String[] args) { } }
获取彩虹屁以及每日一句(可以自行接入接口,也自己写一堆情话放在resources文件下,读取到内存里,用当前的天数取模就可以了)
注册彩虹屁,申请api接口--------->天行数据TianAPI - 开发者API数据平台
public class CaiHongPi {
private static String key = "彩虹屁API接口";
private static String url = "http://api.tianapi.com/caihongpi/index?key=";
private static List<String> jinJuList = new ArrayList<>();
private static String name = "宝贝";
public static String getCaiHongPi() {
//默认彩虹屁
String str = "阳光落在屋里,爱你藏在心里";
try {
//将XXX改为name自定义名字
JSONObject jsonObject = JSONObject.parseObject(HttpUtil.getUrl(url+key).replace("XXX", name));
if (jsonObject.getIntValue("code") == 200) {
str = jsonObject.getJSONArray("newslist").getJSONObject(0).getString("content");
}
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
/**
* 载入金句库,若是接入接口,则不需要自己写模板
*/
static {
InputStream inputStream = CaiHongPi.class.getClassLoader().getResourceAsStream("jinju.txt");
try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
String str = "";
String temp = "";
while ((temp = br.readLine()) != null) {
if (!StringUtils.isEmpty(temp)) {
str = str + "\r\n" + temp;
} else {
jinJuList.add(str);
str = "";
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static String getJinJu() {
Random random = new Random();
return jinJuList.get(random.nextInt(jinJuList.size()));
}
}
金句模板(自定义内容即可):
-
推送到微信核心代码
@Component public class Pusher { /** * 测试号的appId和secret */ @Value("${appId}") private String appId; @Value("${secret}") private String secret; //模版id @Value("${templateId}") private String templateId; @Value("${templateId2}") private String templateId2; @Autowired private JiNianRi jiNianRi; public void push(String openId){ //1,配置 WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage(); wxStorage.setAppId(appId); wxStorage.setSecret(secret); WxMpService wxMpService = new WxMpServiceImpl(); wxMpService.setWxMpConfigStorage(wxStorage); //2,推送消息 WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() .toUser(openId) .templateId(templateId) .build(); //3,如果是正式版发送模版消息,这里需要配置你的信息 // templateMessage.addData(new WxMpTemplateData("name", "value", "#FF00FF")); // templateMessage.addData(new WxMpTemplateData(name2, value2, color2)); //填写变量信息,比如天气之类的 JSONObject todayWeather = Tianqi.getNanjiTianqi(); templateMessage.addData(new WxMpTemplateData("riqi",todayWeather.getString("date") + " "+ todayWeather.getString("week"),"#00BFFF")); templateMessage.addData(new WxMpTemplateData("tianqi",todayWeather.getString("text_day"),"#00FFFF")); templateMessage.addData(new WxMpTemplateData("low",todayWeather.getString("low") + "","#173177")); templateMessage.addData(new WxMpTemplateData("high",todayWeather.getString("high")+ "","#FF6347" )); templateMessage.addData(new WxMpTemplateData("caihongpi",CaiHongPi.getCaiHongPi(),"#FF69B4")); templateMessage.addData(new WxMpTemplateData("lianai",jiNianRi.getLianAi()+"","#FF1493")); templateMessage.addData(new WxMpTemplateData("shengri",jiNianRi.getShengRi()+"","#FFA500")); templateMessage.addData(new WxMpTemplateData("jinianni",jiNianRi.getjinianri()+"","#FF3300")); templateMessage.addData(new WxMpTemplateData("shengri2",jiNianRi.getShengRi2()+"","#FFA500")); templateMessage.addData(new WxMpTemplateData("jinju",CaiHongPi.getJinJu()+"","#C71585")); String beizhu = ""; if(jiNianRi.getLianAi() == 0){ beizhu = "今天是恋爱纪念日!"; } templateMessage.addData(new WxMpTemplateData("beizhu",beizhu,"#FF0000")); try { System.out.println(templateMessage.toJson()); System.out.println(wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage)); } catch (Exception e) { System.out.println("推送失败:" + e.getMessage()); e.printStackTrace(); } } public void pushDrink(String openId){ //1,配置 WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage(); wxStorage.setAppId(appId); wxStorage.setSecret(secret); WxMpService wxMpService = new WxMpServiceImpl(); wxMpService.setWxMpConfigStorage(wxStorage); //2,推送消息 WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() .toUser(openId) .templateId(templateId2) .build(); templateMessage.addData(new WxMpTemplateData("caihongpi",CaiHongPi.getCaiHongPi(),"#FF69B4")); try { System.out.println(templateMessage.toJson()); System.out.println(wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage)); } catch (Exception e) { System.out.println("推送失败:" + e.getMessage()); e.printStackTrace(); } } }
-
开启定时任务
启动类上加注解:@EnableScheduling
定时任务的语法可以自行百度
@Component public class JobWorker { //要推送的用户openid @Value("${openID1}") private String openId; @Value("${openID2}") private String openId2; @Autowired Pusher pusher; //每天早上八点推送早安模板 @Scheduled(cron = "0 0 8 * * ?") public void goodMorning(){ pusher.push(openId); pusher.push(openId2); } //每天早上九点到晚上九点,每隔一小时推送喝水消息 @Scheduled(cron = "0 0 9-21/1 * * ?") public void drink(){ pusher.pushDrink(openId); pusher.pushDrink(openId2); } }
-
编写测试类
@RestController
public class PushController {
//要推送的用户openid
@Value("${openID1}")
private String openID1;
@Value("${openID2}")
private String openID2;
@Autowired
private Pusher pusher;
/**
* 微信测试账号推送
*
*/
@GetMapping("/push")
public void push() {
pusher.push(openID1);
}
/**
* 微信测试账号推送
* */
@GetMapping("/push/LZY")
public void push2() {
pusher.push(openID2);
}
/**
* 测试账号推送
* */
@GetMapping("/drink")
public void pushdrink() {
pusher.pushDrink(openID1);
pusher.pushDrink(openID2);
}
/**
* 微信测试账号推送
* */
@GetMapping("/push/{id}")
public void pushId(@PathVariable("id") String id) {
pusher.push(id);
}
}
编写完成后可自行先测试一下,若收到测试号消息则表示成功,最后可自行部署在服务器上!