PythonとCloud Function を使って毎朝7時に今日と明日の天気を伝えてくれるLINE BOTを作った話

2022/02/27に公開

やろうと思ったきっかけ

毎朝必ずと言っていいほど確認するのが今日のお天気ですよね🌤

でもわざわざ毎回Yahoo天気を調べるのもめんどう、、、😓

そこで毎朝7時に今日の天気と気温を教えてくれるLINE BOTがあったらいいな~っと思い作りました。

手順

公式LINEを作成

公式LINEの作り方は他の記事で書いているのでここでは説明は省略します。
作り方はこちらからご覧になれます。

ここで作った公式LINEの以下のページにあるChannel access token (long-lived)
をどこかに保存しておいてください。後から使います。
それとこれは絶対に他人には見せないでくださいね!

スクレイピングによってYahoo!天気から自分が住んでいる地域の天気を取得する

まず普通にYahoo!天気のサイトの自分の住んでいる地域の天気が載っているページまで行きます。
そうしたらそのページのURLをコピーしてください。

次にこのURLからスクレイピングを使って今日と明日の天気を取得していきたいと思います。
コードは以下の様になります。

import requests
from bs4 import BeautifulSoup

#Yahoo! から天気情報を取得
yahoo_url = 'https://weather.yahoo.co.jp/weather/jp/13/4410.html'
response = requests.get(yahoo_url)
soup = BeautifulSoup(response.text, 'html.parser')
rs = soup.find(class_='forecastCity')
rs = [i.strip() for i in rs.text.splitlines()]
rs = [i for i in rs if i != ""]

すると rs は以下の様な要素の入ったリスト型のデータになっており、あとはここから自分の欲しい要素を抽出するだけです。

['A月B日(月)',
 '晴れ',
 '12℃[-2]',
 '4℃[+2]',
 '時間',
 '0-6',
 '6-12',
 '12-18',
 '18-24',
 '降水',
 '---',
 '---',
 '0%',
 '0%',
 '風:',
 '北の風',
 '波:',
 '2メートル後1メートル',
 'C月D日(火)',
 '晴時々曇',
 '16℃[+4]',
 '3℃[-1]',
 '時間',
 '0-6',
 '6-12',
 '10%',
 '10%',
 '風:',
 '南東の風後南の風',
 '波:',
 '1メートル']

LINE用のメッセージ作成

ここからは実際にLINEに送るメッセージを作成していきます。
まずは文章を作ります。ここは自分のお好みで作成してください。僕の場合だと以下のような感じで作りました。

絵文字はあってもなくてもどっちでも大丈夫です👍
全ての天気を網羅してないのでこの emoji_dict に無い天気だった場合は絵文字が表示されないようにif文で条件分岐します。

emoji_dict = {'晴れ': '🌞', '雨': '☔', '曇り': '☁', '晴時々曇': '🌤', '晴時々雨': '🌦️', '曇時々晴': '🌥', '曇時々雨': '🌧️', '雨時々曇': '🌧️', '晴のち曇': '🌞→☁', '晴のち雨': '🌞→☔', '曇のち晴': '☁→🌞', '曇のち雨': '☁→☔', '雨のち晴': '☔→🌞', '雨のち曇': '☔→☁'}
if rs[1] in emoji_dict:
  emoji_today = emoji_dict[f'{rs[1]}']
else:
  emoji_today = ''
if rs[19] in emoji_dict:
  emoji_tomorrow = emoji_dict[f'{rs[19]}']
else:
  emoji_tomorrow = ''
today_weather = f"今日の天気は {rs[1]}{emoji_today}\n最高気温は{rs[2]}\n最低気温は{rs[3]}です。"
tomorrow_weather = f"明日の天気は {rs[19]}{emoji_tomorrow}\n最高気温は{rs[20]}\n最低気温は{rs[21]}です。"

メッセージ送信

メッセージの送信のやり方はLine Developers のドキュメントを参考にしてください
こちらがリンクになります。
https://developers.line.biz/ja/reference/messaging-api/#send-push-message

参考までに今回使ったコードを貼り付けておきます。

import json

# 定数の定義
BROADCAST_URL = 'https://api.line.me/v2/bot/message/broadcast'
LINE_API_TOKEN = '{自分のTOKEN}'
# 送信準備
headers = {'Content-Type': 'application/json',
           'Authorization': f'Bearer {LINE_API_TOKEN}'}
payload_today = {'messages':[{'type': 'text',
			      'text': f'{today_weather}'
			      }
			    ]
			  }
payload_tomorrow = {'messages':[{'type': 'text',
			         'text': f'{tomorrow_weather}'
			      }
			    ]
	                  }
			  
# Line 送信
requests.post(BROADCAST_URL, headers=headers, data=json.dumps(payload_today))
requests.post(BROADCAST_URL, headers=headers, data=json.dumps(payload_tomorrow))

これを実行すると公式LINEを追加している人全員に以下のようなメッセージが送信されるはずです。

最後に

あとはcloud function にデプロイして定期実行すれば完成です。
そのやり方については後々記事を書こうと思っているのでもう少々お待ちください🙇‍♂️

どこか不明な点や間違っている点があれば教えていただけると幸いです。

Discussion