取得した今日明日の天気予報をPythonでLINE Notifyに送付

2020年11月3日

天気予報配信サービス停止が発生(「livedoor 天気」のサービス提供)した関係で、「天気予報読み上げ」、「天気予報電光掲示板表示」と天気予報関係のリプレースを完了しました。

リプレースの方法は記事に目を通していただくとして、リプレースを行うために60爺が参考にしたページでは、天気予報を LINE Notify に出力する方法も載っています。

そこで、60爺も天気予報を PythonのプログラムでLINE Notify に出力してみようと考えました。

というのも、昔の記事(定時にステッカーをランダムに取出してLINEへ送付する)で、会社の終了時間10分前に LINE Notify へお知らせを送っていましたが、2020年8月末に40年務めた会社を退職したため、このお知らせが意味のないものとなったのです。

そのため、このお知らせを止めて、その代わりに天気予報を送ることにしたのです。

スポンサーリンク

天気予報送付プログラム作成

基本的に、新たにプログラムを作成する必要はなく、以下の過去記事にあるプログラムを組み合わせるだけでいいはずです。

プログラム構成は次のようになります。

難しいところはほとんどありません。

せいぜい、アイコンを取出す際のファイルオープンを忘れないようにするくらいです。


プログラムテスト

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

コマンドの内容を 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で天気情報を取得する方法】

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

60爺

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

TIPSLINE_Notify

Posted by 60爺