openweathermapの天気予報をLINE Notifyに表示

2022年8月9日

yahoo!天気のサービス停止を受けて、openweathermap を使用して「お天気読み上げ」プログラムをリプレースしました。

以前も、「livedoor 天気」のサービス停止を受けて、yahoo!天気を使用しての対応を実施しました(下記記事参照)が、モグラたたきのようになっていますね。

今回の記事は、「天気予報を LINE Notify に表示」するプログラムの訂正です。訂正箇所は次のように複数あります。

  • 天気予報を「yahoo!天気」から openweathermap で受け取るように変更
  • LINE Notify へ表示するメッセージは、以前のプログラムと同様になるように表示
  • 天気マークは openweathermap から「天気用のアイコン」を取得
スポンサーリンク

天気予報送付プログラム訂正

基本的に、前回作成しているプログラムをベースに、天気情報取得部分を「お天気読み上げ」プログラムで使用したモノを移行します。

また、LINE Notify へ表示するメッセージは、以前のプログラムと同様になるようにします。即ち、下記のように【】の中に、日付と曜日と場所を入れ、その後に、天気、最高気温、最低気温を表示させたいと思います。

天気マークは前回作成したモノを使えるかと思ったのですが、残念ながら openweathermap の天気予報は日本のモノと違い、「晴れ後曇り」のような形式ではありません。

よく見ると、お天気用のアイコンが指定されます(下記、"description" の下の “icon" )ので、これを利用してお天気マークの代用とします。

・・・・
"weather": [
{
"id": 500,
"main": "Rain",
"description": "小雨",
"icon": "10d"
}
],
"clouds": 80,
・・・・

ここに入っている記号に .png を追加した画像が、この場所 http://openweathermap.org/img/w/ にあるようです。

そこで、ここに設定されているアイコンを curl コマンドで表示できるかテストしたのですが、どうもうまくいきません(メッセージしか送れないのです 涙!)。

sudo curl -X POST https://notify-api.line.me/api/notify -H 'Authorization: Bearer vWjkChWETa5qPezWZr09KzWa520rlaxpCfyQKqEMUF4' -F 'message=test' -F 'File=http://openweathermap.org/img/w/04n.png'

60爺の乏しい知識では、サイトのアイコンを curlコマンドで送ることはできないと判断し、アイコンをディレクトリにダウンロードした後、このダウンロードしたアイコンを curlコマンドで送るようにします。


プログラムテスト

プログラムが出来上がったので実行してみましょう。

コマンドの内容を LINE Notify へ送付する前に print していますので、コマンド内容に誤りがないか確認します。

2022-05-06
2022-05-07
【6日(金)】横須賀
【7日(土)】横須賀
wget -P /home/pi/work/tenki_mark/ -nc http://openweathermap.org/img/w/04d.png
ファイル `/home/pi/work/tenki_mark/04d.png' はすでに存在するので、取得しません。
curl -X POST https://notify-api.line.me/api/notify -H "Authorization: Bearer vWjkChWETa5qPezWZr09KzWa520rlaxpCfyQKqEMUF4" -F "message=【6日(金)】横須賀 厚い雲 23℃/18℃" -F "imageFile=@/home/pi/work/tenki_mark/04d.png"
{"status":200,"message":"ok"}wget -P /home/pi/work/tenki_mark/ -nc http://openweathermap.org/img/w/10d.png
--2022-05-06 10:52:52-- http://openweathermap.org/img/w/10d.png
openweathermap.org (openweathermap.org) をDNSに問いあわせています... 138.201.197.100
openweathermap.org (openweathermap.org)|138.201.197.100|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 3793 (3.7K) [image/png]
`/home/pi/work/tenki_mark/10d.png' に保存中
10d.png 100%[==============================================>] 3.70K --.-KB/s in 0s
2022-05-06 10:52:52 (98.8 MB/s) - `/home/pi/work/tenki_mark/10d.png' へ保存完了 [3793/3793]
curl -X POST https://notify-api.line.me/api/notify -H "Authorization: Bearer vWjkChWETa5qPezWZr09KzWa520rlaxpCfyQKqEMUF4" -F "message=【7日(土)】横須賀 小雨 19℃/17℃" -F "imageFile=@/home/pi/work/tenki_mark/10d.png"
{"status":200,"message":"ok"}

アイコンを wgetコマンドを使用してダウンロードするのですが、オプションを使用しない場合、同じアイコンをダウンロードすると名称を変えられてしまうことがわかりました。そこで、オプション(-nc)を追加して同一名称のファイルがある場合はダウンロードしないようにしました。

この時、アイコンをダウンロードするフォルダを指定(-P フォルダ名)するようにしました。wgetコマンドは、次のようになります。

 cmd_wget = 'wget -P %s -nc http://openweathermap.org/img/w/%s.png' % (mark_path, icon)

このダウンロードされたアイコンを使用することで、LINE Notify に今日明日の天気予報と共に、お天気マークが送られてきます。

定時に天気予報を送付

出来上がったプログラムを、以前と同じように毎日定時に起動することにします。以前と同様、起動には crontab を利用し、実行時間は毎朝6時50分としました。

まず、管理者権限で crontab を開きます。

crontab -e

今回作成した天気予報送付の実行命令(python の実行命令)を登録して保存すればOKです。

50 6 * * * python3 /home/pi/python-pg/open_notify_tenki

プログラム open_notify_tenki に対して実行権限を付加するのを忘れないでください。

chmod 755 open_notify_tenki

crontab に登録した後は、以下のコマンドでテストを行い、LINE notiy にメッセージ及び画像が送られるのを確認しましょう。

python3 /home/pi/python-pg/open_notify_tenki

しかし、openweathermap で示されるお天気は「厚い雲」とか「曇りがち」、日本の天気予報になじんだ 60爺には、ちょっと違和感がありますね。

ソースプログラム

最後に、ソースプログラムを載せておきます。お断りしておきますが、余り、美しいコードではありません。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import os
from datetime import datetime, date, timedelta
import locale
import urllib.request
from bs4 import BeautifulSoup
import json
#import shlex
def main():
kyo = datetime.now()
print(datetime.strftime(kyo, '%Y-%m-%d'))
asu = kyo + timedelta(days=1)
print(datetime.strftime(asu, '%Y-%m-%d'))
# localeモジュールで時間のロケールを'ja_JP.UTF-8'に変更する
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
today_txt = '【%s日(%s)】横須賀 ' % (kyo.day, kyo.strftime('%a'))
print(today_txt)
tomorrow_txt = '【%s日(%s)】横須賀 ' % (asu.day, asu.strftime('%a'))
print(tomorrow_txt)
# Parser 天気予報サイトのHTMLタグから天気情報を抽出
r = urllib.request.urlopen(url=rssurl)
obj = json.loads( r.read().decode('utf-8') )
d = obj["daily"]
for i in range(0,2):
Nt = d[i]["temp"]
tenki_txt = d[i]["weather"][0]["description"]
icon = d[i]["weather"][0]["icon"]
cmd_wget = 'wget -P %s -nc http://openweathermap.org/img/w/%s.png' % (mark_path, icon)
print(cmd_wget)
# コマンド発行
os.system(cmd_wget)
kion_txt = '%s℃/%s℃' % (round(Nt["max"]) , round(Nt["min"]))
if i == 0:
message = today_txt + tenki_txt + ' ' + kion_txt
else:
message = tomorrow_txt + tenki_txt + ' ' + kion_txt
ck_Weather(i, icon, message)
return
## ck_Weather : 取得した天気情報とそれに応じたアイコンを出力するメソッド ################################
def ck_Weather(i, icon, message):
files = mark_path + icon + '.png'
# file open
f = {'imageFile': open( files ,"rb")}
# curl comand
cmd = 'curl -X POST %s -H "%s %s" -F "message=%s" -F "imageFile=@%s"' % (LINE_Notify_URL , H_txt , taken , message , files)
print(cmd)
# コマンド発行
os.system(cmd)
### Execute
mark_path ="/home/pi/work/tenki_mark/"
LINE_Notify_URL = "https://notify-api.line.me/api/notify"
H_txt = "Authorization: Bearer"
taken = " アクセストークン "
# 横須賀 北緯(lat)35度30分、東経(lon)139度45分
rssurl = 'https://api.openweathermap.org/data/2.5/onecall?lat=35.3&lon=139.45&appid=26efbc9d5dab3e479da462dc9b6cddef&units=metric&lang=ja&exclude=hourly' #API URL
tenki = []
detail = []
if __name__ == "__main__":
main()
スポンサーリンク

最後に

天気予報を取得するサイトが次々と打ち切られ、今回のリプレースで3回目となります。

その度に新しい情報を取り込むのが面倒ですが、プログラムの勉強としては頭の体操ともなり、うかうか、ボケていられないので丁度良いです。

今回のリプレースでは、アイコンの取り込みの部分が勉強になりました。

皆さんも、本プログラムをコピーして天気予報を LINE Notify へ表示してみましょう。

参考
OpenWeatherMapから気象情報を取得する
Pythonで曜日を取得する方法
Pythonで翌日や翌月みたいな日付の計算をする

スポンサーリンク
この記事を書いた人

60爺

60路を越え、RaspberryPi と出会い、その関係でブログ開設(2017/2~)となりました。始めてみると、コツコツやるのが性に合ってしまい、漢字の記事から家の補修・将棋・windows10関係・別名・言い方などジャンルを拡大して今に至ってます。まだまだ、元気なので新たな話題を見つけて皆様に提供できればと思っています。「プロフィールはこちら

TIPSLINE_Notify

Posted by 60爺