还在手动发早安吗?教你用java实现每日给女友微信发送早安

news2024/12/28 20:04:51
摘要:教你如何用java实现每日给女友微信发送早安等微信信息。

本文分享自华为云社区《java实现每日给女友微信发送早安等微信信息》,作者:穆雄雄 。

前言

据说这个功能最近在抖音上很火,我没有抖音,没有看到。

但是我在网上看了,相关案例确实很多,但是大家都是借助于了微信服务号,在我看来,效果很不佳。

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

网上案例

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

缺点如下:

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

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

(有点肉麻~)

实现方式

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

准备工作

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

2.调用天行数据接口,获取土味情话:

/**
     * 获取每日土味情话
     *
     */
 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");
 }

3.调用天行数据接口,获取天气预报:

 /**
     * 获取天气预报
     *
     */
 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;
 }

2.获取纪念日的天数(两个日期之间的差):

 /**
     * 得到二个日期间的间隔天数
     *
     * @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/113394.html

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

相关文章

排序

章节目录:一、排序算法1.1 概述1.2 分类1.3 算法复杂度1.4 时间复杂度1.5 空间复杂度二、冒泡排序2.1 概述2.2 算法分析2.3 代码示例三、选择排序3.1 概述3.2 算法分析3.3 代码示例四、插入排序4.1 概述4.2 算法分析4.3 代码示例五、希尔排序5.1 概述5.2 算法分析5.…

裸露土堆识别系统 yolov7

裸露土堆识别系统基于yolov7深度学习架构模型,对现场画面实时分析检测,如检测到画面中的土堆有超过40%部分没被绿色防尘网覆盖,则立即抓拍存档告警。我们使用YOLO(你只看一次)算法进行对象检测。YOLO是一个聪明的卷积神经网络(CNN)&#xff0…

我靠steam搬砖,日赚几千,投入不到万元

什么做苦力、技能、直播卖货,电商等等对比我这个都是小钱。我这个方法是利用了大部分人的信息差来赚钱。 我就不藏着掖着了,授人以鱼不如授人以渔,反正你赚的又不是我的钱。 什么是“Steam游戏搬砖”呢? 简单来说,就…

Docker网络

网络基础知识 网络相关命令 查看Linux中的网卡 [rootlocalhost ~]# ip link show[rootlocalhost ~]# ls /sys/class/net[rootlocalhost ~]# ip a 状态: UP、DOWN、UNKNOW link/ether:MAC地址 inet:该网卡绑定的IPv4地址 [rootlocalhost ~]# ip link …

Python和MySQL对比(1):用Pandas 实现MySQL语法效果

文章目录一、前言二、语法对比数据表SELECTASWHEREDISTINCTGROUP BYORDER BYHAVINGLIMIT三、小结一、前言 环境: windows11 64位 Python3.9 MySQL8 pandas1.4.2 本文主要介绍 MySQL 中的关键字:SELECT、AS、WHERE、DISTINCT、GROUP BY、ORDER BY、HAVING…

文献检索

文献检索第一篇检索作业总结第一章检索任务1.1检索课题1.2确定选题所属学科1.3中英文检索词第二章检索策略与结果2.1检索中文期刊文献2.1.1 CNKI中国期刊全文数据库2.1.2 维普期刊全文数据库2.1.3 万方期刊数据库2.1.4 超星期刊全文2.2检索中文学位论文2.2.1 CNKI博硕学位论文数…

Java项目:SpringBoot美容院后台管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为美容院后台管理系统, 操作员包含以下功能:操作员登陆,操作员首页,会员列表,添加会员,添加美容产品,购买商品,添…

YOLOV7学习记录之mAP计算

如何评估一个训练好模型的好坏,是目标检测中一个很重要的因素,如常见的TP、FP、AP、PR、map等 TP、FP、TN、FN TP:被正确分类为正样本的数量;实际是正样本,也被模型分类为正样本 FP:被错误分类为正样本的…

Node.js - 数据库与身份认证

文章目录目标一、数据库的基本概念1、什么是数据库2、常见的数据库及分类3、传统型数据库的数据组织结构(1)Excel 的数据组织结构(2)传统型数据库的数据组织结构(3)实际开发中库、表、行、字段的关系二、安…

RV1126笔记十二:实现RTMP多路拉流

若该文为原创文章,转载请注明原文出处。 一、介绍 通过RV1126实现RTMP的多路拉流,并在屏幕上显示出来,这里涉及到ffmpeg几个重要知识点,和RV1126如何在屏幕分屏显示。 二、流程图 流程和单路拉流类似,这里只是涉及拉取后的图像需要解码缩放,在合成分屏显示出来。 具…

阳过→阳康,数据里的时代侧影;谷歌慌了!看各公司如何应对ChatGPT;两份优质AI年报;本周技术高光时刻 | ShowMeAI每周通讯 #003-12.24

这是ShowMeAI每周通讯的第3期。通讯聚焦AI领域本周热点,及其在各圈层泛起的涟漪;关注AI技术进步,并提供我们的商业洞察。欢迎关注与订阅! 本周在 CSDN 积极答题一路升到 Top2,被系统误判为 ChatGPT 机器人X﹏X 可见压力…

自动化测试-Cypress快速入门

cypress介绍 一个前端自动化测试工具不同于其他只能测试 UI 层的前端测试工具,Cypress 允许编写所有类型的测试,覆盖了测试金字塔模型的所有测试类型**【界面测试,集成测试,单元测试】**Cypress 测试代码和应用程序均运行在由 Cy…

拦截器与过滤器

什么是过滤器 过滤器 Filter 基于 Servlet 实现,过滤器的主要应用场景是对字符编码、跨域等问题进行过滤。Servlet 的工作原理是拦截配置好的客户端请求,然后对 Request 和 Response 进行处理。Filter 过滤器随着 web 应用的启动而启动,只初…

电商订单对接系列-第1章-整体设计

背景 电商行业在处理订单的业务时,初创一般是直接通过电商后台导出表格,然后根据其来跟进进销存。在单量到了一定规模时,业务场景会变得复杂,如促销套餐,拆单,合单等,一般会购买市面上的…

Android -- 每日一问:介绍一下你经常浏览的 Android 技术网站

经典回答 做为一个合格的 Android 开发者,我想官方的 developer 站点是必上的,有什么网站能比官方更全面和权威呢。而且 Android Developer 站点上还有很多指导性的文章写得很不错,也不用担心英文不好,因为基本上官方都翻译了中文…

一文轻松图解搞懂Elasticsearch原理!

ES 的集群模式和 kafka 很像,kafka 又和 redis 的集群模式很像。总之就是相互借鉴! 不管你用没用过 ES,今天我们一起聊聊它。就当扩展大家的知识广度了! 认识倒排索引 「正排索引 VS 倒排索引:」 正排索引 VS 倒排索…

【PyTorch深度学习项目实战100例】—— 基于FastText实现情感二分类任务 | 第78例

前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPy…

【Pandas入门教程】如何重塑表格布局

如何重塑表格布局 来源:Pandas官网:https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html 笔记托管:https://gitee.com/DingJiaxiong/machine-learning-study 文章目录如何重塑表格布局导包数据准备【1】对表行进行排…

3.11.1、虚拟局域网 VLAN 概述

以太网交换机工作在数据链路层(也包括物理层) 使用一个或多个以太网交换机互连起来的交换式以太网,其所有站点都属于同一个广播域。 随着交换式以太网规模的扩大,广播域相应扩大。 巨大的广播域会带来很多弊端: 广播风暴难以管理和维护潜在…

LVGL学习笔记2 - 对象

目录 1. 创建对象 2. 设置大小 3. 设置位置 4. 设置对齐方式 5. 对象的父子关系 6. 其他 前面的例子中,一个矩形创建都是用到obj的函数,obj即是指对象。LVGL的基本要素是对象,实现了屏幕上组件的基本属性,包括大小、坐标、父…