気象庁の発表している気象データをTwitterに吐き出すようにしてみた(怒られないように?)

世の中ではWeb公開されてるデータを梳き取って再利用している事が多いらしい。

まあ電子データですから、それを使いやすく加工して再利用なんてのは出来る人には朝飯前なのかもしれない。

グレーゾーンでは有りますね。はぴぞう君にちょっとこんな事を試させてみました。

1.気象庁のAMeDASデータをスキミングする

いろいろスキミングする方法が有るみたいなんですが、ネットで探していたら私でもなんとなく理解出来そうなコードがでていました。

[Python] 気象庁からアメダスの最新の気温を取得して利用する : mackroの製作日記

ここに書かれているソースで遊んでみることにしました。

ただデータをずっと取りに行くと相手側のサーバーにも負担をかけているようなので、その回避方法も書かれています。

ありがとうございました。

2.Twitterに吐き出せるように少し加工する

コマンドプロンプトに吐き出すだけのソースですのでそれをTwitterに吐き出すように加工してみます。

# 気温データを取得
if value := check_log(log_file):
  # ファイルから読み込んだ値をツイート
  def CreateTweet(value):
    tweet = haptweepyapi.ClientInfo().create_tweet(text=value)
    return tweet
  # 関数実行・結果出力
  pprint(CreateTweet(value))

elif value := get_temp_from_amedas(url, data_elem):
  # 気象庁から取得したデータを表示
  def CreateTweet(value):
    tweet = haptweepyapi.ClientInfo().create_tweet(text=value)
    return tweet
  # 関数実行・結果出力
  pprint(CreateTweet(value))

  # データをファイルに記録
  with open(log_file, 'w') as text_file:
   text_file.write(value)

else:
  print("データの読み込みに失敗しました")

めんどくさいので、Twitterで吐き出す部分はモジュール化してるものを使います。

TwitterAPI V2のアクセス認証の部分をモジュール化してみた – happyman web

3.怒られないように出典を明記する

さて吐き出すとただ観測時刻と温度しかでません。

気象庁を見てみると、出典元を明記すれば良いと勝手に解釈したので、こんなコードにしました。

気象庁 | 著作権・リンク・個人情報保護について

from requests_html import HTMLSession
import os
import time
from my_module import haptweepyapi
from pprint import pprint

def check_log(file):
#'''ログファイルの更新日時を確認し、一定時間以内ならファイルのデータを返す'''
  # 更新間隔/分
  interval_min = 30

  # ファイルが存在しなければNoneを返す
  if not os.path.isfile(file):
    return None

  # 現在の時刻を取得(UNIX時間/秒)
  current_time = time.time()

  # ファイルの更新時間を取得(UNIX時間/秒)
  file_timestamp = os.stat(file).st_mtime
  
  # 更新時間が一定時間以内か判定し、それ以上ならNoneを返す
  if (current_time - file_timestamp) > interval_min * 60:
    return None

  # ファイルを読み込みテキストを返す
  with open(file, encoding="utf-8") as f:
    value = f.read()
  return value

def get_temp_from_amedas(url, data_elem):
#    '''サイトからデータをスクレイピングして抽出しその文字列を返す'''
  try:
    # リクエストを送信
    session = HTMLSession()
    r = session.get(url)
    # HTMLをレンダリング
    r.html.render(sleep=3)
    # データを抽出
    cell_data = r.html.find(data_elem)
    # 先頭のデータを変数に格納し空のセルを除去
    output_data = []
    for item in cell_data:
      if item.text:
      output_data.append(item.text)
        if len(output_data) >= 3:
         break
    return '気象庁によると名古屋{day} {time} の気温は {temp}℃です([https://www.jma.go.jp/bosai/amedas/#amdno=51106&area_type=offices&area_code=230000&format=table1h&elems=53414])'.format(day=output_data[0], time=output_data[1], temp=output_data[2])
  except:
    return None

if __name__ == '__main__':
  # 値を記録したファイルのパス
  log_file = '$HOME/.cache/amedas_temp.txt'
  # 環境変数を展開
  log_file = os.path.expandvars(log_file)
  # 取得するページのアドレス(例:名古屋)
  url = "https://www.jma.go.jp/bosai/amedas/#amdno=51106&area_type=offices&area_code=230000&format=table1h&elems=53414"
  # 抽出するHTML要素
  data_elem = "table.amd-table-seriestable td"
  # 気温データを取得
  if value := check_log(log_file):
  # ファイルから読み込んだ値をツイート
    def CreateTweet(value):
      tweet = haptweepyapi.ClientInfo().create_tweet(text=value)
      return tweet
  # 関数実行・結果出力
    pprint(CreateTweet(value))

elif value := get_temp_from_amedas(url, data_elem):
# 気象庁から取得したデータを表示
  def CreateTweet(value):
    tweet = haptweepyapi.ClientInfo().create_tweet(text=value)
    return tweet
  # 関数実行・結果出力
  pprint(CreateTweet(value))
  # データをファイルに記録
  with open(log_file, 'w') as text_file:
  text_file.write(value)
else:
  print("データの読み込みに失敗しました")

うまく動きました。1時間に一回名古屋の気温を吐き出すようになりました。