しろぼっとソースコード(一部)
大体こんな感じです。
replyを読み込んで返答する部分のみ。
通常発言のソースは面白みがなく、形態素解析のソースコードはぐぐれば出てきますし、DMに関しては非公開機能も含まれているので公開しません。
なお、Services_Twitterは本家ではなくphaさんの改造版を使用しています(in_reply_toが付けられるver)
<?php require_once "Services/Twitter.php"; require_once "Services/ShortURL.php"; require_once "Jsphon/Decoder.php"; // 基本部分 $user = 'しろぼっと'; $pass = 'しろぼっとのぱすわーど'; $st =& new Services_Twitter($user, $pass); // reply機能 // ファイル読み込み $fp = fopen("【どのstatus_idまでreply完了したか記録するtxt】","r"); $fline = fgets($fp,64); fclose($fp); $json = new Jsphon_Decoder(); // replyを取得 $rep = $json->decode($st->getReplies()); // 未処理のreplyに対して[古いほうから]繰り返す for ($i = 19; $i >= 0 ;$i--){ if ( $rep[$i]["id"] > $fline && strcmp("sirobot_",$rep[$i]["user"]["screen_name"]) != 0){ // 自分(sirobot_)からのreplyには反応しない(無限ループ防止) if ( strpos( $rep[$i]["text"], "やっといて" ) !== false || strpos( $rep[$i]["text"], "しておいて" ) !== false ) { kotowarutikara($i); // 断る力 } elseif ( strpos( $rep[$i]["text"], "って覚えといて" ) !== false && strcmp("siro_xx",$rep[$i]["user"]["screen_name"]) == 0){ rememberthemilk($i); // remember the milk機能 } elseif ( strpos( $rep[$i]["text"], "って記帳して" ) !== false && strcmp("siro_xx",$rep[$i]["user"]["screen_name"]) == 0){ sanzai($i); // 散財.com(家計簿)機能 } elseif ( strpos( $rep[$i]["text"], "画像" ) !== false || strpos( $rep[$i]["text"], "写真" ) !== false || strpos( $rep[$i]["text"], "フォトライフ" ) !== false ){ harahe($i); // はらへ(携帯百景)機能 // 2010/01/05よりはらへ2(フォトライフ)機能として復活しました!!!!!! } elseif ( strpos( $rep[$i]["text"], "点取り" ) !== false || strpos( $rep[$i]["text"], "占い" ) !== false ){ tentori($i); // 点取り占い機能 } elseif ( strpos( $rep[$i]["text"], "ってメールして" ) !== false && strcmp("siro_xx",$rep[$i]["user"]["screen_name"]) == 0){ kanni_mail($i); // 簡易メール機能 }else{ // 通常のreply作業 $replymessage_array = file("【リプライ用txtファイル】"); $rdm = rand(0,count($replymessage_array)-1); $reply_status = "@" . $rep[$i]["user"]["screen_name"] . " " . $replymessage_array[$rdm]; $st->setUpdate(array('status'=>$reply_status,'in_reply_to_status_id'=>$rep[$i]["id"])); } $fline = $rep[$i]["id"]; } } $fp = fopen("【どのstatus_idまでreply完了したか記録するtxt】","w"); fwrite($fp,$fline,strlen($fline)); fclose($fp); echo "reply done."; // デバッグ用 function kotowarutikara($i){ // 断る力機能 global $st,$rep; $reply_kotowarutikara = file("【ことわるちからtxt】"); $rdm = rand(0,count($reply_kotowarutikara)-1); $kotowaru_status = "@" . $rep[$i]["user"]["screen_name"] . " " . $reply_kotowarutikara[$rdm]; $st->setUpdate(array('status'=>$kotowaru_status,'in_reply_to_status_id'=>$rep[$i]["id"])); } function rememberthemilk($i){ // RTM機能 global $st,$rep; // RTMにメール送信してタスク登録(有効期限系は後で手動で何とか。メールは一括で受信箱に) $reply_rtm = file("【命令実行時応答txt】"); $rdm = rand(0,count($reply_rtm)-1); $reply_rtm[$rdm] = str_replace("\n","",$reply_rtm[$rdm]); mb_language("japanese"); mb_internal_encoding("UTF-8"); $mailto = "RTMのメアド"; $mailsubject = str_replace("@sirobot_","",str_replace("って覚えといて","",$rep[$i]["text"])); $mailbody = ""; $mailfrom = "From: 適当なメアド"; mb_send_mail($mailto,$mailsubject,$mailbody,$mailfrom); $rtm_status = "@" . $rep[$i]["user"]["screen_name"] . " " . $reply_rtm[$rdm] . " 覚えたよ!"; $st->setUpdate(array('status'=>$rtm_status,'in_reply_to_status_id'=>$rep[$i]["id"])); } function sanzai($i){ // 散財.com機能 global $st,$rep; $reply_sanzai = file("【命令実行時応答txt】"); $rdm = rand(0,count($reply_sanzai)-1); $reply_sanzai[$rdm] = str_replace("\n","",$reply_sanzai[$rdm]); // 散財.comにメール送信して散財記録 /// 形式 // @sirobot_ 「セブンイレブン」お昼ご飯 198円って記帳して // @sirobot_ 「店名(任意)」[項目名] [値段半角]円/[項目名] [値段半角]円って記帳して mb_language("japanese"); mb_internal_encoding("UTF-8"); $sanzaito = "散財メアド"; // メールの件名(店名)切り出し $sanzai_temp_text = $rep[$i]["text"]; // 元テキストのコピー $sanzaisubject = preg_replace("/.*「(.*)」.*/" ,"\\1" , $sanzai_temp_text); // 切り出し失敗の場合は件名を消去する if ( strcmp($sanzaisubject,$sanzai_temp_text) == 0 ) { $sanzaisubject = ""; $sanzai_temp_text = preg_replace("/@sirobot_ (.*)円って記帳して/" ,"\\1" , $sanzai_temp_text ); } else { $sanzai_temp_text = preg_replace("/.*」(.*)円って記帳して/" ,"\\1" , $sanzai_temp_text ); } $sanzaibody = str_replace("円/","\n",$sanzai_temp_text); $sanzaifrom = "From: 適当なメアド"; mb_send_mail($sanzaito,$sanzaisubject,$sanzaibody,$sanzaifrom); $sanzai_status = "@" . $rep[$i]["user"]["screen_name"] . " " . $reply_sanzai[$rdm] ." 記帳したよ!"; $st->setUpdate(array('status'=>$sanzai_status,'in_reply_to_status_id'=>$rep[$i]["id"])); } function harahe($i){ // はらへ(<s>百景</s>フォトライフ)機能 global $st,$rep; $harahe_word = preg_replace("/.*「(.*)」.*/" ,"\\1" , $rep[$i]["text"] ); if ( strcmp($harahe_word,$rep[$i]["text"]) == 0 ){ // はらへワード抽出失敗 $harahe_status = "@" . $rep[$i]["user"]["screen_name"] . " 写真の手がかり(キーワード)を「」で囲ってほしいな。そうじゃないとおれわからないよ。"; $st->setUpdate(array('status'=>$harahe_status,'in_reply_to_status_id'=>$rep[$i]["id"])); }else{ // サーチURL生成(全検索結果) $harahe_URL = "http://f.hatena.ne.jp/keyword/" . urlencode($harahe_word); $shorturl = Services_ShortURL::factory('TinyURL'); //$st->setUpdate("@" . $rep[$i]["user"]["screen_name"] . " " . $harahe_word . "で探してきたよ。" . $harahe_URL); $harahe_status = "@" . $rep[$i]["user"]["screen_name"] . " " . $harahe_word . "で探してきたよ。" . $shorturl->shorten($harahe_URL); $st->setUpdate(array('status'=>$harahe_status,'in_reply_to_status_id'=>$rep[$i]["id"])); } } function tentori($i){ // 点取り占い機能 global $st,$rep; $tentori = file("【点取りtxt】"); $rdm = rand(0,count($tentori)-1); $tentori_status = "@" . $rep[$i]["user"]["screen_name"] . " " . $tentori[$rdm]; $st->setUpdate(array('status'=>$tentori_status,'in_reply_to_status_id'=>$rep[$i]["id"])); } function kanni_mail($i){ // 簡易メール機能 global $st,$rep; $reply_kanni_mail = file("【命令実行時応答txt】"); $rdm = rand(0,count($reply_kanni_mail)-1); $reply_kanni_mail[$rdm] = str_replace("\n","",$reply_kanni_mail[$rdm]); // 散財.comにメール送信して散財記録 /// 形式 // @sirobot_ 「件名(ない場合はタイトルなし)」[本文]ってメールして mb_language("japanese"); mb_internal_encoding("UTF-8"); $kanni_mailto = "俺のメアド"; // メールの件名切り出し $kanni_mail_temp_text = $rep[$i]["text"]; // 元テキストのコピー $kanni_mailsubject = preg_replace("/.*「(.*)」.*/" ,"\\1" , $kanni_mail_temp_text); // 切り出し失敗の場合は件名を消去する if ( strcmp($kanni_mailsubject,$kanni_mail_temp_text) == 0 ) { $kanni_mailsubject = ""; $kanni_mail_temp_text = preg_replace("/@sirobot_ (.*)ってメールして/" ,"\\1" , $kanni_mail_temp_text ); } else { $kanni_mail_temp_text = preg_replace("/.*」(.*)ってメールして/" ,"\\1" , $kanni_mail_temp_text ); } $kanni_mailbody = $kanni_mail_temp_text; $kanni_mailfrom = "From: 適当なメアド"; mb_send_mail($kanni_mailto,$kanni_mailsubject,$kanni_mailbody,$kanni_mailfrom); $kanni_mail_status = "@" . $rep[$i]["user"]["screen_name"] . " " . $reply_sanzai[$rdm] . " メールしたよ!"; $st->setUpdate(array('status'=>$kanni_mail_status,'in_reply_to_status_id'=>$rep[$i]["id"])); } ?>