2012/04/05

電力予報

全面的にTwitterBotPHP掲示板の天気予報機能を参考にしています……いたと思います。

EasyBotter.phpの改造ですが、改造箇所が複数に亘るのでご注意ください。
また、Yahoo!デベロッパーズネットワークの電気予報APIを使用しますので、前もってアプリケーションIDを取得しておいてください。

class EasyBotter {
  // 途中省略

  // まるっと関数を新造
  function makePowerForecastTweet($text){
    $api_key_yahoo = '取得したアプリケーションID';
    
    // いつの?
    $today = date("Ymd", time());
    $tomorrow = date("Ymd", time()+(24*3600));
    $dayaftertomorrow = date("Ymd", time()+24*3600*2);

    $w_day = array(
      "今日"=> $today, "きょう"=> $today,
      "明日"=> $tomorrow, "あす"=> $tomorrow, "あした"=> $tomorrow,
      "明後日"=> $dayaftertomorrow, "あさって"=> $dayaftertomorrow
    );
    foreach( $w_day as $w_time => $w_timeNo){
      if(preg_match( "/".$w_time."/u", $text)) {
        $timeName = $w_time;
        break;
      }
    }
    if(empty($timeName)) {
      $timeName = $today;
    }
    $day = $w_day["$timeName"];

    // どこの?
    $w_city = array(
      "東北"=>"tohoku", 
      "東京"=>"tokyo", "関東"=>"tokyo", "東電"=>"tokyo", 
      "中部"=>"chubu", "名古屋"=>"chubu",
      "大阪"=>"kansai", "関西"=>"kansai", "関電"=>"kansai",
      "九州"=>"kyushu", "福岡"=>"kyushu"
    );
    foreach( $w_city as $w_area => $w_areaNo){
      if(preg_match( "/".$w_area."/u", $text)) {
        $cityName = $w_area;
        break;
      }
    }
    if( empty($cityName) ){
      $w_flg = FALSE;
      $cityName = "東京";
    }
    $where = $w_city["$cityName"];

    // Yahoo!電力予報APIからPHP切片を取得
    $powerforecast_url 
      = "http://setsuden.yahooapis.jp/v1/Setsuden/electricPowerForecast?appid="
      .$api_key_yahoo."&area=tokyo&date=".$day;
    $forecastxml = simplexml_load_file($powerforecast_url);

    // 配列に押し込む
    $i = 0;
    $powers = array();
    foreach($forecastxml->Forecast as $forecast){
      if(!is_array($forecast)) {
        $hour[$i] = intval($forecast->Hour);
        $percent[$i] = round((intval($forecast->Usage)/intval($forecast->Capacity))*100);
        $i++;
      }
    }
    // 最大値検出
    array_multisort($percent, SORT_DESC, $hour, SORT_ASC);

    // メッセージ整形
    $maxs = array();
    $times = "";
    for($i = 0; $i < count($hour); $i++) {
      if($percent[$i] === $percent[0]) {
        array_push($maxs, $hour[$i]."時");
      } else {
        break;
      }
    }
    if($day === $today) {
      $timeName .= "のこれから";
    }
    if($i > 1) {
      $times = "のだいたい".$i."回";
    }
    $status = $timeName."の電力最大使用率は".$percent[0]."%で、ピークは"
      .join($maxs, "、").$times."だってさ。";
    return $status;
  }

  // 途中省略

  //リプライを作る
  function makeReplyTweets($replies, $replyFile, $replyPatternFile){
    if(empty($this->_replyPatternData[$replyPatternFile]) && !empty($replyPatternFile)){
      $this->_replyPatternData[$replyPatternFile] = $this->readPatternFile($replyPatternFile);
    }
    $replyTweets = array();
    foreach($replies as $reply){
      $status = "";
      // ここから追加
      if(strpos((string)$reply->text, "電力") !== FALSE) {
        $status = $this->makePowerForecastTweet((string)$reply->text);
      }
      // ここまで追加
      // リプライパターンと照合
      if(empty($status) && !empty($this->_replyPatternData[$replyPatternFile])){

  // 以降省略
}