鬱陶しいとかモラル的にどうなのかという点はひとまず置いといて。。。。
ツイッター上の発言を検索し、特定のキーワードが含まれていればフォローしたりリツイートしたりするスクリプトをPHPで書いてみました。
TwitterAPI 1.1になってから、タイムラインを検索することもOAuth認証が必要となりました。
また、返されるJSONのフォーマットが少し変わっています。
ADs
以下のコードをfollow.phpのような名前で保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
<?php //https://github.com/abraham/twitteroauthよりダウンロードできます require_once("twitteroauth/twitteroauth.php"); define("CONSUMER_KEY" , "Consumer key"); define("CONSUMER_SECRET" , "Consumer secret"); define("ACCESS_TOKEN" , "Access token"); define("ACCESS_TOKEN_SECRET" , "Access token secret"); define("KEYWORD" , "検索したいキーワード"); //何件のツイートを取得するか。多すぎると短時間で大量のフォローをすることになるので、アカウント凍結の危険性があります。 define("SEARCH_COUNT" , 10); //タイムラインを検索 function search() { $options = array('q'=>urlencode(KEYWORD),'count'=>SEARCH_COUNT,'lang'=>'ja'); $twObj = new TwitterOAuth( CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET ); //認証と検索結果の受け取り $res = $twObj->OAuthRequest( 'https://api.twitter.com/1.1/search/tweets.json', 'GET', $options ); //JSONで帰ってくる $json = json_decode($res); if (!$json) { fputs(STDERR , "Failed to get json\n"); return $ret; } //スクリーンネームを配列に格納する foreach ($json->statuses as $r) { if (isset($r->user->screen_name)) { $ret[] = $r->user->screen_name; } } return $ret; } $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN , ACCESS_TOKEN_SECRET); //すでにフォロー済みのアカウントを配列に格納 $friends_data = $connection->get("statuses/friends"); $friends = array(); foreach ($friends_data as $f) { if (isset($f->screen_name)) { $friends[] = $f->screen_name; } } $result = search(); //検索結果のアカウントがフォロー済みでなければフォローする foreach ($result as $r) { if (!in_array($r , $friends)) { // follow $connection->post("friendships/create", array("id" => $r)); fputs(STDOUT , "Follow {$r}\n"); $friends[] = $r; //短時間で一気にフォローしないように sleep(5); } } ?> |
上記follow.phpとtwitteroauthフォルダをサーバにアップロードし、直接アクセすするかCRONで実行するように設定すれば「検索したいキーワード」で指定したキーワードを呟いたアカウントを自動でフォローしていきます。
短時間で大量のフォロー、リムーブを行うとスパムアカウントと判定され、アカウントが凍結されます。
1度目はすぐに凍結解除が可能ですが、2度目になるとスパムでないことをフォームより申告する必要があります(実際に解除されるかどうかは不明)。
上記スクリプトのせいでアカウントが凍結されても私は責任を負うことはできません。
自己責任でご利用ください。
2013年6月26日追記
上記スクリプトをCRONで1時間に1度実行させていたら2日後にアカウントが凍結されました。。。。(;´Д`) Twitterがどんどんスパムアカウントに厳しくなっているようなので、ごくごく控えめにしたほうが無難なようです。
ADs
リムーブするPHPはできますか?
ひで 様
コメントありがとうございます。
$connection->post(“friendships/create”, array(“id” => $r));
となっている部分を
$connection->post(“friendships/destroy”, array(“id” => $r));
とすればアンフォローになります。
ありがとうございます
それだけで自分がフォローしたのにフォローを返してくれない人を
リムーブできるのですか?
ほかに変更とかないのですか?
よろしくお願いします
ひで 様
「だけ」と言うと語弊があります。
実際にフォローの処理を行っている最後の部分
foreach ($result as $r) {
if (!in_array($r , $friends)) {
// follow
$connection->post(“friendships/create”, array(“id” => $r));
fputs(STDOUT , “Follow {$r}\n”);
$friends[] = $r;
//短時間で一気にフォローしないように
sleep(5);
}
}
を見ていただきたいのですが、フォローの例ですとin_arrayによってフォロー済みではないという条件分岐を行っています。
おそらく「こちらがフォローしたのにフォロー返ししてくれない人を一定期間後にアンフォローする」という処理をしたいのだと思いますが、その場合は$rや$friendsという配列の組み方をif文を考えなおす必要があると思われます。
たとえば
$friends・・・自分のフォロワー配列(これは変わらない)
$r・・・自分のフォロワーの中で自分をフォローしていない配列
というふうに組み立てる必要があるでしょう。
実行すると
Warning: Invalid argument supplied for foreach() in /home/u143654170/public_html/follow.php on line 41
Warning: Invalid argument supplied for foreach() in /home/u143654170/public_html/follow.php on line 64
と出てしまうのですが、何かわかりませんか?
phpに詳しくないので申し訳ないです。
ケイト さま
コメントありがとうございます。
そのエラーメッセージはforeachのループに配列が渡せていないというエラーになります。
おそらく$resという変数が正常に受け取れていないのではないかと思いますので、
$res = $twObj->OAuthRequest(
‘https://api.twitter.com/1.1/search/tweets.json’,
‘GET’,
$options
);
var_dump($res);//これを追加
と記述して$resの中身がどうなっているかご確認いただけますでしょうか。
回答ありがとうございます。
指示通り追加したところ、以下のように表示されました。
?string(61) “{“errors”:[{“message”:”Invalid or expired token”,”code”:89}]}”
Warning: Invalid argument supplied for foreach() in /home/u143654170/public_html/follow.php on line 44
Warning: Invalid argument supplied for foreach() in /home/u143654170/public_html/follow.php on line 67
ケイトさま
「Invalid or expired token」ということはConsumer key・Consumer Secret・Access token・Access token Secretのどこかが間違っている可能性が高いです。
きちんとコピペできているか、スペースやタブが入ってないかをご確認ください。
管理人さん、できました!
お時間取らせてすみませんでした。
ありがとうございました!
>上記follow.phpとtwitteroauthフォルダをサーバにアップロードし、直接アクセすするかCRONで実行するように設定すれば「検索したいキーワード」で指定したキーワードを呟いたアカウントを自動でフォローしていきます。
この部分が具体的にどうやればいいかわからないです。