【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

这篇具有很好参考价值的文章主要介绍了【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、资料链接

1、github地址

https://github.com/qq1534774766/wx-push

2、教程地址

https://blog.csdn.net/qq15347747/article/details/126521774

3、易客云API(自动发送天气)

https://yikeapi.com/account/index

4、apispace-各种接口(名人名言)

https://www.apispace.com/console/api?orgId=6356

5、微信公众平台

https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

二、准备工作

(一)进入接口测试页面

1、找到微信公众平台

2、进入开发者工具

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

3、进入公众平台测试帐号

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

4、拉到最下面

微信扫码关注

5、记录下述信息

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

(二)获取天气预报接口地址

1、进入易客云API(自动发送天气)

https://yikeapi.com/account/index

2、注册登录

3、复制参数appid和appsecret的值

4、记录下述信息

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

(三)获取(名言警句)地址

1、进入apispace-各种接口

https://www.apispace.com/console/api?orgId=6356

2、注册登录

3、购买名言警句

4、进入我的api,点击测试

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

5、复制token地址

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

6、记录下述信息

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

三、开发部署

1、下载项目

git下载:https://github.com/qq1534774766/wx-push.git

2、填写上述参数(application.yml)

3、配置定时

填写cron表达式@Scheduled(cron = "0 30 7 ? * *")

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

实现方式:import org.springframework.scheduling.annotation.Scheduled;

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

4、启动项目

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

5、测试

修改天气预报城市:localhost:8081

测试发送消息:localhost:8081/send

6、打包上传服务器

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

nohup java -jar wx.jar >wx.txt &

四、优化

(一)cron表达式配置及含义

1、启动类加注解

@EnableScheduling

2、几分钟执行一次

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

/**
     * 固定频率执行。fixedDelay的单位是ms
     */
    @Scheduled(fixedDelay = 1000)
    public void remindTask2() throws InterruptedException {
        log.info("每隔1s执行一次 当前线程名称{} 当前执行次数{}", Thread.currentThread().getName(), task1Number.incrementAndGet());
    }

3、cron表达式配置

5秒执行一次

@Scheduled(cron = "*/5 * * * * ? ")
    public void remindTask() throws InterruptedException {
        log.info("每隔5秒执行一次, 当前线程名称{} 当前执行次数{}", Thread.currentThread().getName(), taskNumber.incrementAndGet());
    }

ps:?的含义是

“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值 当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”

项目使用

@Scheduled(cron = "0 30 7 ? * *")
    @RequestMapping("/send")
    public String send() {
        try {
            return sendService.sendWeChatMsg();
        } catch (Exception e) {
            e.printStackTrace();
        }
        JSONObject json = new JSONObject();
        json.put("msg", "信息推送失败");
        return json.toJSONString();
    }

corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份

DayofMonth和DayofWeek会相互影响

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

校验:https://www.bejson.com/othertools/cronvalidate/

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

日期和星期相互影响,必须配置一个?【?表示不指定周几或每月几号,因为二者相互影响】

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

配置哪个含义相同

(二)配置名言外的其他api(apispace)

找到名言警句的配置地址

配置其他api

1、示例文档地址

https://www.apispace.com/console/api?orgId=6356

2、示例代码

OkHttpClient client = new OkHttpClient().newBuilder().build();
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody body = RequestBody.create(mediaType, "titleID=1");
Request request = new Request.Builder()
  .url("https://eolink.o.apispace.com/myjj/common/aphorism/getAphorismList")
  .method("POST",body)
  .addHeader("X-APISpace-Token","s2qvfzkmuzb9vq7pvw8tnll882rhrarl")
  .addHeader("Authorization-Type","apikey")
  .addHeader("Content-Type","application/x-www-form-urlencoded")
  .build();

Response response = client.newCall(request).execute();

3、实际代码

ProverbServiceImpl

@Override
    public String getOneNormalProverb() {
        String proverb = null;
        try {
            OkHttpClient client = new OkHttpClient().newBuilder().build();
            MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
            RequestBody body = RequestBody.create(mediaType, "titleID="+new Random().nextInt(9));
            Request request = new Request.Builder()
                    .url("https://eolink.o.apispace.com/myjj/common/aphorism/getAphorismList")
                    .method("POST", body)
                    .addHeader("X-APISpace-Token", configConstant.getToken())
                    .addHeader("Authorization-Type", "apikey")
                    .addHeader("Content-Type", "")
                    .build();
Response response = client.newCall(request).execute();
        JSONObject jsonObject = JSONObject.parseObject(response.body().string());
        //取出全部句子
        JSONArray allProverb = JSONObject.parseArray((String) jsonObject.getJSONArray("result").getJSONObject(0).get("words"));
        //随机取出一条句子
        String s = (String) allProverb.get(new Random().nextInt(allProverb.size()));
        //去除无关元素
        proverb = s.replaceAll("^.*、", "");
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
    return proverb;
}

通过有道翻译为英文

@Override
    public String translateToEnglish(String sentence) {
        String result = null;
        try {
            OkHttpClient client = new OkHttpClient().newBuilder().build();
            Request request = new Request.Builder()
                    .url("https://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i="+sentence)
                    .get()
                    .addHeader("Content-Type","")
                    .build();
            Response response = client.newCall(request).execute();
            result = response.body().string();
            //解析
            JSONObject jsonObject = JSONObject.parseObject(result);
            result = jsonObject.getJSONArray("translateResult").getJSONArray(0).getJSONObject(0).getString("tgt");
        }catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

(三)配置天气预报的原理(易客云)

1、得到当日天气

public JSONObject getWeatherByCity() {
        String result = null;
        try {
            OkHttpClient client = new OkHttpClient.Builder().build();
            HttpUrl url = new HttpUrl.Builder()
                    .scheme("https")
                    .host("www.yiketianqi.com")
                    .addPathSegments("free/day")
                    .addQueryParameter("appid", configConstant.getWeatherAppId())
                    .addQueryParameter("appsecret", configConstant.getWeatherAppSecret())
                    .addQueryParameter("city", configConstant.getCity())
                    .addQueryParameter("unescape", "1")
                    .build();
            Request request = new Request.Builder()
                    .url(url)
                    .get()
                    .build();
            Response re = client.newCall(request).execute();
            result = re.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return JSONObject.parseObject(result);
		}

2、得到三日天气

public Map<String, String> getTheNextThreeDaysWeather() {
        Map<String, String> map =  null;
        try {
            OkHttpClient client = new OkHttpClient.Builder().build();
            HttpUrl url = new HttpUrl.Builder()
                    .scheme("https")
                    .host("yiketianqi.com")
                    .addPathSegments("free/week")
                    .addQueryParameter("appid", configConstant.getWeatherAppId())
                    .addQueryParameter("appsecret", configConstant.getWeatherAppSecret())
                    .addQueryParameter("city", configConstant.getCity())
                    .build();
            Request request = new Request.Builder()
                    .url(url)
                    .get()
                    .build();
            Response response = client.newCall(request).execute();
            String responseResult = response.body().string();
            if (!StringUtils.hasText(responseResult)) {
                logger.error("获取三天天气失败,检查配置文件");
                throw new RuntimeException("获取三天天气失败,检查配置文件");
            }
            logger.info(responseResult);
            ZoneId zoneId = ZoneId.of("Asia/Shanghai");
            LocalDate now = LocalDate.now(zoneId);
            //封装今天,明天,后天的时间
            /**
             * 原因分析:从天气api获取到未来的天气的日期是 01  02  03 的两位数。
             * 而Java中的LocalDate的日期,是一位数的 1  2  3 。
             * 因为一开始用是String类型比较,所以01≠1,最后导致异常。
             */
            Map<Integer, String> daySet = new HashMap<>();
            daySet.put(now.getDayOfMonth(), "今"); // 用now,就不会报错了,1 2 3
            daySet.put(now.plusDays(1L).getDayOfMonth(), "明");
            daySet.put(now.plusDays(2L).getDayOfMonth(), "后");
            //过滤,提取结果
            JSONObject jsonObject = JSONObject.parseObject(responseResult);
            if (jsonObject.containsKey("errmsg")) {
                logger.error(jsonObject.getString("errmsg"));
                throw new IllegalArgumentException(jsonObject.getString("errmsg"));
            }
            map = jsonObject.getJSONArray("data").stream()
                    .peek(o -> {
                        String date = getStringFromJson(o, "date").substring(8);
                        ((JSONObject) o).put("date", date);
                    })
                    .filter(o -> daySet.containsKey(getIntegerFromJson(o, "date")))
                    .collect(Collectors.toMap(
                            key -> daySet.get(getIntegerFromJson(key, "date")),
                            value -> getStringFromJson(value, "wea")));
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("获取失败");
        }
        return map;
    }

(四)发送消息

1、封装各项请求的内容

if (configConstant.isEnableDaily() && StringUtils.hasText(configConstant.getToken())) {
                //名言警句,中文
                String noteZh = null;
                try {
                    noteZh = proverbService.getOneNormalProverb();
                    JSONObject note_Zh = JsonObjectUtil.packJsonObject(noteZh, "#879191");
                    resultMap.put("note_Zh", note_Zh);
                    logger.info("note_Zh:{}", note_Zh);
                } catch (Exception e) {
                    logger.info("名言警句获取失败,检查ApiSpace的token是否正确?套餐是否过期?");
                }
                //名言警句,英文
                try {
                    JSONObject note_En = JsonObjectUtil.packJsonObject(proverbService.translateToEnglish(noteZh), "#879191");
                    resultMap.put("note_En", note_En);
                    logger.info("note_En:{}", note_En);
                } catch (Exception e) {
                    logger.info("名言警句翻译失败,网易云翻译接口无法使用");
                }
            }
            //封装数据并发送
            sendMessage(accessToken, errorList, resultMap, opedId);

2、发送到微信token

private void sendMessage(String accessToken, List<JSONObject> errorList, HashMap<String, Object> resultMap, String opedId) {
        JSONObject templateMsg = new JSONObject(new LinkedHashMap<>());
        templateMsg.put("touser", opedId);
        templateMsg.put("template_id", configConstant.getTemplateId());
        templateMsg.put("data", new JSONObject(resultMap));
        String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;

        String sendPost = HttpUtil.sendPost(url, templateMsg.toJSONString());
        JSONObject WeChatMsgResult = JSONObject.parseObject(sendPost);
        if (!"0".equals(WeChatMsgResult.getString("errcode"))) {
            JSONObject error = new JSONObject();
            error.put("openid", opedId);
            error.put("errorMessage", WeChatMsgResult.getString("errmsg"));
            errorList.add(error);
        }
    }

五、技术总结

1、Scheduleh注解定时调任务

2、微信token发送指定消息

3、调用接口得到数据(天气预报和各种api)

4、姓名如何在方法头上标注

5、代码结构

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

6、配置参数调用-通过value和自动注入

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...

configConstant.getWeatherAppId()

【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...文章来源地址https://www.toymoban.com/news/detail-434362.html

到了这里,关于【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api...的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue中使用天气预报

    第一步 : 打开这个网站自己设置好想要的样式 和风天气插件 | 和风天气插件产品,免费、跨终端。适配你的网站、APP、公众号 一般选第一个就好 第二步 : 调整好样式 生成你的代码 最后记得点生成 第三步: 创建一个 新的组件(.vue文件) 在里面写入以下的代码 注意事项写

    2024年02月11日
    浏览(33)
  • 使用HTTP协议在k780网站上获取天气-----天气预报

    本期主要使用TCP网络编程实现天气预报的功能,这个项目旨在于增进对于TCP编程的掌握以及应用,在这个项目中页用到了一种常见的数据格式—cjson数据格式,能够在这个项目中学会使用cjson数据的解析和使用对日后的工作应该是非常有益的;那么不止这些,还有c语言哦,遇

    2024年02月07日
    浏览(47)
  • .NET7使用HttpClient实现查询天气预报接口

    朋友做网站需要根据城市展示天气预报,找了一圈没有找到靠谱的接口,今天在中央气象台的官网查询某个城市找到了接口,先用postman试了一下居然可以使用,可以查询某个城市7天的天气预报等信息。但是查询编码是气象台自己的编码,在网上搜索了一下居然有这个编码。

    2023年04月14日
    浏览(39)
  • kotlin 编写一个简单的天气预报app (七)使用material design

    对之前的天气预报的app进行了优化,原先的天气预报程序逻辑是这样的。 使用text和button组合了一个输入城市,并请求openweathermap对应数据,并显示的功能。 但是搜索城市的时候,可能会有错误,比如大小写,比如拼写之类的,所以打算给他升级一下。 目标: 在搜索的时候需

    2024年04月27日
    浏览(34)
  • 安卓大作业:使用Android Studio开发天气预报APP(使用sqlite数据库)

    今天我来分享一下如何使用Android Studio开发一个天气预报APP。在文中,我们将使用第三方接口获取实时天气数据,并显示在APP界面上。 首先,打开Android Studio并创建一个新的项目。在创建新项目时,我们需要设置项目名称、包名和支持的最低API级别。 为了获取实时天气数据,

    2024年02月08日
    浏览(42)
  • kotlin 编写一个简单的天气预报app(六)使用recyclerView显示forecast内容

    要使用RecyclerView显示天气预报的内容 先在grandle里添加recyclerView的引用 创建一个RecyclerView控件:在布局文件中,添加一个RecyclerView控件,用于显示天气预报的列表。 这是一个包含三个TextView的LinearLayout布局,用于显示天气相关的数据。每个TextView都有一个唯一的id,可用于在代

    2024年02月13日
    浏览(69)
  • 【雕爷学编程】Arduino智能家居之使用WeatherAPI.com API获取天气预报

    Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来

    2024年02月03日
    浏览(36)
  • Android制作天气预报软件 —— 天气查询

    天气查询功能包括信息显示和地区选择两个版块,二者均通过调用极速数据的相关接口进行实现。其中,信息显示界面作为软件首页,默认先显示系统设置的地区天气情况,用户可通过地区选择的界面进行修改信息。对于天气信息,受接口调用次数限制,系统设置每24小时更

    2024年02月12日
    浏览(30)
  • 【雕爷学编程】Arduino智能家居之使用定时器获取未来三天的天气预报

    Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来

    2024年02月04日
    浏览(32)
  • QT实现天气预报

    public:     MainWindow(QWidget* parent = nullptr);     ~MainWindow();    protected: 形成文本菜单来用来右键关闭窗口     void contextMenuEvent(QContextMenuEvent* event); 鼠标被点击之后此事件被调用     void mousePressEvent(QMouseEvent *ev); 移动窗口     void mouseMoveEvent(QMouseEvent* ev);     //重写过滤器方法

    2024年02月12日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包