通过微信公众号给女朋友推送消息

先看下效果图
在这里插入图片描述

准备工作
1、首先去微信公众平台注册成为测试号,点这里
在这里插入图片描述

然后再添加一个模板
在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/875c3ac58c014834b33e268cf239eda2.png
模板里的json字符串示例如下

{{date.DATA}} {{remark.DATA}} 所在城市:{{city.DATA}} 今日天气:{{weather.DATA}} 气温变化:{{min_temperature.DATA}}~{{max_temperature.DATA}} 今日建议:{{tips.DATA}} 今天是我们恋爱的第{{love_days.DATA}}天 距离婷宝贝生日还有{{girl_birthday.DATA}}天 距离你家康先生生日还有{{boy_birthday.DATA}}{{rainbow.DATA}}

天气和情话我调用的是天行数据管理系统的,他们有免费的额度,够用。
最后就再新建一个springboot项目就好了。

代码实现部分
微信配置代码

package cc.mrbird.febs.system.until;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class WeChatConfigure {public static String Access_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";public static String Send_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={0}";public static String App_ID;@Value("${WeChat.AppID}")public void setAppID(String AppID) {App_ID = AppID;}public static String App_Secret;@Value("${WeChat.AppSecret}")public void setAppSecret(String AppSecret) {App_Secret = AppSecret;}public static String Open_ID;@Value("${WeChat.OpenID}")public void setOpenID(String OpenID) {Open_ID = OpenID;}public static String Template_ID;@Value("${WeChat.TemplateID}")public void setTemplateID(String TemplateID) {Template_ID = TemplateID;}public static String Top_Color;@Value("${WeChat.TopColor}")public void setTopColor(String TopColor) {Top_Color = TopColor;}public static String Weather_API;@Value("${WeChat.WeatherAPI}")public void setWeatherAPI(String WeatherAPI) {Weather_API = WeatherAPI;}public static String Rainbow_API;@Value("${WeChat.RainbowAPI}")public void setRainbowAPI(String RainbowAPI) {Rainbow_API = RainbowAPI;}public static String Boy_Birthday;@Value("${WeChat.BoyBirthday}")public void setBoyBirthday(String BoyBirthday) {Boy_Birthday = BoyBirthday;}public static String Girl_Birthday;@Value("${WeChat.GirlBirthday}")public void setGirlBirthday(String GirlBirthday) {Girl_Birthday = GirlBirthday;}public static String Love_Day;@Value("${WeChat.LoveDay}")public void setLoveDay(String LoveDay) {Love_Day = LoveDay;}
}

具体的值写在yml配置文件里的,示例如下

在这里插入图片描述

工具类

package cc.mrbird.febs.system.until;import cc.mrbird.febs.system.domain.Weather;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.client.RestTemplate;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;public class DataUtils {/*** 获取 Weather 信息* @param restTemplate* @return*/public static Weather getWeather(RestTemplate restTemplate){String responseJson = restTemplate.getForObject(WeChatConfigure.Weather_API, String.class);JSONObject responseResult = JSONObject.parseObject(responseJson);JSONObject jsonObject = responseResult.getJSONArray("newslist").getJSONObject(0);return jsonObject.toJavaObject(Weather.class);}/*** 获取 RainbowPi 信息* @param restTemplate* @return*/public static String getRainbow(RestTemplate restTemplate){String responseJson = restTemplate.getForObject(WeChatConfigure.Rainbow_API, String.class);JSONObject responseResult = JSONObject.parseObject(responseJson);JSONObject jsonObject = responseResult.getJSONArray("newslist").getJSONObject(0);return jsonObject.getString("content");}/*** 计算生日天数 days* @return*/public static int getBirthDays(String birthday) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");Calendar cToday = Calendar.getInstance(); // 存今天Calendar cBirth = Calendar.getInstance(); // 存生日int days = 0;try {cBirth.setTime(dateFormat.parse(birthday)); // 设置生日cBirth.set(Calendar.YEAR, cToday.get(Calendar.YEAR)); // 修改为本年if (cBirth.get(Calendar.DAY_OF_YEAR) < cToday.get(Calendar.DAY_OF_YEAR)) {// 生日已经过了,要算明年的了days = (cToday.getActualMaximum(Calendar.DAY_OF_YEAR) - cToday.get(Calendar.DAY_OF_YEAR)) + cBirth.get(Calendar.DAY_OF_YEAR);} else {// 生日还没过days = cBirth.get(Calendar.DAY_OF_YEAR) - cToday.get(Calendar.DAY_OF_YEAR);}} catch (ParseException e) {e.printStackTrace();}return days;}/*** 计算恋爱天数 days* @return*/public static int getLoveDays(String loveday) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");int days = 0;try {long time = System.currentTimeMillis() - dateFormat.parse(loveday).getTime();days = (int) (time / (24 * 60 * 60 * 1000));} catch (ParseException e) {e.printStackTrace();}return days;}/*** 获取token,默认7200秒过期,所以存redis7200秒取一次* @return 获取用户详情*/public static String getAccessToken(RestTemplate restTemplate) {String responseJson = restTemplate.getForObject("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxb23f8f7f1f2ed5a6&secret=5bf40a38641e5bc5e3d11ab4c1cadc4f", String.class);JSONObject responseResult = JSONObject.parseObject(responseJson);return responseResult.getString("access_token");}
}

具体的实现代码

package cc.mrbird.febs.system.controller;import cc.mrbird.febs.system.domain.DataItem;
import cc.mrbird.febs.system.domain.ResultVo;
import cc.mrbird.febs.system.domain.Weather;
import cc.mrbird.febs.system.until.DataUtils;
import cc.mrbird.febs.system.until.WeChatConfigure;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;@Slf4j
@Validated
@RestController
@RequestMapping("ztt")
public class ZttControlle {@Beanpublic RestTemplate restTemplate(RestTemplateBuilder builder){return builder.build();}@Autowiredprivate RestTemplate restTemplate;/*** {{date.DATA}}* {{remark.DATA}}* 所在城市:{{city.DATA}}* 今日天气:{{weather.DATA}}* 气温变化:{{min_temperature.DATA}} ~ {{max_temperature.DATA}}* 今日建议:{{tips.DATA}}* 今天是我们恋爱的第 {{love_days.DATA}} 天* 距离xx生日还有 {{girl_birthday.DATA}} 天* 距离xx生日还有 {{boy_birthday.DATA}} 天* {{rainbow.DATA}}*/@Scheduled(cron = "0 0 8 * * ?")public void push(){ResultVo resultVo = ResultVo.initializeResultVo(WeChatConfigure.Open_ID,WeChatConfigure.Template_ID,WeChatConfigure.Top_Color);//1.设置城市与天气信息Weather weather = DataUtils.getWeather(restTemplate);resultVo.setAttribute("date",new DataItem(weather.getDate() + " " + weather.getWeek(),"#00BFFF"));resultVo.setAttribute("city",new DataItem(weather.getArea(),null));resultVo.setAttribute("weather",new DataItem(weather.getWeather(),"#1f95c5"));resultVo.setAttribute("min_temperature",new DataItem(weather.getLowest(),"#0ace3c"));resultVo.setAttribute("max_temperature",new DataItem(weather.getHighest(),"#dc1010"));resultVo.setAttribute("tips",new DataItem(weather.getTips(),null));//2.设置日期相关int love_days = DataUtils.getLoveDays(WeChatConfigure.Love_Day);int girl_birthday = DataUtils.getBirthDays(WeChatConfigure.Girl_Birthday);int boy_birthday = DataUtils.getBirthDays(WeChatConfigure.Boy_Birthday);resultVo.setAttribute("love_days",new DataItem(love_days+"","#FFA500"));resultVo.setAttribute("girl_birthday",new DataItem(girl_birthday+"","#FFA500"));resultVo.setAttribute("boy_birthday",new DataItem(boy_birthday+"","#FFA500"));//3.设置彩虹屁String rainbow =  DataUtils.getRainbow(restTemplate);resultVo.setAttribute("rainbow",new DataItem(rainbow,"#FF69B4"));//4.其他String remark = "❤";if(DataUtils.getBirthDays(WeChatConfigure.Love_Day) == 0){remark = "今天是恋爱周年纪念日!永远爱你~";}else if(girl_birthday == 0){remark = "今天是婷宝贝的生日!生日快乐哟~";}else if(boy_birthday == 0){remark = "今天是康先生的生日!别忘了好好爱他~";}resultVo.setAttribute("remark",new DataItem(remark,"#FF1493"));//5.发送请求,推送消息String responseStr = restTemplate.postForObject(WeChatConfigure.Send_URL, resultVo, String.class, DataUtils.getAccessToken(restTemplate));printPushLog(responseStr);}/*** 打印 response log* @param responseStr*/private void printPushLog(String responseStr){JSONObject jsonObject = JSONObject.parseObject(responseStr);String msgCode = jsonObject.getString("errcode");String msgContent = jsonObject.getString("errmsg");SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("[ " + dateFormat.format(new Date()) + " ] : messageCode=" + msgCode + ",messageContent=" + msgContent);}
}

还一个Weather的实体类,我就不贴出来了,你们可以参考着天行的接口写下就好。
如需源码可私聊我

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

观察者模式,从公众号群发说起

每个人应该都订阅了不少微信公众号&#xff0c;那你有没有注意到微信公众号的消息呢&#xff1f;你订阅的公众号号主每发布一篇文章&#xff0c;你都会主动的接收到文章的推送&#xff0c;并不需要你点开每个订阅的公众号一一查看有没有更新&#xff0c;是不是觉得有点意思&…

推特开发者账号 学术【推特开发者文档V2系列3】——tweepy4 解决推文省略号|推文不全

关于推特开发者账号 elevated academic 请看此贴&#xff1a; 推特开发者账号申请权限 或 搜索微信公众号 twitterDeveloper 获得帮助 书接上文&#xff1a; 使用tweepy4 搜索历史推文 在使用推特 v2接口的时候&#xff0c;比如上面的文章&#xff0c;有时候会发现tweepy返…

英语积累知识(一) 2020/1/28 公众号推文翻译

2020/1/28 公众号推文翻译 翻译 This Spring Festival is doomed to be a peculiar one. Without the noise of former festivals, without visiting friends and relatives and dining together with friends, instead&#xff0c;people stay at home to amuse themselves(se…

群推王|如何引爆您的推特流量

推特营销主要吸引力在于其庞大的用户群体。它是最大的社交媒体平台之一&#xff0c;据统计每月有3.3亿活跃用户&#xff0c;为品牌知名度和增长做出了重大贡献。 尽管我们都知道推特营销的重要性&#xff0c;但是在实际运用上大家可能会遇到一些问题&#xff0c;比如您有很多粉…

微信公众号推文发布方法(内涵详细步骤)

今天又朋友专门发信息咨询微信公众号推文怎么发布以及维护方法,在大不分熟悉微信公众号发文流程的同学看来,其实是非常简单的;但是对于没有接触过这一方面的其他同学来讲,也是一件非常苦恼的事情,没有头绪。在经过一番对于朋友的指导,我也把这一流程记录在此,希望能给到…

微信公众号推文发布方法(内含详细步骤)

今天有朋友专门发信息咨询微信公众号推文怎么发布以及维护方法&#xff0c;在大部分熟悉微信公众号发文流程的同学看来&#xff0c;其实是非常简单的&#xff1b;但是对于没有接触过这一方面的其他同学来讲&#xff0c;也是一件非常苦恼的事情&#xff0c;没有头绪。在经过一番…

大模型在金融AIGC领域的前景与应用

随着大模型技术的火爆&#xff0c;人们在思考如何借助 AI 提高编程效率的同时&#xff0c;也在思考 AI 对各行各业都会带来怎样的影响。在 CSDN 与《新程序员》合作举办的「新程序员大会&#xff08;NPCon&#xff09;——AIGC 与大模型技术应用论坛」上&#xff0c;来自文因互…

刘强东终于向自己的兄弟下手了!

作者 | 胡巍巍 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 曾经有这么一位老板&#xff0c;把自己的员工当兄弟&#xff0c;称“不会开除任何一位兄弟”。 图源见水印 曾经这位老板&#xff0c;在某年的老员工授勋仪式上&#xff0c;无比仗义地说&#xff…

互联网大佬们的代码水平如何?网友:刘强东95年一个晚上赚5万

作为京东集团大佬&#xff0c;刘强东备受关注。互联网界的大佬&#xff0c;很多都是程序员出身&#xff0c;或者会写代码&#xff0c;就像雷军、马化腾、李彦宏、周鸿祎等&#xff0c;几乎都是编程高手。有人问刘强东的代码水平如何? 关于这个问题&#xff0c;得到了很多网友的…

刘强东的代码水平到底有多强?30年前就已破万!

在人工智能机器学习的领域中&#xff0c;目前最火的莫过于计算机视觉了&#xff0c;这项技术一直广受关注&#xff0c;而其中的目标检测是计算机视觉领域中最常见的问题之一。 从去年的 YOLOv4 发布后&#xff0c;目标检测框架被问的最多的问题就是&#xff1a;“有没有同学复现…

刘强东个人标签太明显,京东没有二号人物

作者 | 赵陈婷 不管个人形象上是利好还是利空&#xff0c;爱公开发声的刘强东的一举一动经常直接影响着京东的股价。不过这个周一&#xff0c;京东赶上了美国劳动节美股休市。 可以说&#xff0c;作为创始人刘强东很大程度上是和他所创办的企业京东划上等号的。这家1998年成立的…

拼多多面试官没想到ThreadLocal我用得这么溜,人直接傻掉

点赞再看&#xff0c;养成习惯&#xff0c;微信搜一搜【敖丙】关注这个互联网苟且偷生的程序员。 本文 GitHub https://github.com/JavaFamily 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 开场白 张三最近天气很热心情不是很好&#xff0c;所以他决定…

大数据面试吹牛草稿V2.0

面试吹牛之前先打个草稿&#xff01; 本文首发于微信公众号【五分钟学大数据】&#xff0c;公众号上有很多大数据学习方法&#xff0c;学习文档&#xff0c;最全的大数据面试八股文等 各位面试官好! 1. 我叫 xxx&#xff0c;毕业于 xxx&#xff0c;之前在 xxx 公司待了 1 年多&…

抢程序员饭碗?自动写代码的Deep TabNine真如此神奇?

作者 | James Vincent等 编译 | 夕颜 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 导读&#xff1a;在过去的一年中&#xff0c;AI 生成书面文字的能力大大提高。通过扫描庞大的文本数据集&#xff0c;机器学习软件可以生成从短篇小说到歌词的各种令人信服的样本…

刘强东的代码水平如何?网友:当年一晚赚5万

作为京东集团大佬&#xff0c;刘强东备受关注。互联网界的大佬&#xff0c;很多都是程序员出身&#xff0c;或者会写代码&#xff0c;就像雷军、马化腾、李彦宏、周鸿祎等&#xff0c;几乎都是编程高手。于是有人问道&#xff0c;刘强东的代码水平如何? 关于这个问题&#xff…

【我惊呆了】Chatgpt比程序员还懂代码

Chatgpt竟然比程序员还懂代码&#xff1f;这个AI让我惊呆了 你有没有遇到过这样的情况&#xff1a;你在写代码的时候&#xff0c;突然发现一个bug&#xff0c;但是你怎么也找不出原因&#xff0c;只能无奈地看着程序崩溃。你想要求助&#xff0c;但是同事都很忙&#xff0c;网上…

刘强东不学编程,今天很可能没有京东......一位码农的发家致富史

公元前216年&#xff0c;16岁的项羽随叔父离开老家宿迁&#xff0c;踏上了西楚霸王之路。2200多年后&#xff0c;“大强子”带着村里人为他凑的500块钱和76个茶叶蛋&#xff0c;离开老家宿迁&#xff0c;来到了中国人民大学社会学院。他跟朋友说&#xff1a;我就是想当官&#…

afl-fuzz.c 源码全分析

afl-fuzz.c 源码全分析 picasso big sb 这是整个 afl 项目的核心&#xff0c;本文根据 clion 调试的执行顺序进行分析。 首先使用 afl-gcc 编译并插桩程序&#xff1a; afl-gcc -g test1.c -o afl-test然后设置 afl-fuzz 的参数&#xff0c;fuzz_in 和 fuzz_out 是新建的&a…

C++高级编程-高级特性

临时总结&#xff1a; <utility> std::move 获得右值引用 奇形怪状的函数 1.传统函数 void f&#xff08;int a&#xff09;{}2.<functional> bind bind( F&& f, Args&&... args ); 参数 f - 可调用 (Callable) 对象&#xff08;函数对象、指向函…

Vue——May(1)

VUE 一、vue基础1.1 引用1.2 基础应用1.3 模板语法1.4 数据处理1.5 el与 .$mount1.6 data的函数式写法1.7 架构模型——MVVM模型1.8 数据代理Object.defineproperty1.9 理解数据代理1.10 事件处理1.10.1 参数1.10.2 this1.10.3 简写1.10.4 传参 1.11 事件修饰符1.12 键盘事件1.…