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

news2025/2/28 13:33:41

大家好,我是雄雄。

在这里插入图片描述

前言

据说这个功能最近在抖音上很火,我没有抖音,没有看到。
但是我在掘金和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("亲爱的老婆~早\n\n")
                    .append("充满希望的一天又开始了,今天也要一直开心,不能生我气气~")
                    .append("\n\n今天是:")
                    .append(todayDate)
                    .append(",星期")
                    .append(week)
                    .append(",农历")
                    .append(nongli)
                    .append("\n")
                    .append("是我们相爱的第:")
                    .append(cha)
                    .append("天")
                    .append("\n\n")

            ;
            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("\n\n")
                    .append("爱你一日言:")
                    .append(TianXingApiUtil.getLoveWords())
                    .append("\n\n【早安寄语】")
                    .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点给指定的微信好友推送消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 Ubuntu 上将 ONLYOFFICE 文档集成至 Redmine

ONLYOFFICE 文档是一款符合 GNU AGPL v3.0 的开源办公套件。其中包含基于 Web 的查看器和协作编辑器,可用于处理文本文档、电子表格以及与 OOXML 格式高度兼容的演示文稿。 ONLYOFFICE 文档可与 Nextcloud、ownCloud、Seafile、Alfresco、Plone 等多种云服务进行集…

RabbitMQ(消息中间件)入门

目录 一. 什么是MQ? 二. 应用场景 三. 主流MQ框架 四. Docker安装部署RabbitMQ 1.查询镜像 2.获取镜像 3.运行镜像 四.进入RabbitMQ管理平台进行相关操作 五. RabbitMQ管理平台 1.Virtual Hosts 2.RabbitMQ关键名词 六. MQ的核心概念 七. springboot整合ra…

BiliBili 100+国际名校免费公开课整理分享

本资源这是一份公开课的目录,这里的视频大多来自 YouTube 等国内无法访问的网站,为了方便国内的朋友观看,作者将这些视频搬运到了BiliBili。 资源整理自网络,源地址:https://github.com/wenhan-wu/OpenCourseCatalog 所…

我今年大一,自学编程可行吗?

自学编程是可行的,但是你行不行就不好说了。 可能,这就是人生吧~ 建议你在自学编程之前,先看一下这几个问题: 1、我是一个意志坚定,抗压能力强,能耐得住寂寞的人吗?2、我对学编程是有规划还是只…

君子不玩物丧志,亦常以借物调心,网站集成二次元网页小组件(widget)石蒜模拟器,聊以赏玩

传世经典《菜根谭》中有言曰:“徜徉于山林泉石之间,而尘心渐息;夷犹于诗书图画之内,而俗气潜消。故君子虽不玩物丧志,亦常借物调心。”意思是,徜徉在林泉山石之间,能够摒弃杂念,留意…

C++程序设计——运算符重载(运算符重载的概念;运算符成员函数与友元函数;单目运算符重载;重载流运算符;双目运算符重载;赋值运算符重载)

目录 前言 一、运算符重的概念与意义 1.运算符重载 (1)函数重载 (2)运算符重载 2.运算符重载的意义 (1)例子引入 (2)意义 (3)运算符重载的限制 …

有人问,普通人学python有意义吗?看看这位大佬怎么说

普通人学python有意义吗? 现在随着python越来越火,尤其是它成为了人工智能的第一编程语言,还被纳入了中小学的教育中。并且python的应用范围很广泛,可以解决很多专业或非专业的问题。 但python真的适合普通人学习吗?…

STAMP算法实战

1.案例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。STAMP推荐…

普通二本,去过阿里外包,到现在年薪40W+的高级测试工程师,我的两年转行心酸经历...

我是一个普通二本大学机械专业毕业,17年毕业,19年转行,目前做IT行业的软件测试已经有3年多,职位是高级软件测试工程师,坐标上海… 我想现在我也有一点资格谈论关于转行这个话题;希望你在决定转行之前&…

【网络工程】如何本地调试微信公众号开发教程(Nginx代理方法)

目录 前言 目的 通过Nginx代理实现本地调试微信公众号 实现工具 实现步骤 1.启动本地前端项目 2.首先配置Nginx 3.填写app.conf内容,把本地前端项目与域名形成映射。 4.把app.conf加入到Nginx配置中 5.打开我们安装好的SwitchHosts工具 6.右键管理员权限…

全球电子烟行业快速发展,我国监管政策趋严行业面临重构

一、电子烟在全球范围广泛流行 根据观研报告网发布的《2022年中国电子烟行业分析报告-行业现状与发展趋势分析》显示,电子烟是在最近几年出现的一种电子产品,电子烟宣传的健康无害、有一定满足感对消费者有绝佳的吸引力;电子烟的品味、档次、个性化是吸…

零基础编程学习指南!让你不再迷茫~

一篇初学者干货,请耐心看完,希望对你有帮助。 作为初学者的你,命中了以下问题吗? #张三丰:编程是什么,怎么编程? #张无忌:what,比土木工程好? #成昆&…

Linux限制磁盘与内存配额【超详细】

大家好,我是早九晚十二,目前是做运维相关的工作。写博客是为了积累,希望大家一起进步! 我的主页:早九晚十二 文章目录Linux限制磁盘用量的方式什么是磁盘配额磁盘配额的条件安装quota工具配额步骤新建一个磁盘分区新建…

NVMe 原理 - 命令的处理

蛋蛋读NVMe之一 (ssdfans.com) NVMe 所处层次 NVMe是一种Host与SSD之间通讯的协议,它在协议栈中隶属高层。NVMe在协议栈中处于应用层或者命令层。 NVMe是为SSD所生的。NVMe出现之前,SSD绝大多数走的是AHCI和SATA的协议,后者其实是为传统HDD…

元宇宙产业委与中国传媒大学就“虚拟空间文化生产与管理微专业”课程深度合作

12月17日、18日两天下午,由中国移动通信联合会元宇宙产业工作委员会牵头,为中国传媒大学虚拟空间文化生产与管理微专业成功邀请5位行业内大咖级讲师,为校内、外在读本科生和研究生,以及对虚拟文化生产与管理感兴趣且获得学士学位的…

工控CTF之协议分析6——s7comm

协议分析 流量分析 主要以工控流量和恶意流量为主,难度较低的题目主要考察Wireshark使用和找规律,难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律,难可以难得五花八门 常见的工控协议有:Modbus、MMS、IEC60870、…

windows下安装make,使用makefile文件

文章目录前言Makefile简介make作用安装make:1.windows上安装:chocolatey一、Chocolatey介绍二、Chocolatey安装安装make配置make连接前言 本人在学习go-micro中,用到Makefile,本人之前用过Makefile,但是不知道为什么这…

【蓝桥杯】第12届Scratch国赛中级组第1题 -- 文字特效

[导读]:蓝桥杯大赛是工业和信息化部人才交流中心举办的全国性专业信息技术赛事。蓝桥杯大赛首席专家倪光南院士说:“蓝桥杯以考促学,塑造了领跑全国的人才培养选拨模式,并获得了行业的深度认可。” 春雷课堂计划推出Scratch蓝桥杯…

红袖添香,绝代妖娆,Ruby语言基础入门教程之Ruby3基础语法,第一次亲密接触EP01

书接上回,前一篇我们在全平台构建好了Ruby3的开发环境,现在,可以和Ruby3第一次亲密接触了。 Ruby是一门在面向对象层面无所不用其极的解释型编程语言。 我们可以把编写Ruby代码看作是一场行为上的艺术,编码就像跳舞一样&#xf…

工控CTF之协议分析3——IEC60870

协议分析 流量分析 主要以工控流量和恶意流量为主,难度较低的题目主要考察Wireshark使用和找规律,难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律,难可以难得五花八门 常见的工控协议有:Modbus、MMS、IEC60870、…