こんにちは。

ようやく雑なソースをまとめられたので、天気予報のphpソースを
公開いたします!

検索ワードの多いスクリプトなので、それなりに需要あるかもですが
もう他で公開されている物もあるので希少価値はありませんね

設置までの工程が少々面倒かも知れないので
初心者さんにはハードルが高いかもです;
サポートすることはできないので、検索をしながらなんとか
自力でがんばってください!

なお、Easybotter(ボットスクリプト本体)側にもちょっとだけ細工をしないと、
動かした時に、あはんwwwな気分を味わうことになるので注意です。

【おやくそく】
何が起きても作者は一切の責任を取れません。自己責任でお願いします。
また、livedoorさんの仕様変更など、環境変化に伴い使えなくなった時は
賞味期限切れと思い諦めてください;;


【じゅんび】
1.ソース内で「// Consumer keyの値」と書かれている下にある五カ所にそれぞれの情報を入れます。
よくわからない方はこちらをご覧ください。
2.「OAuth.php」「twitteroauth.php」を用意してスクリプトと同じ場所に入れておいてください。
3.
「twitteroauth.php」のファイルをダウンロードしたら、大文字小文字に注意しましょう。
ここからダウンロードできます。

【うごかしかた】
1.以下のソースを「TeraPad」など、文字コードを変更できるエディタへ貼り付けます。
2.文字コードを「UTF-8」へ「UTF-8N」があるなら「UTF-8N」へ変更して保存します。
3.改行コードを「LF」へ変更して保存します。(保存名は適当でおkです。例:test.php)
4.「tmp」というフォルダを作成します。
5.4で作成したフォルダの中に「last.dat」というファイルを入れておきます。
  アップロードしたらパーミッションを666に変更してください。

【EasyBotter.phpの改造】※ここはしなくても動くのでお好みで。
EasyBotter.phpの中にある「//RT, QTを除外する」という個所を開くと
以下のようになっています。

            //RT, QTを除外する
            $text = (string)$reply->text;
            if(strpos($text,"RT") != FALSE || strpos($text,"QT") != FALSE){

↑ここを↓のように直します。

            //RT, QTを除外する
            $text = (string)$reply->text;
            if(strpos($text,"RT") != FALSE || strpos($text,"QT") != FALSE || strpos($text,"天気") != FALSE){

【ほそく】

全国の地点定義表(RSS)
↑これを参考にして、天気予報に反応できる都市を増やしてください。


<?php
//    2010年5月3日(月)完成
//    2010年5月15日(土)OAuth対応版完成
//    Scripted tvi_nonomi
//   
//    ▼ 参考にしたサイトさま
//    twitter bot掲示板 http://pro10.sakura.ne.jp/tree/
//    PINKMAC - Love Train + Photo + IT Tech. http://pinkmac.com/
//    プログラミングを始める10の理由 http://d.hatena.ne.jp/bardothodol/
//    livedoor お天気Webサービス http://weather.livedoor.com/weather_hacks/webservice.html
//    他、多数の方からお力添えいただきました

/*

このスクリプトを使ったことが原因で起きた全てに一切責任をおいません。
また、サポートもできませんので予めご容赦ください。

「Consumer keyの値」欄にある5カ所にあなたのアカウント情報を入力してください。
「最高気温の判定」と「発言文の組立て」に入っている文章をカスタマイズすることで
チルノちゃんバージョンから解放されます。

*/

//    OAuth認証部分スタート
require_once("twitteroauth.php");

// Consumer keyの値
$screen_name = ""; //botのid名
$consumer_key = ""; // Consumer keyの値
$consumer_secret = ""; // Consumer secretの値
$access_token = ""; // Access Tokenの値
$access_token_secret = ""; // Access Token Secretの値

// OAuthオブジェクト生成
$to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);

// home_timelineの取得。TwitterからXML形式が返ってくる
$w_req = $to->OAuthRequest("https://twitter.com/statuses/home_timeline.xml","GET",array("count"=>"50"));

// XML文字列をオブジェクトに代入する
$w_xml = simplexml_load_string($w_req);

// foreachで呟きの分だけループする
foreach($w_xml->status as $status){
      $status_id = $status->id;  // 呟きのステータスID
      $text = $status->text;  // 呟き
      $user_id = $status->user->id;  // ユーザーナンバー(数字の方は絶対に変わらない)
      $name = $status->user->name;  // ユーザーの名前(HNなど)
}

//    新認証部分ここまで
//最新のTLのステータスIDを保存しておくファイルです。パーミッションは書き込み可(666)に。
$filename = "./tmp/last.dat";

//過去、どこまでリプライしたのかファイルを開いて取得
$fp = @fopen($filename,'rb') or die("ファイルが開けません");
flock($fp, LOCK_EX);
$line = fgets($fp, 64);
fclose($fp);

//自分がフォローしているfriendsのリストを取得。
$host = $to->OAuthRequest("http://twitter.com/statuses/friends_timeline.xml","GET",array("count"=>"50"));

//cURLセッションを初期化する…ここらへんはおなじみ
$ch = curl_init();
////オプションを設定する
curl_setopt($ch, CURLOPT_URL, $host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
//
////cURLセッションを実行する
$result = curl_exec($ch);
//
////cURLリソースを閉じ、システムリソースを解放する
curl_close($ch);

//XML文字列をオブジェクトに代入する
$XML = simplexml_load_string($host);

$i = count($XML)-1;
$j = 0;
 while($i >= $j) {
$var =  $XML->status[$i]->text;   
$reply_name = $XML->status[$i]->user->screen_name;
$name = $XML->status[$i]->user->name;

//    反応する文字列の抽出
if($reply_name != $screen_name){
if(ereg("天気", $var)){   

// 都市名→都市番号の変換用配列
$ts_city = array(

// ↓全国の地点定義表(RSS)を参考にどんどん増やしてみましょう!
        "東京"        => 63,
        "北海道"      => 4,
        "青森"        => 17,
        "宮城"        => 25,
        "福井"        => 48,
        "長野"        => 72,
        "静岡"        => 34,
        "名古屋"      => 38,
        "京都"        => 79,
        "大阪"        => 81,
        "兵庫"        => 82,
        "奈良"        => 84,
        "広島"        => 90,
        "愛媛"        => 104,
        "高知"        => 107,
        "福岡"        => 110,
        "長崎"        => 118,
        "佐賀"        => 122,
        "熊本"        => 124,
        "種子島"      => 135,
        "鹿児島"      => 132,
        "与那国島"    => 142,
        "石垣島"      => 141,
        "宮古島"      => 140,
        "南大東島"    => 139,
        "久米島"      => 138,
        "名護"        => 137,
        "那覇"        => 136,
        "沖縄"        => 136
    );

// 聞かれた都市名を特定する
foreach( $ts_city as $ts_area => $ts_areaNo){
    if( preg_match( "/" . $ts_area . "/u", $var ) ){
        $cityName    = $ts_area ;        // 聞かれた都市名
        break;
    }
}

// 都市が指定されてない場合は「東京」の天気を取得する
if( empty($cityName) ){
    $cityName = "東京";
}

// TLから拾った日付→日付記号の変換用配列
$ts_day = array(
        "今日"        => "today",
        "きょう"      => "today",
        "本日"        => "today",
        "あした"      => "tomorrow",
        "明日"        => "tomorrow",
        "あす"        => "tomorrow",
        "明後日"      => "dayaftertomorrow",
        "あさって"    => "dayaftertomorrow"
    );

// 聞かれた日付を特定する
foreach( $ts_day as $ts_day2 => $ts_day2_no){
    if( preg_match( "/" . $ts_day2 . "/u", $var ) ){
        $dayName    = $ts_day2 ;        // ← 聞かれた日付
        break;
    }
}

// 日付が指定されてない場合は「今日」の天気を取得する
if( empty($dayName) ){
    $dayName = "今日";
}

//livedoorさんからxmlを取得して、dayとcityを引数として与える
$v_req = "http://weather.livedoor.com/forecast/webservice/rest/v1";
$v_req .= "?city=".$ts_areaNo."&day=".$ts_day2_no;

//XMLファイルをパースしてオブジェクトに代入
$xml = simplexml_load_file($v_req)
 or die("XMLパースエラー");    //パースエラーが起きていなければ、$xmlオブジェクトデータ格納完了

    $forecastdate = $xml->forecastdate;
    $telop = $xml->telop;
    $description = $xml->description;
    $maxtemp = $xml->temperature->max->celsius;
    $mintemp = $xml->temperature->min->celsius;
    $max = "、ほにゃらら";
    $min = "、はにゃらら";
    $tep = "・・・なんだっけ?";

//XMLデータ取得に失敗したときのフォロー
if($telop==""){
    $telop = $tep;
}

if($maxtemp==""){
    $maxtemp = $max;
}

if($mintemp==""){
    $mintemp = $min;
}

/*    ここから↓
    ここからdescriptionを加工まで削っても大丈夫なのですが、
    いつか使うかも知れないと思い加工処理だけしています。
    貧乏性って本当に怖いですね!
    $dateには日付が入っていて、$descriptionには天気の詳細が
    入っていますけれど、twitterは140文字しか表示できないので
    使いどころが難しいです。
*/
// dateを加工 ※海外鯖対策ですけれど、発言に使っていません。
    date_default_timezone_set('Asia/Tokyo');
    $date = date("m/d", strtotime($forecastdate));
/*
    ↑は、お好みでこちら↓にしてもいいかもですけれど、結局発言に使っていません。
    $date = date("m/d H:i", strtotime($forecastdate));
*/

// descriptionを加工 ※この部分も発言に使っていません。
    $str = strpos($description, "...", 0);
    $description = substr($description,0,$str);
/*    ここまで↑ 削っても大丈夫です。    */

// ↓ここにハッシュタグが入っているので削ったり足したりはお好みで!
$ts_gobi = " #tenki #bot ";

// 発言文の組立て
    $message = $dayName."の".$cityName."の天気は、".$telop."で最高気温は".$maxtemp."℃! 最低気温は".$mintemp."℃だったよ! RT @".$reply_name." ".$var.$ts_gobi;

// 投稿動作
//code from http://d.hatena.ne.jp/hirataka522/20080126/1201300282 thanks!!

}
}
$i--;
}
//ファイルに最新id書き込み
$last_id = $XML->status[0]->id;
$dat = (string)$last_id;
file_put_contents($filename,$dat,LOCK_EX);

//    OAuth投稿関数
$req = $to->OAuthRequest("https://twitter.com/statuses/update.xml","POST",array("status"=>$message));

?>