PHPとOAuthでリツイートbotを作ってみた

※記事内に商品プロモーションを含む場合があります

ツイッターの個人アカウントに@eaxjpがあり
この日々の出来事のアカウントとして@_hibinodekigotoがありますが、
日々の出来事の過去記事を投稿するのに複数のアカウントを設定
出来ないので、日々の出来事のツイートを@eaxjpがリツイートする様
にしたいのでリツイートbotを作りました。

リツイートbotの作り方

作り方はこちらのサイトを参考にしました。
「PHP + OAuth」で特定ユーザーのツイートを公式RTするbot
を作成してみた。その1
「PHP + OAuth」で特定ユーザーのツイートを公式RTするbot
を作成してみた。その2

twitteroauthのダウンロード、アプリケーションの登録はその1
PHPのコードと設定方法は、その2を参考に。
ただし、このコードはAPIのバージョンが古く現在使用することはできません
後々、変更してみたいと思います。

その1

最近のツイッターはOAuthが必要になり、面倒なのでライブラリーを
使います。
必要なのは、OAuth.phptwitteroauth.phpの2つだけです。
次に、リツイートする方のアカウントでアプリケーション登録します。
アプリケーション登録はこちら
https://dev.twitter.com/apps

アプリケーション登録の方法は上のその1そ参考にしてください。
アプリケーション登録が完了したら

  • Consumer key
  • Consumer secret
  • Access token
  • Access token secret

の4点を控えておいて下さい。
後、アクセストークン(Access token)のAccess levelRead and write
なっているのを確認してください。
もしRead onlyだとリツイートする事は出来ないのでRead and write
変更してからアクセストークンを再取得して下さい。

その2

PHPのコードを作成するのですが、元々のコードのAPIバージョンは
1で最近は1.1。
すでにバージョン1はすでに使えなくなっているのでそのままでは
その2のコードは使えません。

なので改変してみました。

<?php
    // リツイートbot by eax(https://b.eax.jp/?p=4485) 2013年6月15日
    // 元ソース http://webmage.pro/blog/archives/352
    // twitteroauth.phpを読み込む。
     require_once("twitteroauth.php");

        // Consumer keyの値 @@@@@@
        $consumer_key = "************************************";
        // Consumer secretの値 @@@@@@
        $consumer_secret = "****************************************";
        // Access Tokenの値 @@@@@@
        $access_token = "****************************************";
        // Access Token Secretの値 @@@@@@
        $access_token_secret = "************************************";

    //ツイート取得、日々の出来事の最新1ツイートのみ
     $to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);
     $req = $to->OAuthRequest("https://api.twitter.com/1.1/statuses/user_timeline.json","GET",array("screen_name"=>"_hibinodekigoto","count"=>"1"));
     $tweet = json_decode($req);

	//ID等の取り出し
     $retweet = $tweet[0]->text;
     $id = $tweet[0]->id_str;

    // TwitterへRTする。 最新ツイートのみリツイート、リツイート済はエラーとなる。
     $to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);
     $req = $to->OAuthRequest(
    'https://api.twitter.com/1.1/statuses/retweet/'.$id.'.json',
    'POST'
	);

?>

ほとんど変わっていて同じなのはIDを取り出す所だけです。

先ほどのConsumer keyとアクセストークンなど4点を*****の所に入れて下さい。

このままだと日々の出来事のリツイートbotになってしまうのでscreen_nameの横にある
_hibinodekigotoを任意のアカウントに変更して下さい。

設定が完了したら名前を付けて保存し、FTP等でアップロードする時は
OAuth.phptwitteroauth.php同じディレクトリ
(Windowsではフォルダとも言う)に保存して下さい。

このアプリの実行はSSHやCRONで、
私の場合はcd /www/_scripts;php eaxjprt.php > /dev/null

その後、CRONのコードを
cd /www/_scripts;php eaxjprt.php  > /dev/null 2>&1
にしたら、CRONでエラーは表示されなくなりました。

実行してみたら、ちゃんとリツイート出来てました。
eaxrtb

難点はリツイート済だとエラーが出る事。

PHP Warning:  Missing argument 3 for TwitterOAuth::oAuthRequest(), called in /www/_scripts/eaxjprt.php on line 29 and defined in /www/_scripts/twitteroauth.php on line 174
PHP Notice:  Undefined variable: parameters in /www/_scripts/twitteroauth.php on line 178

一応使えるので問題があれば改善したいと思います。
その後、コマンドを変更しエラーは表示はされなくなりました。

追記
リプライや非公式リツイートなど@が入ったツイートをリツイートさせたく無い場合は
のスクリプトを追加しました。
追加部分のみだと分かりにくいので変更分を含んだすべてを再掲載します。

<?php
//日々の出来事をeaxjpがリツイート
// リツイートbot by eax(https://b.eax.jp/?p=4485)
// 元ソース http://webmage.pro/blog/archives/352
// @付ツイートをリツイートしない様にした。
// twitteroauth.phpを読み込む。
require_once(“twitteroauth.php”);// Consumer keyの値
$consumer_key = “”;
// Consumer secretの値
$consumer_secret = “”;
// Access Tokenの値
$access_token = “”;
// Access Token Secretの値
$access_token_secret = “”;//ツイート取得、最新1ツイートのみ
$to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);
$req = $to->OAuthRequest(“https://api.twitter.com/1.1/statuses/user_timeline.json”,”GET”,array(“screen_name”=>”_hibinodekigoto”,”count”=>”1″));
$tweet = json_decode($req);//ID等の取り出し
$retweet = $tweet[0]->text;
$id = $tweet[0]->id_str;
echo $retweet;
if (preg_match(“/@/”, $retweet)) {
echo “リツイートorリプライなのでリツイートしません”;} else {
echo “リツイートします”;
echo $retweet;

// TwitterへRTする。 最新ツイートのみリツート、リツート済はエラーとなる。
$to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);
$req = $to->OAuthRequest(
‘https://api.twitter.com/1.1/statuses/retweet/’.$id.’.json’,
‘POST’
);

}
?>

このままだと日々の出来事のリツイートbotになってしまうので20行目ぐらいにあるscreen_name
をリツイート元としたいアカウントに変更してください。