取得した今日明日の天気予報をPythonでLINE Notifyに送付
天気予報配信サービス停止が発生(「livedoor 天気」のサービス提供)した関係で、「天気予報読み上げ」、「天気予報電光掲示板表示」と天気予報関係のリプレースを完了しました。
リプレースの方法は記事に目を通していただくとして、リプレースを行うために60爺が参考にしたページでは、天気予報を LINE Notify に出力する方法も載っています。
そこで、60爺も天気予報を PythonのプログラムでLINE Notify に出力してみようと考えました。
というのも、昔の記事(定時にステッカーをランダムに取出してLINEへ送付する)で、会社の終了時間10分前に LINE Notify へお知らせを送っていましたが、2020年8月末に40年務めた会社を退職したため、このお知らせが意味のないものとなったのです。
そのため、このお知らせを止めて、その代わりに天気予報を送ることにしたのです。
天気予報送付プログラム作成
基本的に、新たにプログラムを作成する必要はなく、以下の過去記事にあるプログラムを組み合わせるだけでいいはずです。
- 「Yahoo!天気からのrssデータ受信で天気予報電光掲示板表示用シェルリプレース」でリプレースしたプログラムの一部抜き出し
- 「定時にステッカーをランダムに取出してLINEへ送付する」で LINE Notify に送るコマンド部分
プログラム構成は次のようになります。
難しいところはほとんどありません。
せいぜい、アイコンを取出す際のファイルオープンを忘れないようにするくらいです。
プログラムテスト
プログラムが出来上がったので実行してみましょう。
コマンドの内容を LINE Notify へ送付する前に print していますので、コマンド内容に誤りがないか確認します。
うまくいくと、LINE Notify に今日明日の天気予報と共に、お天気マークが送られてきます。
定時に天気予報を送付
出来上がったプログラムを毎日定時に起動することにしましょう。起動には、crontab を利用します。実行時間は毎朝6時50分とします。
まず、管理者権限で crontab を開きます。
crontab -e
今回作成した天気予報送付の実行命令(python の実行命令)を登録して保存すればOKです。
50 6 * * * python3 /home/pi/python-pg/LINE_notify_tenki
プログラム LINE_notify_tenki に対して実行権限を付加するのを忘れないでください。
chmod 755 LINE_notify_tenki
合わせて、上述した「定時10分前のお知らせ」を crontab から削除しました。
10 17 * * * python3 /home/pi/curl_LINE.py
プログラムソース
最後に作成したプログラムソースを載せておきます。
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import os
import urllib.request
from bs4 import BeautifulSoup
#import shlex
def main():
Parser(rssurl) # 天気予報サイトのHTMLタグから天気情報を抽出
for i in range(0,2):
message = tenki[i]
ck_Weather(i, detail, message)
return
## ck_Weather : 取得した天気情報とそれに応じたアイコンを出力するメソッド ################################
def ck_Weather(i, detail, message):
if (detail[i].find("晴")) != -1 and (detail[i].find("曇")) == -1 and (detail[i].find("雨")) == -1 and (detail[i].find("雪")) == -1:
files = mark_path + "Sun.jpg"
elif (detail[i].find("晴一時曇")) != -1 or (detail[i].find("晴のち曇")) != -1 or (detail[i].find("晴時々曇")) != -1:
files = mark_path + "SunToCloud.jpg"
elif (detail[i].find("晴一時雨")) != -1 or (detail[i].find("晴のち雨")) != -1 or (detail[i].find("晴時々雨")) != -1:
files = mark_path + "SunToRain.jpg"
elif (detail[i].find("晴一時雪")) != -1 or (detail[i].find("晴のち雪")) != -1 or (detail[i].find("晴時々雪")) != -1:
files = mark_path + "SunToSnow.jpg"
elif (detail[i].find("曇")) != -1 and (detail[i].find("晴")) == -1 and (detail[i].find("雨")) == -1 and (detail[i].find("雪")) == -1:
files = mark_path + "Cloud.jpg"
elif (detail[i].find("曇一時晴")) != -1 or (detail[i].find("曇のち晴")) != -1 or (detail[i].find("曇時々晴")) != -1:
files = mark_path + "CloudToSun.jpg"
elif (detail[i].find("曇一時雨")) != -1 or (detail[i].find("曇のち雨")) != -1 or (detail[i].find("曇時々雨")) != -1:
files = mark_path + "CloudToRain.jpg"
elif (detail[i].find("曇一時雪")) != -1 or (detail[i].find("曇のち雪")) != -1 or (detail[i].find("曇時々雪")) != -1:
files = mark_path + "CloudToSnow.jpg"
elif (detail[i].find("雨")) != -1 and (detail[i].find("晴")) == -1 and (detail[i].find("曇")) == -1 and (detail[i].find("雪")) == -1:
files = mark_path + "Rain.jpg"
elif (detail[i].find("雨一時晴")) != -1 or (detail[i].find("雨のち晴")) != -1 or (detail[i].find("雨時々晴")) != -1:
files = mark_path + "RainToSun.jpg"
elif (detail[i].find("雨一時曇")) != -1 or (detail[i].find("雨のち曇")) != -1 or (detail[i].find("雨時々曇")) != -1:
files = mark_path + "RainToCloud.jpg"
elif (detail[i].find("雨一時雪")) != -1 or (detail[i].find("雨のち雪")) != -1 or (detail[i].find("雨時々雪")) != -1:
files = mark_path + "RainToSnow.jpg"
elif (detail[i].find("雪")) != -1 and (detail[i].find("晴")) == -1 and (detail[i].find("雨")) == -1 and (detail[i].find("曇")) == -1:
files = mark_path + "Snow.jpg"
elif (detail[i].find("雪一時晴")) != -1 or (detail[i].find("雪のち晴")) != -1 or (detail[i].find("雪時々晴")) != -1:
files = mark_path + "SnowToSun.jpg"
elif (detail[i].find("雪一時曇")) != -1 or (detail[i].find("雪のち曇")) != -1 or (detail[i].find("雪時々曇")) != -1:
files = mark_path + "SnowToCloud.jpg"
elif (detail[i].find("雪一時雨")) != -1 or (detail[i].find("雪のち雨")) != -1 or (detail[i].find("雪時々雨")) != -1:
files = mark_path + "SnowToRain.jpg"
elif (detail[i].find("暴風雨")) != -1:
files = mark_path + "Typhon.jpg"
elif (detail[i].find("暴風雪")) != -1:
files = mark_path + "HeavySnow.jpg"
else:
files = mark_path + "404.jpg"
# 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)
## Parser : 天気情報WebページのHTMLタグから天気情報を抽出してパースするメソッド ####################
def Parser(rssurl):
with urllib.request.urlopen(rssurl) as res:
xml = res.read()
soup = BeautifulSoup(xml, "html.parser")
for item in soup.find_all("item"):
title = item.find("title").string
description = item.find("description").string
if title.find("[ PR ]") == -1:
tenki.append(title)
detail.append(description)
### Execute
mark_path ="/home/pi/work/tenki_mark/"
LINE_Notify_URL = "https://notify-api.line.me/api/notify"
H_txt = "Authorization: Bearer"
taken = "LINE notify への TOKEN"
# 抽出対象のRSS(神奈川県横浜市)
rssurl = "https://rss-weather.yahoo.co.jp/rss/days/4610.xml"
tenki = []
detail = []
if __name__ == "__main__":
main()
何と、yahoo!天気のサービスが終了して、せっかく作成したプログラムが動かなくなってしまいました。
参考
【Yahoo!天気リプレース版】LINE Notify + Pythonで天気情報を取得する方法】
ディスカッション
コメント一覧
まだ、コメントがありません