OAuthで返信したらフォロー・アンフォローしてくれる機能
前の記事にひきつづいてリプライですが、今度はフォローします。
その前にbot掲示板での不具合や、前から空リプライが出る構造だったので緊急措置ながら今回見直してます。
概要ですが「フォローして」とbotに言ったらフォロー、「フォロー解除」というと解除する、以前のbasic認証でもやってなかった事をやりました。
それ以外の語句でも反応します。フォローとリプライ、別々のスクリプトにする必要はなくなったということですね!
(フォローする処理を行ったらフラグを立てて以降の処理はすっとばすという感じです。)
各functionも微妙に違ってたりしますので、機能追加なさる方はコメント等よく見て改造など行って下さい。あとから気づいて書き足したりスパゲッティコードのてんこもりだよ!!どうぞ皆さんのわかりやすいように書き直して下さい…
自動フォローはまた別記事にてあげようと思います。
ごめん、もう眠いのでまた
<?php // twitteroauth.phpを読み込む。パスはあなたが置いた適切な場所に変更してください require_once("twitteroauth.php"); // 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); //返信関連のオブジェクト作成 $host = "http://twitter.com/statuses/mentions.xml"; //返信一覧 $filename = "./tmp/data.txt"; //保存しておいたステータスid取得。このid以降の返信を読み込む。なかったり読み込めなかったら最新1件 $fp = @fopen($filename,'rb') or die("ファイルが開けません"); flock($fp, LOCK_EX); $line = fgets($fp, 64); fclose($fp); if(!empty($line)){ $req = $to->OAuthRequest($host,"GET",array("since_id"=>$line)); } else{ $req = $to->OAuthRequest($host,"GET",array("count"=>"1")); } $XML = simplexml_load_string($req); //フレンドリストのオブジェクト作成 $host = "http://twitter.com/friends/ids.xml"; $req = $to->OAuthRequest($host,"GET",array()); $friends = simplexml_load_string($req); $friendslist = array(); foreach($friends->id as $item){ $friendslist[] = (String)$item; } //返信処理 $i = count($XML)-1; $j = 0; while($i >= $j) { $com = $XML->status[$i]->text; $reply_name = $XML->status[$i]->user->screen_name; $name = $XML->status[$i]->user->name; $id = $XML->status[$i]->id; //ゴチャゴチャするので、返信のセリフ組み合わせはユーザー定義関数で。 $message = serif($reply_name,$name,$com,$id); //$messageに何か入ってる時だけ発言 if($message){ $result = $to->OAuthRequest("https://twitter.com/statuses/update.xml","POST",array("status"=>$message)); print $result;//デバッグ用いらなければ消す } $i--; } //最終発言リプライのidを保存してる部分。 $string = $XML->status[0]->id; if(!empty($string)){ $dat = (string)$string; file_put_contents($filename,$dat,LOCK_EX); } //セリフ生成のユーザー定義関数 //$reply_nameなんかの扱いが微妙に違うので気をつけて! function serif($reply_name,$name,$com,$id){ $break_flag = false; $today = date("Y/m/d l H:i:s");//デバッグ用の日付表示(なくてよい) if (preg_match("/フォローして/u", $com)){ //フォロー関数 $result = forrowing($id,$reply_name); if($result === true){ $return = "@".$reply_name." "."フォローしました!".$today;//フォロー成功時のテキスト。いらなければ消す } $break_flag = true; }else if(preg_match("/フォロー解除/u", $com)){ //フォロー解除関数 $result = destroy($id,$reply_name); if($result === true){ $return = "@".$reply_name." "."フォロー解除しました".$today;//フォロー解除時のテキスト。いらなければ消す } $break_flag = true; } //フォローの記述ここまで。上記のフラグが成立していればスルー、していなければ語句のマッチを探す if($break_flag === false){ //特定語句に反応する部分 $uranai=array("大吉","中吉","小吉","末吉","吉","凶"); $janken=array("ぐー","ちょき","ぱー"); if(stristr($com, "占い")){ $key = array_rand($uranai); $post = $uranai[$key]; $return = "@".$reply_name." ".$name."さんの運勢…".$post; } else if(stristr($com, "じゃんけん")){ $key = array_rand($janken); $post = $janken[$key]; $return = "@".$reply_name." ".$name."さん、勝負だ!じゃんけん…".$post; } else{ //falseだと発言をスルーする $return = false; } } //戻り値 return $return; } //フォロー関数 function forrowing($id,$reply_name){ global $to,$friendslist; $flag = false; foreach($friendslist as $var){ if($var == $id){ $flag = true; } } $host = "http://twitter.com/friendships/create/"; $host .= $reply_name.".xml"; if($flag === false){ print "フォローしてません"; $result = $to->OAuthRequest($host,"POST",array()); print "フォローしました"; if($result){ return true; }else{ return false; } }else{ print "既にフォローしてます"; return false; } } //アンフォロー関数 function destroy($id,$reply_name){ global $to,$friendslist; $flag = false; foreach($friendslist as $var){ if($var == $id){ $flag = true; } } $host = "http://twitter.com/friendships/destroy/"; $host .= $reply_name.".xml"; if($flag === false){ print "フォローしてます"; $result = $to->OAuthRequest($host,"POST",array()); print "フォロー解除"; if($result){ return true; }else{ return false; } }else{ print "フレンドに存在しません"; return false; } } ?>