微信每日早安推送


之前总是在小红书上看到有小姐妹分享类似的推送,今天我就来分享一下类似这样的是怎么做的,本篇文章的源码是在该博主- 东东学不会分享的源码基础上稍加修改的。 源码链接文档点此

在这里插入图片描述

1.注册微信测试号

在这里插入图片描述

  • 将测试号二维码发送给需要推送的人,返回回来的就是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.进行后台的编写

  • 搭建springboot项目

  • 引入核心依赖

    <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);
    }
}

编写完成后可自行先测试一下,若收到测试号消息则表示成功,最后可自行部署在服务器上!

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值