2021年9月21日 星期二

Python抓取天氣資料+Line Notify 通知

參考範例知識庫:

1:天氣查詢API介面 :
https://opendata.cwb.gov.tw/devManual/insrtuction?fbclid=IwAR1zwO-DgQW9Ot0E9pyUaKkwCxRix1E4EJpueBN_9chxPpYXbSI4DTrLvyE

用的是第3:

3.資料擷取-使用說明及目前開放資料擷取之氣象資料 線上API使用說明


2:Line Notify 連動程式碼 & Token 申請與 網路設定
https://ithelp.ithome.com.tw/articles/10223413

3:Dict 字典取值
https://www.runoob.com/python/att-dictionary-get.html

4:日期操作:
https://ithelp.ithome.com.tw/articles/10235251

天氣查詢工作事項:
申請帳號,獲得token key,填入 Authorization= 的後面 ,把XXX-XXX 取代掉.
url="https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=XXX-XXX&limit=1&elementName=Wx&format=JSON&locationName="

字典取值工作事項:
必須知道自己要取那些值,字典跟JSON格式的 Dict 與list 交換穿插的解讀

日期操作工作事項:
把日期值簡化

程式碼 注意事項:
1.注意 locationName之查詢城市是要 用輸入的或是預定的
2.要查那些資料先從requests 回饋資訊,先讀一次再 拆解JSON,擷取自己要的,過多的話可以先取第一個,再適當放大資料數。
3.程式分成 兩個def 模組,一個是get_weather 進行Request 取值,一個是 LineNotifyMessage 通知LineBOT
4.有兩個Token key 要先獲得,一個是 氣象查詢的,一個是Line Notify.

程式碼:

import requests

import json

import time

def get_weather():


# cityname=input("輸入天氣查詢城市")

#   F-C0032-001 是要查詢的資料種類,分類請查裝央氣象局對照表

cityname="桃園市"

# url 是來自中央氣象局給的 wbe query 網址, authorization 後面xxxxx...填入氣象局給你的授權碼..後面參數格式請查中央氣象局資料網站有說明.

url="https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=XXX-XXX&limit=1&elementName=Wx&format=JSON&locationName="

city_url=url + cityname

res=requests.get(city_url).text

# print(res)

res=json.loads(res)

a=res["records"]["location"][0]["locationName"]

b=res["records"]["location"][0]["weatherElement"][0]['time'][0]

c=res["records"]["location"][0]["weatherElement"][0]['time'][1]

d=res["records"]["location"][0]["weatherElement"][0]['time'][2]

k=res["records"]["datasetDescription"]

l=b["parameter"]["parameterName"]

# print("res 是何種資料結構 : ",type(res))

# print("a=",a)

# print("b=",b)

# print("c=",c)

# print("d=",d)

# print("K=",k)

# print("b類別=:",type(b))

# print("天氣 :" ,l)

bmsg=b.get("startTime") + "至\n" + b.get("endTime") + ":\n" + l

cmsg=c.get("startTime") + "至\n" + c.get("endTime") + ":\n" + c["parameter"]["parameterName"]

dmsg=d.get("startTime") + "至\n" + d.get("endTime") + ":\n" + d["parameter"]["parameterName"]

Tmsg="\n"+a+"\n"+ k + "\n"+ bmsg+ "\n"+ "\n" +cmsg +"\n"+'\n'+dmsg

# print("Tmsg=",Tmsg)

return Tmsg  #回傳值給msg

#------------------------------------------line 通知 的模組

def lineNotifyMessage(token, msg):

    headers = {

        "Authorization": "Bearer " + token, 

        "Content-Type" : "application/x-www-form-urlencoded"

    }


    payload = {'message': msg}

    r = requests.post("https://notify-api.line.me/api/notify", headers = headers, params = payload)

    return r.status_code


msg = get_weather()

token = '填入line給你的token 一長串字碼'

print("傳給line的msg=\n",msg)

#get_weather()

lineNotifyMessage(token,msg)

沒有留言:

張貼留言