PythonとSeleniumを使って天気予報をSlack通知するアプリの作成方法

## はじめに
天気予報を定期的に取得し、自動でSlackに通知するアプリをPythonとSeleniumで作成する方法を解説します。

この記事では、天気予報の取得、Slack通知の設定、そして全体の自動化プロセスを紹介します。

## 1. 必要なライブラリのインストール
以下のライブラリを使用します。

* selenium: Webブラウザの操作を自動化するため。
* slack_sdk: Slackへのメッセージ送信のため。
* webdriver_manager: Selenium WebDriverの管理のため。

ライブラリは以下のコマンドでインストールできます。

```bash
pip install selenium slack_sdk webdriver_manager
```

## 2. WebDriverの設定
Seleniumを使用するには、ブラウザドライバが必要です。ここでは、Chromeドライバを使用します。

WebDriverのセットアップ
```python
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を使用します。

天気予報取得のコード例
```python
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通知のコード例
```python
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通知を統合し、全体のスクリプトを作成します。

完全なコード例
```python
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）
1. スクリプトを保存し、例えばweather_notifier.pyという名前にします。
1. crontab -eコマンドでcron設定を開きます。
1. 次の行を追加して毎日午前8時に実行するように設定します。

```cron
0 8 * * * /usr/bin/python3 /path/to/weather_notifier.py
```

## まとめ
PythonとSeleniumを使用して天気予報を取得し、Slackに通知する方法を紹介しました。

スクレイピングとAPIを利用することで、日々の天気情報を簡単に自動で確認できるようになります。