摘要:教你如何用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点给指定的微信好友推送消息。

点击关注,第一时间了解华为云新鲜技术~

还在手动发早安吗?教你用java实现每日给女友微信发送早安的更多相关文章

  1. 还在手动给css加前缀?no!几种自动处理css前缀的方法简介

    原文首发于个人博客:还在手动给css加前缀?no!几种自动处理css前缀的方法简介 我们知道在写css的时候由于要兼容不同厂商浏览器,一些比较新的属性需要给它们添加厂商前缀来兼容.移动端还好,基本只要 ...

  2. 教妹学 Java:晦涩难懂的泛型

    00.故事的起源 “二哥,要不我上大学的时候也学习编程吧?”有一天,三妹突发奇想地问我. “你确定要做一名程序媛吗?” “我觉得女生做程序员,有着天大的优势,尤其是我这种长相甜美的.”三妹开始认真了起 ...

  3. 教妹学 Java:大有可为的集合

    00.故事的起源 “二哥,上一篇<泛型>的反响效果怎么样啊?”三妹对她提议的<教妹学 Java>专栏很是关心. “有人评论说,‘二哥你敲代码都敲出幻想了啊.’” “呵呵,这句话 ...

  4. 教妹学 Java:动态伴侣 Groovy

    ​ 00.故事的起源 “二哥,听说上一篇<多线程>被 CSDN 创始人蒋涛点赞了?”三妹对她提议的<教妹学 Java>专栏一直很关心. “嗯,有点激动.刚开始还以为是个马甲,没 ...

  5. 教妹学Java:Spring 入门篇

    你好呀,我是沉默王二,一个和黄家驹一样身高,刘德华一样颜值的程序员(管你信不信呢).从两位偶像的年纪上,你就可以断定我的码龄至少在 10 年以上,但实话实说,我一直坚信自己只有 18 岁,因为我有一颗 ...

  6. 教妹学 Java:难以驾驭的多线程

    00.故事的起源 “二哥,上一篇<集合>的反响效果怎么样啊?”三妹对她提议的<教妹学 Java>专栏很关心. “这篇文章的浏览量要比第一篇<泛型>好得多.” “这是 ...

  7. 还在手动部署jar包吗?快速掌握Jenkins安装,教你使用Jenkins实现持续交付

    Jenkins Jenkins: 开源软件项目 基于Java开发的一种持续集成工具 用于监控持续重复的工作 旨在提供一个开放易用的软件平台, 便于软件的持续集成 基于Docker安装Jenkins 与 ...

  8. 你现在还在手动生成set,get方法吗?使用lombok

    JAVA面向对象编程中的封闭性和安全性.封闭性即对类中的域变量进行封闭操作,即用private来修饰他们,如此一来其他类则不能对该变量访问.这样我们就将这些变量封闭在了类内部,这样就提高了数据的安全性 ...

  9. 还不知道如何使用 IDEA ?教你三招快速掌握 IDEA

    前言 IntelliJ IDEA 是一个非常强大的 IDE,拥有许多功能.在 IDEA 中大部分功能都可以用快捷键去完成,如果掌握了大部分快捷键,可以只使用键盘开发了. ps: 最近正在练习快捷键,准 ...

  10. Telnet 连接smtp协议手动发邮件

    下面实验以QQ邮箱为例(比较多人用,其它邮箱也一样) Step1.打开CMD 输入:telnet SMTP服务器 SMTP端口地址   连接smtp服务器 Step2. 输入:helo 内容 (向它( ...

随机推荐

  1. 钉钉OA自定义审批流的创建和使用

    前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教. 钉钉作为一款办公软件,审批功能是它的核心功能 ...

  2. Nodejs环境打包前端项目

    Node.js 在Linux下安装和环境搭建/编译项目 安装nodejs:1.下载nodejs源码包 wget https://nodejs.org/dist/v14.16.0/node-v14.16 ...

  3. AGC 补题笔记

    [AGC001] A.BBQ Easy 由于最大数肯定要和一个比自己小的数搭配保留该数,不如选择保留次大数,如此递归即解.因此将序列排序后输出序号为奇数的数即可. B.Mysterious Light ...

  4. 数组操作 filter和find

    现在有个需求: 后端给一个list过来,1-4,有就显示,没有前面四个card就空着,从第五个开始,有数据就循环出来,区别他们的kind字段. 这里想了很久怎么写,最后决定,洗数据. 就是从给给的数据 ...

  5. Python:发送邮件或发带附件的邮件

    在进行发邮件之前,首先了解两个模块:smtplib和email. smtplib模块主要是负责发送邮件的,是一个发邮件的动作,比如连接邮箱服务,登录邮箱,发送邮件等. email模块主要是负责构造邮件 ...

  6. 夯实JAVA基本之一 —— 泛型详解(1):基本使用(转)

    一.引入1.泛型是什么首先告诉大家ArrayList就是泛型.那ArrayList能完成哪些想不到的功能呢?先看看下面这段代码:ArrayList<String> strList = ne ...

  7. 【scipy 基础】--线性代数

    SciPy的linalg模块是SciPy库中的一个子模块,它提供了许多用于线性代数运算的函数和工具,如矩阵求逆.特征值.行列式.线性方程组求解等. 相比于NumPy的linalg模块,SciPy的li ...

  8. 抽象工厂(Abstract Factory)

    模式定义 提供一个接口, 让该接口负责创建一系列'相关或者相互依赖的对象' , 无需指定他们具体的类 要点总结 如果没有应对'多系列对象构建'的需求变化 ,则没有必要使用Abstract Factor ...

  9. JAVA学习week2

    这周:根据老师在群里面推荐的JAV学习路线,初步规划了一下学习方案 并找到了相关的视频,目前来说在学习SE.学习内容:环境变量的配置和简单的hello world程序书写的注意点 下周:打算进行简单的 ...

  10. FreeSWITCH在answer前主动发dtmf

    操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 NAT环境的主动外呼场景下,会遇到线路侧回铃音数据无法接收的问题,需要FreeSWITCH主动发送RTP数据,发送D ...