🔴大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂
先看这里
写在前面
每天三分钟,朝闻天下事~,不知道从什么时候养成的习惯,每天早上醒来后,喜欢浏览浏览热点新闻;但是各大新闻站的app和网页上面内容很参差不齐,各种无营养、标题党比比兼是,搞的我浏览一个小时都没吸收多少有用的信息。
靠被人不行,那就得靠自己,所以就借着手里的这台华为云Flexus X实例的云服务器,部署一套热点新闻的项目,然后按照自己的想法,每天从微信中推送整理好的新闻简报,感觉也不错。
这台服务器是华为云828搞活动,利用各种优惠券搞来的,可以说是抢到就是赚到了!!!
活动地址在这里:点我查看
效果
在新闻简报的基础上,我还增加了社会潜规则语录,以及天气预报,其实写法都差不多,大同小异,今天,我们就以新闻简报为例。
另外,我发现好多朋友也和我一样也喜欢看简报,索性我就把大家都集中在一起,一起推送。
华为云Flexus X实例服务器
正好,手里有一台华为云Flexus X实例的云服务器,这款服务器之前我也对其做过性能和数据库方面的评测,整体表现情况还是蛮不错的,所以部署个新闻简报的项目的话,基本上一点问题都没有。
关于这款服务器,大家可以去官网查看更详细的介绍,我这里不做过多的赘述:在这里
部署开源的热点新闻项目
热点项目我们是基于开源的一个项目来部署的,开源地址是:https://github.com/imsyy/DailyHotApi
🚩 特性
- 极快响应,便于开发
- 支持 RSS 模式和 JSON 模式
- 支持多种部署方式
- 简明的路由目录,便于新增
并且还支持接口api直接调用,也就是基于api我们其实可以去做好多场景,比如定时调用给自己的源站中添加简报、定时调用给钉钉、企业微信中推送热点新闻信息等等。
那么,今天我们展示的功能主要也是基于api来实现给微信群中推送的消息。
ssh连接服务器
在部署之前,我们肯定需要先将服务器连接上,我这边找了一款ssh工具。首先,我们在控制台中找到Flexus X实例云服务器的公网ip,如下所示:
复制公网ip后,将其粘贴到ssh工具中,远程端口写22端口,然后点击连接的时候会让你输入用户名和密码,用户名是root,密码就是你自己设置的那个密码。
连接上后,如果没有docker环境的话,需要自行百度安装,本技术不在本问重点讨论。
假设,你已经安装好了docker,接着我们继续进行下一个步骤。
docker部署今日热点项目
在线部署很简单,一共分为两个步骤:
- 拉取
docker pull imsyy/dailyhot-api:latest
- 运行
docker run -p 6688:6688 -d imsyy/dailyhot-api:latest
是不是很简单,就这样就部署完成了,下面我们需要放开一下6688的端口,才能访问到此热点项目,由于我的云服务器上已经安装了宝塔面板,所以我在这里直接通过宝塔上的安全模块中,直接开放对应的6688端口就行。
访问今日热点项目
上面,经过一系列的步骤,已成功将今日热点项目部署完成,下面,我们看看如何访问。
我们开放的端口是6688,我们的ip地址是服务器的公网ip。两个组合一下,就是下面的这个访问地址:
http://124.xxx.xxx.xxx:6688
直接在浏览器中访问这个地址就行,注意将前面的地址换成你自己的公网ip地址。
显示这个界面就表示访问没问题了。
点击【全部接口】我们可以看到所有接口的情况。
搭建微信交互工具
热点项目我们已经部署完成了,现在要想将热点新闻推送到微信群中,我们还需要搭建个微信交互工具,直接用Java代码实现即可。
请看如下代码:
获取token
第一步,我们需要先获取token,调用接口获取即可,有效时间是20分钟,所以我们需要将token存放在redis中。
/**
* 获取服务端机器人的token
*/
public String getmxxWecharBotToken() {
//String url = WECHAT_SERVE_API + "/getWechatToken";
String url = WECHAT_SERVE_API + "/getWechatToken";
JSONObject o = new JSONObject();
o.put("username", LOGIN_USER_NAME);
o.put("password", LOGIN_USER_PASSWORD);
String params = JSON.toJSONString(o);
String body = HttpUtil.createPost(url)
.body(params)
.execute()
.body();
log.info("请求获取服务端的token:{}", body);
JSONObject jsonObject = JSON.parseObject(body);
String token = "";
if (jsonObject.getInteger("code") == 200) {
//获取token
token = jsonObject.getString("token");
//将token放在缓存中
redisService.setCacheObject("mxxWechatRotToken", token, 28, TimeUnit.MINUTES);
}
return token;
}
创建发送的公共方法
接下来就是需要创建发送的公公方法,无论是图片还是文字,视频还是音频,我们都从这个方法中处理,代码如下:
/**
* 给微信机器人中发送信息的公共方法
*/
public String sendMsgToWechat(String wxid, Integer tag, String appkey, String message, boolean isAt, JSONArray atList) {
String url = WECHAT_SERVE_API + "/system/object/customApiSendMsg";
String token = "";
//获取token
Object redisToken = redisService.getCacheObject("mxxWechatRotToken");
if (redisToken == null) {
token = getmxxWecharBotToken();
} else {
token = redisToken.toString();
}
log.info("token的值是{}", token);
//将消息放在body中
JSONObject paramsObject = new JSONObject();
paramsObject.put("tag", tag);
paramsObject.put("wxid", wxid);
paramsObject.put("appkey", appkey);
paramsObject.put("message", message);
paramsObject.put("isAt", isAt);
paramsObject.put("atList", atList);
String body = HttpUtil.createPost(url)
.header(Header.AUTHORIZATION, "Bearer " + token)
.header(Header.CONTENT_TYPE, "application/json")
.body(JSON.toJSONString(paramsObject))
.execute()
.body();
log.info("给微信群中发送的结果:" + body);
return body;
}
封装热点新闻接口发送
最后,我们将热点新闻的接口封装一下,然后调用发送的方法就可以了,代码如下:
/**
* 每天早上6点,改进版本,将国内和国外新闻整合在一起,都是推送10条
*/
@GetMapping("/sendNewsAll")
@Scheduled(cron = " 0 12 6 * * ?")
public void sendNewsAll() {
//从缓存中获取新闻信息
Object rebangnews = redisService.getCacheObject("penpaiReBang");
//获取缓存中的新闻信息
JSONArray array = JSONArray.parseArray(rebangnews.toString());
StringBuilder sb = new StringBuilder();
SimpleDateFormat formatChina = new SimpleDateFormat("yyyy年MM月dd日");
// 将今天日期转换为 SimpleDateFormat 格式,并将明天的日期转换为 SimpleDateFormat 格式
String todayDate = formatChina.format(new Date());
//根据阳历计算农历
Calendar today = Calendar.getInstance();
today.setTime(new Date());
Date tomorrowDate = today.getTime();
String dateTomorrow = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(tomorrowDate);
sb.append("早上好[太阳],今天是:" + todayDate);
String week = "";
try {
week = DateUtils.getDaysByWeekChina(dateTomorrow);
DateUtils lunar = new DateUtils(today);
String nongli = lunar.toString();
nongli = nongli.substring(nongli.indexOf("年") + 1);
sb.append(",星期")
.append(week)
.append(",农历")
.append(nongli);
} catch (ParseException e) {
e.printStackTrace();
}
sb.append("。每天三分钟,读懂全世界!祝:工作愉快,生活喜乐!");
sb.append("/cbr");
sb.append("\uD83D\uDC69\u200D国内新闻:");
sb.append("/cbr");
//获取新闻列表
int i = 1;
for (Object o : array) {
sb.append(i).append(".").append(o);
sb.append("/cbr");
i++;
//只需要10条
if (i > 10) {
break;
}
}
sb.append("/cbr");
sb.append("\uD83D\uDC68\u200D\uD83D\uDD27国际新闻:");
sb.append("/cbr");
//接下来是国际新闻
Object rebangnewsGuoJi = redisService.getCacheObject("reBangGuoJiNews");
//获取缓存中的新闻信息
JSONArray arrayGuoji = JSONArray.parseArray(rebangnewsGuoJi.toString());
//早安寄语从数据库中获取
List<LifeTip> lifeTip = lifeTipService.getLifeTipRangeOne("早安语录", 1);
String zaoan = lifeTip.get(0).getContent();
//遍历新闻
int j = 1;
for (Object o : arrayGuoji) {
sb.append(j).append(".").append(o);
sb.append("/cbr");
j++;
//只需要10条
if (j > 10) {
break;
}
}
sb.append("/cbr");
sb.append("【微语】").append(zaoan);
sb.append("/cbr");
sb.append("/cbr");
sb.append("/cjj公众号:雄雄的小课堂,点击关注,可获得最新消息~");
log.info("发送的新闻信息:" + sb.toString());
//将新闻信息放在redis中
redisService.setCacheObject("news-all-redis", sb.toString());
//调用发送的接口,给三个群中都发送
for (String str : groupList) {
// 生成一个 1-5 秒之间的随机延迟
Random random = new Random();
// 生成一个 1-10 的随机整数
int delay = random.nextInt(5) + 1;
try {
// 等待随机延迟时间,如果需要换成分钟,则乘以60
Thread.sleep(delay * 1000);
String result = sendMsgToWechat(str, XIAOTANGYUAN_REBOT_TEXT, XIAOTANGYUAN_REBOT_APPKEY, sb.toString(), false, new JSONArray());
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
实现的效果就是我们刚开始看到的效果。
需要服务器的,可以点击这里查看详情,
至此,本文over,欢迎大家的阅读,如有疑问,可以在评论区留言,我抽空给大家答疑。