LIVESENSE ENGINEER BLOG

リブセンスエンジニアの活動や注目していることを発信しています

非エンジニアが挑戦!ZapierとPythonで地震速報をSlackに自動通知する

こちらは Livesense Advent Calendar 2025 DAY 20 の記事です。

はじめに

リブセンス経営推進部のSamです。 私はエンジニアではありませんが、RPAやAIを活用して社内業務の効率化に関心があります。

突然ですが、皆さんの会社では地震発生時の「安否確認」はスムーズにできていますか? 私の会社では、すでに専用の安否確認サービスを導入しています。しかし、運用していく中で一つ大きな課題が見つかりました。

それは、「サービス自体に通知機能がなく、地震が起きてもメンバーが気付けない」という点です。 そこで、「全社員が毎日必ず見ているSlackに通知を送れば、初動が早まるはずだ」と考え、ZapierとPythonを使って「震度3以上の地震速報をSlackへ自動通知する仕組み」を構築しました。

今回は、非エンジニアの私でも実装できたその手順をご紹介します。

システム全体像

  1. Trigger: 気象庁の地震情報フィードをZapierで取得
  2. Filter:「震源・震度に関する情報」のみを通す
  3. Formatter: 発生日時を正規表現で抽出
  4. Code(Python): 詳細データを解析し、「エリア名」と「震度3強以上」のみを抽出
  5. Action: Slackに通知

実装ステップ

1. 気象庁フィードの取得

Zapierの「RSS by Zapier」アプリでEventを「New Item in Feed」に設定し、気象庁の地震情報フィード「https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml」を取得します。

2. フィルタリング

このフィードには地震以外の情報も含まれているため、「Filter by Zapier」アプリでタイトルが「震源・震度に関する情報」のものだけを次のステップに進めます。

3. 発生日時の抽出

「Formatter by Zapier」アプリでEventを「Text」に設定し、正規表現で地震発生日時を抽出します。

正規表現の例): [0-90-9]{1,2}日[0-9]{2}時[0-9]{2}分

4. Pythonで詳細データを取得

フィードのリンク先XMLファイルに詳細な震度情報が含まれています。

「Code by Zapier」アプリでEvent「Run Python」を設定し、以下のPythonコードを実行して震度3以上の地震情報と該当エリアを抽出します。

【ポイント】

  • 震度3以上を抽出
  • エリア名と震度をテキスト化

import requests
from xml.etree import ElementTree

# URLからデータを取得
url = input_data['url']
response = requests.get(url)
response.encoding = 'utf-8'

# 取得したデータをXMLとして解析
root = ElementTree.fromstring(response.text)

# outputを初期化
output = {'text': ''}

# XMLの特定のパスにあるアイテムを探す
for item in root.findall('./{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}Body/{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}Intensity/{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}Observation/{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}Pref'):

    # 最大震度を取得
    MaxInt = item.find('./{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}Area/{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}MaxInt')
    
    # 最大震度3(3)以上を処理
    max_intensity = MaxInt.text
    if max_intensity in ['3','4','5-','5+', '6-', '6+', '7']:
        
        # 該当エリアの名前を取得
        area_name = item.find('./{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}Area/{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}Name')
        
        if area_name is None:
            continue
        
        # area_textにテキストを生成
        area_text = f'・{area_name.text}で震度{max_intensity}の地震がありました。'
        
        # outputに追加
        output['text'] += area_text + "\n"

# 出力を確認
print(output['text'])

5. 追加フィルタリング

抽出したテキスト(text)が空ではない場合のみ、次のステップへ進みます。

6. Slackへの自動投稿

最後に、Pythonステップで生成されたテキスト(text)が存在する場合のみ、Zapierの「Slack」アプリで、Event「Send Channel Message」を設定し、中した地震情報を指定チャンネルに投稿します。

まとめ

既存の安否確認サービスに「通知機能がない」という課題に対し、エンジニアの手を借りずにZapierとPythonで解決策を作ることができました。

この仕組みを導入してから、「Slack通知で地震に気づく」→「安否確認サービスで詳細を確認する」という導線ができ、有事の際の初動に対する不安を減らすことができました。 「ツールを導入して終わり」ではなく、実際の現場でどう使われているか(あるいは使われていないか)に着目して、足りないピースを埋めていく工夫の大切さを改めて感じています。

参考