はじめに
天気予報を定期的に取得し、自動でSlackに通知するアプリをPythonとSeleniumで作成する方法を解説します。
この記事では、天気予報の取得、Slack通知の設定、そして全体の自動化プロセスを紹介します。
1. 必要なライブラリのインストール
以下のライブラリを使用します。
- selenium: Webブラウザの操作を自動化するため。
- slack_sdk: Slackへのメッセージ送信のため。
- webdriver_manager: Selenium WebDriverの管理のため。
ライブラリは以下のコマンドでインストールできます。
pip install selenium slack_sdk webdriver_manager
2. WebDriverの設定
Seleniumを使用するには、ブラウザドライバが必要です。ここでは、Chromeドライバを使用します。
WebDriverのセットアップ
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# WebDriverの設定
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
3. 天気予報の取得
天気予報を取得するためには、天気予報が表示されているWebページにアクセスし、必要な情報を抽出します。ここでは、例としてWeather.comを使用します。
天気予報取得のコード例
from selenium.webdriver.common.by import By
# 天気予報ページにアクセス
driver.get('https://weather.com')
# 地域を検索して天気情報を取得
search_box = driver.find_element(By.ID, 'LocationSearch_input')
search_box.send_keys('Your City') # 地域名を入力
search_box.submit()
# 少し待ってから天気予報情報を取得
driver.implicitly_wait(10)
# 天気予報の情報を取得
temperature = driver.find_element(By.CSS_SELECTOR, 'span.CurrentConditions--tempValue--3a50n').text
condition = driver.find_element(By.CSS_SELECTOR, 'div.CurrentConditions--phraseValue--2xXSr').text
print(f'Temperature: {temperature}')
print(f'Condition: {condition}')
4. Slackへの通知
Slackに通知を送信するためには、SlackのIncoming Webhookを利用します。
まず、SlackのアプリでIncoming Webhookを作成し、Webhook URLを取得します。
Slack通知のコード例
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
# Slack Webhook URL
slack_webhook_url = 'https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX'
client = WebClient(token=slack_webhook_url)
def send_slack_message(message):
try:
response = client.chat_postMessage(
channel='#general', # 通知を送るチャンネル
text=message
)
assert response['message']['text'] == message
except SlackApiError as e:
print(f"Error sending message: {e.response['error']}")
# 天気情報をSlackに送信
weather_message = f"Today's weather:\nTemperature: {temperature}\nCondition: {condition}"
send_slack_message(weather_message)
5. 全体の統合
最後に、天気予報の取得とSlack通知を統合し、全体のスクリプトを作成します。
完全なコード例
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
# WebDriverの設定
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# Slack Webhook URL
slack_webhook_url = 'https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX'
client = WebClient(token=slack_webhook_url)
def send_slack_message(message):
try:
response = client.chat_postMessage(
channel='#general',
text=message
)
assert response['message']['text'] == message
except SlackApiError as e:
print(f"Error sending message: {e.response['error']}")
def get_weather():
# 天気予報ページにアクセス
driver.get('https://weather.com')
# 地域を検索して天気情報を取得
search_box = driver.find_element(By.ID, 'LocationSearch_input')
search_box.send_keys('Your City') # 地域名を入力
search_box.submit()
# 少し待ってから天気予報情報を取得
driver.implicitly_wait(10)
# 天気予報の情報を取得
temperature = driver.find_element(By.CSS_SELECTOR, 'span.CurrentConditions--tempValue--3a50n').text
condition = driver.find_element(By.CSS_SELECTOR, 'div.CurrentConditions--phraseValue--2xXSr').text
return temperature, condition
# 天気情報を取得
temperature, condition = get_weather()
# 天気情報をSlackに送信
weather_message = f"Today's weather:\nTemperature: {temperature}\nCondition: {condition}"
send_slack_message(weather_message)
# WebDriverを終了
driver.quit()
6. スケジューリング
このスクリプトを定期的に実行するには、cron(Linux)やTask Scheduler(Windows)を使用することで自動化できます。
Linuxでのスケジューリング例(cron)
- スクリプトを保存し、例えばweather_notifier.pyという名前にします。
- crontab -eコマンドでcron設定を開きます。
- 次の行を追加して毎日午前8時に実行するように設定します。
0 8 * * * /usr/bin/python3 /path/to/weather_notifier.py
まとめ
PythonとSeleniumを使用して天気予報を取得し、Slackに通知する方法を紹介しました。
スクレイピングとAPIを利用することで、日々の天気情報を簡単に自動で確認できるようになります。