ダム放流通知botについて

シェアする

ダム放流通知botのことについて。
※この記事は2014/12/04に、変更になった部分などを追記・更新しています。

スポンサーリンク
広告(大)

ダム放流通知botって?

国土交通省【川の防災情報】と言うサイト(以下、川防)の中で掲載されている「ダム放流通知」を定期的に確認し、Twitterでつぶやくbotです。

フォロワーが500人を超えていました。ありがとうございます。(2014/12/04現在)

作成した理由

川防を定期的に見ているわけではないので、いつ放流通知が発表されているのかわからないし、川防にアクセスするのが面倒。
そこで、自分が一番良く見ているTwitterのTLに放流通知情報が流れて来れば楽だなと思い作成しました。

こんな人にオススメ

ダム巡りをしているときに川防を見ていたら放流を見れたのに!
と帰ってから気づいて後悔した経験がある方や洪水調節に興味があるけど川防をずっと見ているのは大変と感じている方の中で、Twitterアカウントをお持ちの方にオススメです。
TwitterのTLなら結構頻繁に見ると思うので、あっ放流通知でた!とTLで知ることができます。
ダム巡り中もTwitterをなんだかんだ見たりつぶやいたりしていると思うので、タイミングが良ければ放流通知を知ることが出来て、放流が見れるかも?

作成にあたって

bot作成した時のことや、botの動きについて興味がある人もいるかもしれないので、メモ的に残しておきます。

事前準備

botを作るのに必要なアカウントの作成、登録作業、準備するものは以下の通り。

  • Twitterアカウントの作成
  • アプリケーション登録(Consumer key , Consumer secret の取得)
  • Access Token取得(Access Token , Access Token Secret の取得)
  • twitteroauth.phpとOAuth.php
  • scrape_func.php( simple_html_dom.phpに変更 )
  • サーバー(既に借りているものを利用)

botに関する情報はネット上で簡単に探すことができたので助かりました。

twitteroauth.php、OAuth.phpは
https://github.com/abraham/twitteroauth
から
scrape_func.phpはオライリーのサンプルコード
http://www.oreilly.co.jp/books/4873111870/download.html
から取得します。scrape_func.phpはhack084です。

※作成した時はscrape_func.phpを利用していましたが、現在はsimple_html_dom.phpを利用しています。

botの動き

作成にあたって、プログラムをどうするかを考えなければいけませんでした。
ここでは、botの動きを簡単に説明します。

川防は地域別にページが分かれています。
そのため、地域別のページ分同じ処理を繰り返します。

discharge00

各地域へのアクセスは、パラメータ(areaCode)で行います。

81,北海道
82,東北
83,関東
84,北陸
85,中部
86,近畿
87,中国
88,四国
89,九州
90,沖縄

それぞれのページを開き、開いたページを解析します。

つぶやきは現状、以下の内容。
【放流通知】(地域) ○○ダム 第××号 月/日 時:分 URL
【放流通知】(地域) ○○ダム 第××号 月/日 時:分 見出し URL #ダム #放流 #〇〇ダム

必要な情報はダム名と発表状況の左端の情報です。
これだけ取得できればつぶやきは可能ですが、水系名、河川名、対象市町村も取得し内部的にはDBに保存しています。

放流通知発表が複数ダムである場合、テーブルが複数行となります。
テーブルの行数分、同じ処理を繰り返します。

discharge01

DBでつぶやき済みかどうかを管理するため、キーが必要です。
しかし、ダム名だけではキーにすることはできないため、
上記画像のリンク先(放流通知本文)のパラメータ(damDischgCode , reportTime , reportNo)はユニークだろうと判断し、それらをキーとして利用しています。

discharge02

つぶやきのURLの部分に、上記画像のURLをそのまま利用してしまうと、Twitterの文字制限(140文字)に耐えられません。
そのため、URLはURL短縮サービスのbitlyを利用しています。
こちらを利用するにはUSERとAPIKeyが必要です。

つぶやきの内容に、見出しを追加したため放流通知本文の見出しを取得してくる処理も追加しています。
放流開始の通知や洪水調節終了の情報と言う見出し。

あとは取得した情報を加工して、つぶやく処理を行って終了です。

【地域ページにアクセス】 → 【放流通知発表の1行目を解析】 → 【つぶやき済チェック】 → 【つぶやいてなければDBにつぶやき文をInsert】 → 【放流通知発表の次行を解析】 →

【地域ページにアクセス】 → 【放流通知発表の1行目を解析】 → 【つぶやき済チェック】 → 【つぶやいてなければ見出しを取得してくる】 → 【つぶやき内容を加工】 → 【DBにInsert】 → 【放流通知発表の次行を解析】 →

と言う処理を地域ページ分繰り返して、つぶやき文を先にすべてInsert、その後

【つぶやき文をSelect】 → 【Fetch】 → 【つぶやく】 → 【つぶやき済にUpdate】 → 【Fetch】 →

を終わるまで繰り返し。と言う具合です。

この時、つぶやき処理がTwitter側の問題等でエラーとなった場合はつぶやきが行われません。
つぶやき出来なかったデータは次回処理されるときに同時につぶやかれます。

つぶやき文はシンプルで、リンクを開いて放流通知文がわかるような状況なので、本当は放流開始なのか終了なのかとかも同時にのせたいんですが、放流通知文はテンプレートが無いのかダムによってまちまちなので解析が難しいのと、文字数制限140文字があるので、今のつぶやき文より今後よく出来るかはわかりません。
 → 見出しの追加により解決済

2014/12/04現在、cronを利用して15分単位(毎時01分、16分、31分、46分)に処理が行われています。

スポンサーリンク
広告(大)