您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java实现每日给女友微信发送早安等微信信息

时间:2022-12-24 11:02:49  来源:稀土掘金  作者:穆雄雄

前言

据说这个功能最近在抖音上很火,我没有抖音,没有看到。 但是我在掘金和CSDN上看了,相关案例确实很多,但是大家都是借助于了微信服务号,在我看来,效果很不佳。

其实我原来的初衷是这样的,每天定时给群里推送新闻,这个原因在之前的文章中也提到过,这边就不在细说了,然后实现了给群中推送之后,就想着,能不能每天给指定人发送消息,网上搜了搜,果然有,各种实现方式五花八门,但是都没看上,于是就自己找了个,自己写。

网上案例

网上最多的可能就是利用微信服务号给推送信息,如图所示:

 


 

缺点如下:

  • 需要点进去订阅号才能看到,没哟起到吸引的作用
  • 申请的测试服务号,也不知道多久过期,说停就给你停掉了
  • 定制化的需求有的达不到

介于此,我就自己找了一个路子去做,昨晚刚写完,测了测,效果还是比较不错的。如下图所示:

 

(有点肉麻~)

实现方式

下面我们来看看是如何实现的。

准备工作

  1. 注册智能微秘书账号,花20块钱开个会员(20块钱一点都不多)
  2. 注册天行数据的账号,申请三个接口(早安寄语、每日新闻、土味情话),也可以自己加入别的有意义的内容,直接申请接口就行。
  3. 准备一个微信号,可以用你现在自己的,也可以在申请一个。
  4. 准备一个服务器
  5. 准备一个JAVA项目,放服务器上跑就可以

假使你的准备工作除4、5之外,都已经做完了,下面我们来看看如何从代码层面来实现。

实现原理

  • 调用天行数据的api,获取自己想要的数据,封装起来
  • 调用只能微秘书的接口,实现给微信好友发送消息
  • 给控制器controller类中添加定时任务,实现定时发送

关键代码如下所示:

  1. 调用天行数据接口,获取早安寄语:
/**
     * 获取每日早安寄语
     *
     */
    public static String getGoodMorning() {
        String path = "zaoan/index";
        //调用每日简报的接口
        String body = HttpUtil
                .createGet(Constants.TIAN_XING_API + path + "?key=" + TIAN_KEY)
                .execute()
                .body();
        JSONObject jsonObjectResult = JSON.parseobject(body);
        Integer code = jsonObjectResult.getInteger("code");
        if (code != 200) {
            log.error("请求每日新闻的接口出错,出错信息:" + body);
            return "一切都是最好的安排~";
        }
        log.info("请求每日新闻的接口成功:" + body);
        JSONObject resultObject = jsonObjectResult.getJSONObject("result");
        return resultObject.getString("content");
    }
复制代码
  1. 调用天行数据接口,获取土味情话:
/**
     * 获取每日土味情话
     *
     */
    public static String getLovewords(){
        String path = "saylove/index";
        //调用每日简报的接口
        String body = HttpUtil
                .createGet(Constants.TIAN_XING_API + path + "?key=" + TIAN_KEY)
                .execute()
                .body();
        JSONObject jsonObjectResult = JSON.parseObject(body);
        Integer code = jsonObjectResult.getInteger("code");
        if(code!=200){
            log.error("请求每日新闻的接口出错,出错信息:"+body);
            return "一切都是最好的安排~";
        }
        JSONObject resultObject = jsonObjectResult.getJSONObject("result");
        log.info("请求每日新闻的接口成功:"+resultObject);
        return resultObject.getString("content");
    }
复制代码
  1. 调用天行数据接口,获取天气预报:

    /**
     * 获取天气预报
     *
     */
    public static JSONObject getWeather(){
        String path = "tianqi/index";
        //调用每日简报的接口
        String body = HttpUtil
                .createGet(Constants.TIAN_XING_API + path + "?key=" + TIAN_KEY+"&type=1&city=370100")
                .execute()
                .body();
        JSONObject jsonObjectResult = JSON.parseObject(body);
        Integer code = jsonObjectResult.getInteger("code");
        if(code!=200){
            log.error("请求每日新闻的接口出错,出错信息:"+body);
            return null;
        }

        return jsonObjectResult.getJSONObject("result");
        /*
        * {
          "code": 200,
          "msg": "success",
          "result": {
            "date": "2022-12-19",
            "week": "星期一",
            "province": "上海",
            "area": "上海",
            "areAId": "101020100",
            "weather": "晴",
            "weatherimg": "qing.png",
            "weathercode": "qing",
            "real": "3℃",
            "lowest": "2℃",
            "highest": "9℃",
            "wind": "北风",
            "windspeed": "0",
            "windsc": "0级",
            "sunrise": "06:47",
            "sunset": "16:54",
            "moonrise": "",
            "moondown": "",
            "pcpn": "0",
            "uv_index": "0",
            "aqi": "54",
            "quality": "良",
            "vis": "18",
            "humidity": "48",
            "alarmlist": [

            ],
            "tips": "晴天紫外线等级较高,外出注意补水防晒。天气凉,适宜着一到两件羊毛衫、大衣、毛套装、皮夹克等春秋着装;年老体弱者宜着风衣加羊毛衫等厚型春秋着装。空气质量较好,可以参与各类户外活动。疫情防控不松懈,出门请佩戴口罩。"
              }
            }
        * */
    }
复制代码

日期处理关键代码

  1. 获取今天是周几
 /**
     * 获取汉字的今天周几
     * @param dateTime
     * @return
     * @throws ParseException
     */
    public static String getDaysByWeekChina(String dateTime) throws ParseException {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = dateFormat.parse(dateTime);
        cal.setTime(date);
        int day = cal.get(Calendar.DAY_OF_WEEK);
        day = day - 1;
        //周的汉字
        String week = "";
        switch (day) {
            case 0:
                week = "日";
                break;
            case 1:
                week = "一";
                break;
            case 2:
                week = "二";
                break;
            case 3:
                week = "三";
                break;
            case 4:
                week = "四";
                break;
            case 5:
                week = "五";
                break;
            case 6:
                week = "六";
                break;
        }
        return week;
    }
复制代码
  1. 获取纪念日的天数(两个日期之间的差):

 /**
     * 得到二个日期间的间隔天数
     *
     * @param date1
     * @param date2
     * @return
     */
    public static int getDayByTwoDay(String date1, String date2) {
        SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
        Long day = 0L;
        try {
            java.util.Date date = myFormatter.parse(date1);
            java.util.Date mydate = myFormatter.parse(date2);
            day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
        } catch (Exception e) {
            return 0;
        }
        return day.intValue();
    }
复制代码

实现给指定微信好友推送消息


    /**
     * 每天将指定信息推送到微信个人
     */
    @Override
    public void sendWechatToUser() {
        String url = WEI_MI_SHU_API + "/openapi/v1/chat/contact";
        WeiZhiMiShuVO weiZhiMiShuVO = new WeiZhiMiShuVO();
        //发送文字信息
        weiZhiMiShuVO.setType(1);
        try {
            //拿到发送的消息列表
            SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
            SimpleDateFormat format_h = new SimpleDateFormat("yyyy-MM-dd");
            //今天的日期
            String toDate = format_h.format(new Date());
            //相恋的日期
            String lian = "2022-03-28";
            //两个日期相差的天数
            int cha = DateUtils.getDayByTwoDay(toDate, lian);
            String todayDate = format.format(new Date());

            //根据阳历计算农历
            Calendar today = Calendar.getInstance();
            String week = DateUtils.getDaysByWeekChina(toDate);
            today.setTime(DateUtils.chineseDateFormat.parse(todayDate));
            DateUtils lunar = new DateUtils(today);
            String nongli = lunar.toString();
            nongli = nongli.substring(nongli.indexOf("年") + 1);
            StringBuilder sb = new StringBuilder();
            sb.Append("亲爱的老婆~早nn")
                    .append("充满希望的一天又开始了,今天也要一直开心,不能生我气气~")
                    .append("nn今天是:")
                    .append(todayDate)
                    .append(",星期")
                    .append(week)
                    .append(",农历")
                    .append(nongli)
                    .append("n")
                    .append("是我们相爱的第:")
                    .append(cha)
                    .append("天")
                    .append("nn")

            ;
            JSONObject tianqiObject = TianXingApiUtil.getWeather();
            sb.append("目前济南天气:")
                    .append(tianqiObject.getString("weather"))
                    .append("n")
                    .append("当前气温:")
                    .append(tianqiObject.getString("real"))
                    .append("n")
                    .append("今天最高温度:")
                    .append(tianqiObject.getString("highest"))
                    .append("n")
                    .append("最低温度:")
                    .append(tianqiObject.getString("lowest"))
                    .append("n")
                    .append("风向:")
                    .append(tianqiObject.getString("wind"))
                    .append("n")
                    .append("空气质量:")
                    .append(tianqiObject.getString("quality"))
                    .append("n")
                    .append("空气质量指数:")
                    .append(tianqiObject.getString("aqi"))
                    .append("n")
                    .append("小提示:")
                    .append(tianqiObject.getString("tips"));

            //土味情话
            sb.append("nn")
                    .append("爱你一日言:")
                    .append(TianXingApiUtil.getLoveWords())
                    .append("nn【早安寄语】")
                    .append(goodMorning());
            weiZhiMiShuVO.setContent(sb.toString());
            for (String str : SEND_USER) {
                JSONObject object = new JSONObject();
                object.put("apiKey", WEI_MI_SHU_KEY);
                //好友昵称
                object.put("name", str);
                //好友备注
                object.put("alias", str);
                object.put("message", weiZhiMiShuVO);
                String body = HttpUtil.createPost(url)
                        .body(JSON.toJSONString(object))
                        .execute()
                        .body();
                System.out.println("传递的参数是:" + JSON.toJSONString(object));
                System.out.println("发送成功了吗?" + body);
            }

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

复制代码

说明:

  1. WeiZhiMiShuVO 类可以参考文章:java实现给微信群中定时推送消息
  2. 代码中涉及到的常量,都放在了常量类中,SEND_USER是要发给微信好友的好友昵称,不是备注哈。
  3. 智能微秘书接口地址:接口地址

然后我们在控制器controller中调用该方法即可实现:

/**
     * 发送消息给指定的人
     */

    @GetMapping(value = "/sendWechatToUser")
    @Scheduled(cron ="0 0 8 * * ?")
    public void sendWechatToUser(){
        articleService.sendWechatToUser();
    }

复制代码

cron ="0 0 8 * * ?是一个corn表达式,表示每天早上8点给指定的微信好友推送消息。


作者:穆雄雄
链接:
https://juejin.cn/post/7179886787706224695
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



Tags:Java   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
JavaScript的异步编程常见模式
在JavaScript中,异步编程是一种处理长时间运行操作(如网络请求或I/O操作)的常见方式。它允许程序在等待这些操作完成时继续执行其他任务,从而提高应用程序的响应性和性能。JavaS...【详细内容】
2024-04-12  Search: Java  点击:(2)  评论:(0)  加入收藏
17 个你需要知道的 JavaScript 优化技巧
你可能一直在使用JavaScript搞开发,但很多时候你可能对它提供的最新功能并不感冒,尽管这些功能在无需编写额外代码的情况下就可以解决你的问题。作为前端开发人员,我们必须了解...【详细内容】
2024-04-03  Search: Java  点击:(6)  评论:(0)  加入收藏
你不可不知的 15 个 JavaScript 小贴士
在掌握如何编写JavaScript代码之后,那么就进阶到实践——如何真正地解决问题。我们需要更改JS代码使其更简单、更易于阅读,因为这样的程序更易于团队成员之间紧密协...【详细内容】
2024-03-21  Search: Java  点击:(27)  评论:(0)  加入收藏
Oracle正式发布Java 22
Oracle 正式发布 Java 22,这是备受欢迎的编程语言和开发平台推出的全新版本。Java 22 (Oracle JDK 22) 在性能、稳定性和安全性方面进行了数千种改进,包括对Java 语言、其API...【详细内容】
2024-03-21  Search: Java  点击:(10)  评论:(0)  加入收藏
构建一个通用灵活的JavaScript插件系统?看完你也会!
在软件开发中,插件系统为应用程序提供了巨大的灵活性和可扩展性。它们允许开发者在不修改核心代码的情况下扩展和定制应用程序的功能。本文将详细介绍如何构建一个灵活的Java...【详细内容】
2024-03-20  Search: Java  点击:(20)  评论:(0)  加入收藏
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  Search: Java  点击:(15)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20  Search: Java  点击:(24)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18  Search: Java  点击:(27)  评论:(0)  加入收藏
对JavaScript代码压缩有什么好处?
对JavaScript代码进行压缩主要带来以下好处: 减小文件大小:通过移除代码中的空白符、换行符、注释,以及缩短变量名等方式,可以显著减小JavaScript文件的大小。这有助于减少网页...【详细内容】
2024-03-13  Search: Java  点击:(2)  评论:(0)  加入收藏
跨端轻量JavaScript引擎的实现与探索
一、JavaScript 1.JavaScript语言JavaScript是ECMAScript的实现,由ECMA 39(欧洲计算机制造商协会39号技术委员会)负责制定ECMAScript标准。ECMAScript发展史: 2.JavaScript...【详细内容】
2024-03-12  Search: Java  点击:(2)  评论:(0)  加入收藏
▌简易百科推荐
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  vivo互联网技术    Tags:Java 8   点击:(15)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20    51CTO  Tags:Java代码   点击:(24)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18    51CTO  Tags:Java   点击:(27)  评论:(0)  加入收藏
Java生产环境下性能监控与调优详解
堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,...【详细内容】
2024-02-04  大雷家吃饭    Tags:Java   点击:(57)  评论:(0)  加入收藏
在项目中如何避免和解决Java内存泄漏问题
在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序的性...【详细内容】
2024-02-01  编程技术汇  今日头条  Tags:Java   点击:(70)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  编程技术汇    Tags:Java   点击:(73)  评论:(0)  加入收藏
JDK17 与 JDK11 特性差异浅谈
从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性...【详细内容】
2024-01-26  政采云技术  51CTO  Tags:JDK17   点击:(90)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  大雷家吃饭    Tags:Java   点击:(107)  评论:(0)  加入收藏
这篇文章彻底让你了解Java与RPA
前段时间更新系统的时候,发现多了一个名为Power Automate的应用,打开了解后发现是一个自动化应用,根据其描述,可以自动执行所有日常任务,说的还是比较夸张,简单用了下,对于office、...【详细内容】
2024-01-17  Java技术指北  微信公众号  Tags:Java   点击:(99)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  刘汪洋  51CTO  Tags:Java   点击:(78)  评论:(0)  加入收藏
站内最新
站内热门
站内头条