2014年11月3日月曜日

ラズベリーパイが天気を教えてくれるよ

天気予報を喋ってくれたら面白いと思ったので、早速やってみた。

ヤフーの天気予報をローカルに保存して、
内容を解析し予報部分を音声合成してもらうというもの。

 tenki.shはこんな感じ

#!/bin/bash
wget -q -O - http://weather.yahoo.co.jp/weather/jp/13/4410.html > tenki.html
php tenki.php
tenki.phpはこんな感じ
<?php

$fp = fopen("tenki.html", "r");

$timezone_array = array();
$tenki_array    = array();
$kion_array     = array();
$situdo_array   = array();
$today_string   = "";
$find_mode=0;   //0:今日の天気 1:日付 2-3:時間 4:天気 5:気温 6:湿度

if ($fp){
    if (flock($fp, LOCK_SH)){
        while (!feof($fp)) {
            $buffer = fgets($fp);

                        if($find_mode == 0){
                                if(stristr($buffer,'<div id="yjw_pinpoint_today">')){
                                        $find_mode = 1;
                                    //print("■発見".$buffer);
                                        //echo "\n";
                                }
                        }else if($find_mode == 1){
                                if(stristr($buffer,'<span class="yjSt">')){
                                        $find_mode = 2;
                                    // <span class="yjSt"> - 6月30日(月)</span></h3>
                                        $b1 = str_replace('<span class="yjSt"> -', "", $buffer);
                                        $b2 = str_replace('</span></h3>', "", $b1);
         
                                        $b3 = str_replace('(', " ", $b2);
                                        $b4 = str_replace(')', "曜日", $b3);
                                        $today_string= trim($b4);
                                        //print("■日付".$today_string);
                                        //echo "\n";
                                }
                        }else if($find_mode == 2){
                                //<small>時間</small>を探す
                                if(ereg('<small>時間</small>', $buffer)){
                                        $find_mode = 3;
                                }
                        }else if($find_mode == 3){
                                if(ereg('<small><font color="#999999">.*時</font></small></td>', $buffer)){
                                        //print("■過去".$buffer);
                                        //echo "\n";
                                }else if(ereg("^<small>.*時</small></td>", $buffer)){
                                        $b1 = str_replace('<small>', "", $buffer);
                                        $b2 = str_replace('</small></td>', "", $b1);
                                        //print("■時間 ".trim($b2));
                                        //echo "\n";
                                        $timezone_array[] = trim($b2);
                                }
                                if(ereg('<small>天気</small>', $buffer)){
                                        //時間帯の探索は終わり
                                        $find_mode = 4;
                                }

                        }else if($find_mode == 4){
                                //<small><font color="#999999">曇り</font></small></td>
                                //<small>曇り</small></td>
                                if(ereg('<small><font color="#999999">.*</font></small></td>', $buffer)){
                                        //print("■過去".$buffer);
                                        //echo "\n";
                                }else if(ereg("^<small>.*</small></td>", $buffer)){
                                        $b1 = str_replace('<small>', "", $buffer);
                                        $b2 = str_replace('</small></td>', "", $b1);
                                        //print("■天気 ".trim($b2));
                                        //echo "\n";
                                        $tenki_array[] = trim($b2);

                                }
                                if(ereg('<small>気温(℃)</small>', $buffer)){
                                        //天気帯の探索は終わり
                                        $find_mode = 5;
                                }

                        }else if($find_mode == 5){
                                //<td><small><font color="#999999">98</font></small></td>
                                //<td><small>64</small></td>
                                if(ereg('<small><font color="#999999">.*</font></small></td>', $buffer)){
                                        //print("■過去".$buffer);
                                        //echo "\n";
                                }else if(ereg("^<td><small>.*</small></td>", $buffer)){
                                        $b1 = str_replace('<td><small>', "", $buffer);
                                        $b2 = str_replace('</small></td>', "", $b1);
                                        //print("■気温 ".trim($b2)."(℃)");
                                        //echo "\n";
                                        $kion_array[] = trim($b2);
                                }
                                if(ereg('<small>湿度(%)</small>', $buffer)){
                                        //天気帯の探索は終わり
                                        $find_mode = 6;
                                }

                        }else if($find_mode == 6){
                                if(ereg('<small><font color="#999999">.*</font></small></td>', $buffer)){
                                        //print("■過去".$buffer);
                                        //echo "\n";
                                }else if(ereg("^<td><small>.*</small></td>", $buffer)){
                                        $b1 = str_replace('<td><small>', "", $buffer);
                                        $b2 = str_replace('</small></td>', "", $b1);
                                        //print("■湿度 ".trim($b2)."(%)");
                                        //echo "\n";
                                        $situdo_array[] = trim($b2);
                                }
                                if(ereg('<small>降水量(mm/h)</small>', $buffer)){
                                        //天気帯の探索は終わり
                                        $find_mode = 7;
                                }

                        }

        }
                $result_array = array($timezone_array, $tenki_array,$kion_array,$situdo_array);
        //print_r($result_array);

                print($today_string."の天気をお伝えします。");
                //echo "\n";
                for($i=0;$i<count($result_array[0]);$i++){
                        print($result_array[0][$i]."は".$result_array[1][$i]."。 ".$result_array[2][$i]."度 ".$result_array[3][$i]."%です。");
                        //echo "\n";
                }

        flock($fp, LOCK_UN);
    }else{
        print('ファイルロックに失敗しました');
                echo "";
    }
}

$flag = fclose($fp);

if ($flag){
    print('おしまい。');
        echo "\n";
}else{
    print('クローズに失敗しました');
        echo "\n";
}

?>

実行はこんな感じで
./tenki.sh | ./AquesTalkPi  -v f1 -f - | aplay

すると天気予報をしてくれる!

0 件のコメント:

コメントを投稿