LINE Notify 雷达回波图
这篇文章会使用 Python 的 Requests 函数库,爬取政府开放数据里的气象局雷达回波图,并结合 LINE Notify 的 API,透过 LINE 传送雷达回波图。
注意,LINE Notify 服务已于 2025 年停止,本篇教学的 Line Notify 部分仅供参考使用。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
关于政府数据开放平台
政府数据开放平台是一个政府提供各种开放数据的管道,让民众可以在政府资源有限下,善用无限的创意,整合运用开放数据,推动政府数据开放加值应用,发展出各项跨机关便民服务。
政府数据开放平台:https://data.gov.tw/
关于雷达回波图
雷达回波是由雷达发射之电磁波经由大气中的降水粒子 ( 雨、雪、冰雹...等 ) 反射回来的信号,根据雷达接收到降水粒子所反射回来的信号强度,再利用不同颜色显示,就成为了雷达回波图,雷达回波图除了可以直接从中央气象局的网站取得,在政府数据开放平台也有提供即时的图片数据。
- 关于雷达回波图:https://data.gov.tw/dataset/75125
- 台湾(邻近区域)_无地形:文件链接
- 台湾(较大范围)_无地形:文件链接
注意,2023 年 9 月份中央气象局修改雷达回波图网址,将 MSC 改为 Observation,修改后的图片网址:https://cwbopendata.s3.ap-northeast-1.amazonaws.com/Observation/O-A0058-003.png。
点击链接后会下载一份 JSON ( 不一定要下载,但下载打开后才能知道结构 ),下载后使用记事本或是 chrome 浏览器打开文件,打开后可以看到文件内 cwbopendata > dataset > resource > uri 的位置是一张图片网址,这张图片就是所需要的雷达回波图。
透过 LINE Notify 传送雷达回波图
使用 requests 函数库,爬取刚刚开发数据雷达回波图的 JSON 网址,将抓到的数据转换为 JSON 格式,从中取得图片网址,取得网址后,再次使用 requests 函数库的 POST 的方法,透过 LINE Notify 将雷达回波图传送到 LINE 里。
如果不清楚 Requests 和 LINE Notify 的用法,可以参考:Requests 函数库、发送 LINE Notify 通知
import requests
radar_url = 'https://opendata.cwa.gov.tw/fileapi/v1/opendataapi/O-A0058-003?Authorization=rdec-key-123-45678-011121314&format=JSON'
radar = requests.get(radar_url) # 爬取資料
radar_json = radar.json() # 使用 JSON 格式
radar_img = radar_json['cwbopendata']['dataset']['resource']['uri'] # 取得圖片網址
print(radar_img)
url = 'https://notify-api.line.me/api/notify' # LINE Notify API 網址
token = '你的 LINE Notify 權杖' # 自己申請的 LINE Notify 權杖
headers = {
'Authorization': 'Bearer ' + token # POST 使用的 headers
}
data = {
'message':'從雷達回波看看會不會下雨~', # 發送的訊息
'imageThumbnail':radar_img, # 預覽圖網址
'imageFullsize':radar_img # 完整圖片網址
}
data = requests.post(url, headers=headers, data=data) # 發送 LINE NOtify
程序执行后,LINE 就会透过 LINE Notify 收到雷达回波图。
避免缓存 ( Cache ) 变成旧图片
实作过程中,可能会遇到如果传送过图片,过一阵子再次传送时,显示的是“旧”的雷达回波图,而非“即时”雷达回波图,这是因为 LINE 认为“同一个网址”就应该是“同一张图片”( API 里的图片网址不会变,只有图片内容变了 ),所以在传送时可以替图片加上“时间参数”,就能避开这个问题。
修改刚刚的程序,从雷达回波的 JSON 数据中,取得更新的时间信息,接着在传送时,将图片网址后方加上 ? 与时间信息,就能让 LINE 认为是不同的图片,就能显示正确的图片了。
网址加上参数后的长相:https://cwbopendata.s3.ap-northeast-1.amazonaws.com/MSC/O-A0058-003.png?2021-12-09T00:20:00+08:00
注意,2023 年 9 月份中央气象局修改雷达回波图网址,将 MSC 改为 Observation,修改后的图片网址:https://cwbopendata.s3.ap-northeast-1.amazonaws.com/Observation/O-A0058-003.png。
import requests
radar_url = 'https://opendata.cwa.gov.tw/fileapi/v1/opendataapi/O-A0058-003?Authorization=rdec-key-123-45678-011121314&format=JSON'
radar = requests.get(radar_url)
radar_json = radar.json()
radar_img = radar_json['cwbopendata']['dataset']['resource']['uri']
radat_time = radar_json['cwbopendata']['dataset']['time']['obsTime'] # 取得時間
print(radar_img)
url = 'https://notify-api.line.me/api/notify'
token = '你的 LINE Notify 權杖'
headers = {
'Authorization': 'Bearer ' + token
}
data = {
'message':'從雷達回波看看會不會下雨~',
'imageThumbnail':radar_img + '?' + radat_time, # 加上時間參數
'imageFullsize':radar_img + '?' + radat_time # 加上時間參數
}
data = requests.post(url, headers=headers, data=data)
微信扫码关注
抖音扫码关注