还在手动发早安吗?教你用java实现每日给女友微信发送早安
摘要:教你如何用java实现每日给女友微信发送早安等微信信息。
本文分享自华为云社区《java实现每日给女友微信发送早安等微信信息》,作者:穆雄雄 。
前言
据说这个功能最近在抖音上很火,我没有抖音,没有看到。
但是我在网上看了,相关案例确实很多,但是大家都是借助于了微信服务号,在我看来,效果很不佳。
其实我原来的初衷是这样的,每天定时给群里推送新闻,这个原因在之前的文章中也提到过,这边就不在细说了,然后实现了给群中推送之后,就想着,能不能每天给指定人发送消息,网上搜了搜,果然有,各种实现方式五花八门,但是都没看上,于是就自己找了个,自己写。
网上案例
网上最多的可能就是利用微信服务号给推送信息,如图所示:


缺点如下:
- 需要点进去订阅号才能看到,没哟起到吸引的作用
- 申请的测试服务号,也不知道多久过期,说停就给你停掉了
- 定制化的需求有的达不到
介于此,我就自己找了一个路子去做,昨晚刚写完,测了测,效果还是比较不错的。如下图所示:

(有点肉麻~)
实现方式
下面我们来看看是如何实现的。
准备工作
- 注册智能微秘书账号,花20块钱开个会员(20块钱一点都不多)
- 注册天行数据的账号,申请三个接口(早安寄语、每日新闻、土味情话),也可以自己加入别的有意义的内容,直接申请接口就行。
- 准备一个微信号,可以用你现在自己的,也可以在申请一个。
- 准备一个服务器
- 准备一个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();
}
}
说明:
- WeiZhiMiShuVO类可以参考文章:java实现给微信群中定时推送消息
- 代码中涉及到的常量,都放在了常量类中,SEND_USER是要发给微信好友的好友昵称,不是备注哈。
- 智能微秘书接口地址:接口地址
然后我们在控制器controller中调用该方法即可实现:
/**
* 发送消息给指定的人
*/
@GetMapping(value = "/sendWechatToUser")
@Scheduled(cron ="0 0 8 * * ?")
public void sendWechatToUser(){
articleService.sendWechatToUser();
}
cron ="0 0 8 * * ?是一个corn表达式,表示每天早上8点给指定的微信好友推送消息。
还在手动发早安吗?教你用java实现每日给女友微信发送早安的更多相关文章
- 还在手动给css加前缀?no!几种自动处理css前缀的方法简介
原文首发于个人博客:还在手动给css加前缀?no!几种自动处理css前缀的方法简介 我们知道在写css的时候由于要兼容不同厂商浏览器,一些比较新的属性需要给它们添加厂商前缀来兼容.移动端还好,基本只要 ...
- 教妹学 Java:晦涩难懂的泛型
00.故事的起源 “二哥,要不我上大学的时候也学习编程吧?”有一天,三妹突发奇想地问我. “你确定要做一名程序媛吗?” “我觉得女生做程序员,有着天大的优势,尤其是我这种长相甜美的.”三妹开始认真了起 ...
- 教妹学 Java:大有可为的集合
00.故事的起源 “二哥,上一篇<泛型>的反响效果怎么样啊?”三妹对她提议的<教妹学 Java>专栏很是关心. “有人评论说,‘二哥你敲代码都敲出幻想了啊.’” “呵呵,这句话 ...
- 教妹学 Java:动态伴侣 Groovy
00.故事的起源 “二哥,听说上一篇<多线程>被 CSDN 创始人蒋涛点赞了?”三妹对她提议的<教妹学 Java>专栏一直很关心. “嗯,有点激动.刚开始还以为是个马甲,没 ...
- 教妹学Java:Spring 入门篇
你好呀,我是沉默王二,一个和黄家驹一样身高,刘德华一样颜值的程序员(管你信不信呢).从两位偶像的年纪上,你就可以断定我的码龄至少在 10 年以上,但实话实说,我一直坚信自己只有 18 岁,因为我有一颗 ...
- 教妹学 Java:难以驾驭的多线程
00.故事的起源 “二哥,上一篇<集合>的反响效果怎么样啊?”三妹对她提议的<教妹学 Java>专栏很关心. “这篇文章的浏览量要比第一篇<泛型>好得多.” “这是 ...
- 还在手动部署jar包吗?快速掌握Jenkins安装,教你使用Jenkins实现持续交付
Jenkins Jenkins: 开源软件项目 基于Java开发的一种持续集成工具 用于监控持续重复的工作 旨在提供一个开放易用的软件平台, 便于软件的持续集成 基于Docker安装Jenkins 与 ...
- 你现在还在手动生成set,get方法吗?使用lombok
JAVA面向对象编程中的封闭性和安全性.封闭性即对类中的域变量进行封闭操作,即用private来修饰他们,如此一来其他类则不能对该变量访问.这样我们就将这些变量封闭在了类内部,这样就提高了数据的安全性 ...
- 还不知道如何使用 IDEA ?教你三招快速掌握 IDEA
前言 IntelliJ IDEA 是一个非常强大的 IDE,拥有许多功能.在 IDEA 中大部分功能都可以用快捷键去完成,如果掌握了大部分快捷键,可以只使用键盘开发了. ps: 最近正在练习快捷键,准 ...
- Telnet 连接smtp协议手动发邮件
下面实验以QQ邮箱为例(比较多人用,其它邮箱也一样) Step1.打开CMD 输入:telnet SMTP服务器 SMTP端口地址 连接smtp服务器 Step2. 输入:helo 内容 (向它( ...
随机推荐
- 《流畅的Python》 读书笔记 第三章字典和集合 20231017
第3章 字典和集合 dict 类型是 Python 语言的基石 模块的命名空间.实例的属性和函数的关键字参数中都可以看到字典的身影 跟它有关的内置函数都在__builtins__.__dict__ 模 ...
- PoW、PoS、DPoS和PBFT简介
1. 概览 PoW(工作量证明).PoS(权益证明).DPoS(委托权益证明)和PBFT(拜占庭容错)是区块链和分布式系统领域中常见的共识算法.下面将详细介绍这些共识算法的原理和特点: PoW(工作量 ...
- JavaScript 语法:语法约定与程序调试
作者:WangMin 格言:努力做好自己喜欢的每一件事 JavaScript 语法约定 1.大小写的区分 1). JavaScript的关键字,永远都是小写的: 2). 内置对象,如Math和Date ...
- Meissel–Lehmer 算法
前言 推荐先行阅读我的blog文章----Min_25 筛 什么是Meissel–Lehmer 算法 Meissel-Lehmer 算法是一种基于 \(ϕ\) 函数的的快速计算前缀质数个数(当然也可以 ...
- 毕业论文精选:基于Qt的高考志愿系统填报查询的设计与实现
基于Qt的高考志愿系统填报查询的设计与实现 摘 要 在当今社会教育的迅速发展下,高考人数的规模和增长速度也是空前的.高考已经变成了家长和社会高度关注的事情,但是高考只是一个开始,高考结束后的志 ...
- 吉特日化MES & 再谈原料标签
在前面之前提到的标签的选择和设计,原料标签可以做到如下几点: 1 原料标签是一物一码还是一码多物:在美妆类的原料建议原料标签采用一物一码,对于大液洗之类的产品原料如果能够做到一物一码最佳,但是 ...
- Markdown References
每次写文章,用到都要查一下的Markdown语法 字体颜色 [Markdown笔记]设置字体颜色 字体颜色 Font colors Decrsiption Demonstration Effect 选 ...
- C# 基础编程题集锦
简单字符串加密 编写一个应用程序用来输入的字符串进行加密,对于字母字符串加密规则如下: 'a→d' 'b'→'e' 'w'→z' ...... x'→'a' 'y'→b' 'z→c' 'A'→'D' ...
- viewPager2页面的切换
使用流程: 1.定义ViewPager 2.为ViewPager创建Adapter ViewPagerAdapter package com.example.viewpagerandfragm ...
- 华企盾科技:智能AI自动化研判分析服务系统概述
由中企网安全资子公司北京华企盾科技有限责任公司开发的<智能AI自动化研判分析服务系统>,获得国家版权局颁发的计算机软件著作权登记证书. 智能AI自动化研判分析服务系统是基于人工智能.大数据 ...