Day 27:专案07 - 天气小助理01 | 气象资料API

图片来源:https://www.epochtimes.com/b5/18/1/5/n10026856.htm

我先来讲个故事吧~ 故事的主角小明,今年30岁单身,一个人住在租的套房里,每天工作加班累的半死,回家马上倒头就睡,隔天早上起来又急急忙忙出门上班了,根本没有时间看明天的天气预报。

一直以来都没有什麽问题,直到某一天发生一件不幸的事,小明下班时外面下着大雨,自己也没有带伞,一查才发现原来今天的下雨机率高达90%!! 小明此时觉得很气恼,心想:如果有人可以在出门前提醒我带伞就好了...。

於是他将烦恼告诉了他的好友,也就是你,身为工程师的你很同情他,没有女朋友已经很可怜了,竟然还要淋雨回家,因此你决定写一个程序来帮助小明!!

专案构想

小明的需求是每天早上出门前自动通知天气资讯,因此专案的架构会长这样:每天早上6点执行Python程序,由程序取得气象资料後,经过一些处理後,再推送讯息给小明。那因为LINE是我们很常用的通讯软件,所以就使用LINE Notify推送讯息给小明,如此一来小明只要早上看LINE就知道今天的天气资讯了!

气象资料API

首先,专案最重要的东西就是气象资料,而且要每天更新,又有涵盖很多地区。好消息是,中央气象局提供的气象资料API就有这些特点,我们就是要使用这个。

打开中央气象局气象资讯API文件,底下列出非常多API,而我们要用的是第一个(一般天气预报-今明 36 小时天气预报)。

点开後,可以看到API的所有参数,其中「Authorization」这一项是必填的,这是开放资料平台会员的授权码,要有这个授权码才能使用API,接着就要来讲怎麽取得这个授权码。

会员授权码

  1. 先到中央气象局网站注册一个新会员,点击「加入会员」,填写一些基本资料後就可以成为会员了,请记住自己的帐号密码。

  1. 再来到气象开放资料平台,登入你刚才注册的帐号。

  1. 登入後,点击「取得授权码」,将出现的授权码记下来。

  1. 接着就可以用这个授权码去使用API了!

解析API

回到刚才的中央气象局气象资讯API文件,点API右上方「Try it out」按钮来测试API。

将授权码填上去,底下参数基本上预设值就好,特别需要改的是「locationName」这个参数,选择你所在的县市。

按下「Execute」,下方就会显示回传结果,回传的结果是JSON格式的字串。

根据这份文件来观察回传的JSON字串,就可以知道各个栏位所代表的含意。我们发现到 weatherElement 这个列表中存着天气资讯,而每笔天气资讯的第一笔是离现在最近12小时的资料(因为我们是每天早上6点抓取资料,所以第一笔资料就是当天6点到18点的资料,正是我们需要的)。

解析API的程序码如下,为了方便测试特别写成函数。

def get_data():

    url = "https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001"
    params = {
        "Authorization": "你的API授权码",
        "locationName": "你的城市",
    }

    response = requests.get(url, params=params)
    print(response.status_code)

    if response.status_code == 200:
        # print(response.text)
        data = json.loads(response.text)

        location = data["records"]["location"][0]["locationName"]

        weather_elements = data["records"]["location"][0]["weatherElement"]
        start_time = weather_elements[0]["time"][0]["startTime"]
        end_time = weather_elements[0]["time"][0]["endTime"]
        weather_state = weather_elements[0]["time"][0]["parameter"]["parameterName"]
        rain_prob = weather_elements[1]["time"][0]["parameter"]["parameterName"]
        min_tem = weather_elements[2]["time"][0]["parameter"]["parameterName"]
        comfort = weather_elements[3]["time"][0]["parameter"]["parameterName"]
        max_tem = weather_elements[4]["time"][0]["parameter"]["parameterName"]

        print(location)
        print(start_time)
        print(end_time)
        print(weather_state)
        print(rain_prob)
        print(min_tem)
        print(comfort)
        print(max_tem)

    else:
        print("Can't get data!")

执行结果:

200
台中市
2021-09-30 18:00:00
2021-10-01 06:00:00
晴时多云
20
27
舒适至闷热
31

小结

今天顺利地取得气象资料了,明天就透过LINE Notify传送讯息吧!


如果喜欢这系列文章麻烦帮我按Like加订阅,你的支持是我创作最大的动力~

本系列文章以及范例程序码都同步更新在GitHub上,後续会持续的更新,如果喜欢也麻烦帮我按个星星吧~

有任何问题或建议,都欢迎在底下留言区提出,还请大家多多指教。


<<:  Eloquent ORM - 一对多关联

>>:  [Day17] XML Signature Wrapping

【Day 28】练习专案 1/2 - NFC、Barcode、fontFamily、Stack、sliding_up_panel

今日要点 》前言 》介绍 Demo 专案 》程序架构研究 前言 前面精选了很多在 Github 上很...

[Day 10] - Spring Boot 实作登入验证(四)(JWT登入验证)

今天就来完成登入验证的部分! 昨天已经完成发送帐号密码到api,验证ok即发送一笔JWT给clien...

Day 19. 来找找Unreal Engine有没有VR Simulation

安装Unreal的过程意外频出啊,差点以为我的电脑出事了,结果是因为我time machine开着,...

Day3-TypeScript(TS)安装开发环境

经过两天的简介,希望大家都对TypeScript(TS)有基本的了解。 今天呢要来讲解安装TS的开发...

Day 19 - C strings 字串,我好想吃串烧

Outline Characters C strings C string processing f...