twitterのbotなどで OAuthを使う方法(PHPバージョン2)

プログラミング関係

twitterのbotなどで OAuthを使う方法(PHPバージョン)』へたくさんの人が来られるのでその誘導用記事。

まずtwitterに登録しよう

bot用のOAuthの設定を始めるに当たってtwitter側で登録する必要がある。
botのアカウントでtwitterにログインをした状態で以下のリンクへ。
Twitter Applications | dev.twitter.com
すると下の画像のようなアプリケーション一覧画面になる。
まだOAuth用の登録をしていないなら一覧には何も表示されません。

登録してあるOAuthの一覧

画面右側にある『新しいアプリケーションを登録する』をクリック。
そうすると下のような設定画面がでて来る。

簡単な設定画面

設定してアプリケーションを登録した後、アプリケーション一覧画面へ戻る。
登録したアプリケーションの画像をクリックすると個別の情報ページへと飛ぶ。

アプリケーションの個別画面

モザイクかけてあるところが秘密にするべき情報。
bot用の設定ならばCallback URLは空欄だ。
この画面の中の『Consumer key』と『Consumer secret』が今回OAuthを使うのに必要なもの。

そして画面右側にある『My Access Token』をクリック。
そうすると『Access Token』と『Access Token Secret』が発行される。

これら4つのランダムな文字列を使ってOAuth用のプログラムを動かす。

プログラムの準備をしよう

まず、『abraham’s twitteroauth at master – GitHub』からプログラムをダウンロードしよう。
バージョンは0.2.0以降のものをダウンロードする。βが付いてるけど動くみたい。

バージョン0.2以降をダウンロード

ダウンロードし解凍した中の『twitteroauth』フォルダの中の『OAuth.php』と『twitteroauth.php』を使ってbotを動かす。
それら二つをbotと同じ場所にコピペだ。

動作テストの例としてAPIを使うサンプルを少し詳しく紹介。
http://api.twitter.com/1/statuses/mentions.xml?count=30』の内容をモニョモニョする。(2017年5月5日このAPIはもう使われてないっぽい)
PHP5以降が必須です。

<?php
// twitteroauth.phpを読み込む。パスはあなたが置いた適切な場所に変更してください
	require_once("twitteroauth.php");

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

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

//APIを呼び出す(今回はリプライを30件取得する)
	$result = $to->OAuthRequest("http://api.twitter.com/1/statuses/mentions.xml","GET",array("count"=>"30"));
//扱いやすくする
	$xml = simplexml_load_string($result);

//foreachを使い処理をする
	foreach( $xml->status as $value ){
		$status_number = $value->id;	//個別発言のステータスナンバー
		$text = $value->text;	//発言内容
		$screen_name = $value->user->screen_name;	//発言者のtwitterID

		//各発言を表示する(botだと$textに特定文字列がある場合リプライするとかの処理を入れる)
		echo $screen_name . "さんから@が飛んできました。
"; echo "発言内容は" . $text . "で、その個別ページはhttp://twitter.com/" . $screen_name . "/status/" . $status_number . "です。
"; echo "
"; } ?>

コードの上にマウスを持ってくるとコードの右上の方にプリンタの画像とかが出てくるので、
その一番左にあるプレインテキストの画像をクリックすれば別ウインドウにコピペしやすく再表示されます。

以上で解説は終わりです。
何か質問があればコメント欄へよろしくお願いいたします。

コメント

  1. からし より:

    OAuth対応させるためにbotをつくりなおしていてたどり着きました、お世話になっています。
    こちらのソースをそのままコピペし、consumer_key等入力してて実行したのですが
    Warning: simplexml_load_string() expects parameter 1 to be string, object given in /フルパス on line 20
    Warning: Invalid argument supplied for foreach() in /フルパス on line 23
    というエラーが出ます。
    リプライをうまく取得できていないのだと思うのですが、どうしたらいいでしょう…
    通常ポストはできているのでOAuth認証は間違ってはいないと思うのですが
    アドバイスいただけると嬉しいです。

  2. からし より:

    レスありがとうございます。
    23行目は20行目がどうにかなればエラーも消えてくれるという事ですね!すこし希望が見えます…!

    http://api.twitter.com/1/statuses/mentions.xmlにアカウントにログインしたまま入ってみたのですがしっかり取得できました。
    他のtwitterbotのサイトをみてもなかなか見ないエラーのような気がして、こちらの設定が何か間違っているのかと見て回ったのですがそれも問題無さそうでした、
    使っているサーバーは@pagesなのでphp5に対応していないという訳でも無いと思いますしtwitteroauth.phpのバージョンも確認しました。
    本当にお手上げ状態です…

  3. hosimitu より:

    コメントありがとうございます。

    エラーコードを大体で訳してみると
    simplexml_load_string()の一つめのパラメータがおかしいですよ。
    的なことが書かれているみたいですね。
    23行目のエラーは20行目がうまく取得出来ていないためにエラーになっています。

    simplexml_load_string()のパラメータは$resultしかないので、そこから考えるとコメントに書かれているようにtwitterのAPIがうまく動いていないのではないかと考えられます。
    実際使われるアカウントでブラウザからAPIのURLにアクセスしてキチンとリプライが取得出来るか確かめてみる必要がありそうですね。
    twitterは時々重たくなってAPIが正常に帰ってこない時がありますので、時間をおくと動く用になる時もあります。

    リプライがキチンと取得出来ていてもプログラムがエラーになる場合はまたコメントでもしてくださいませー。
    解決するかどうかは保証出来ませんが(;><)

  4. hosimitu より:

    報告ありがとうございます。

    こちらでも自分のbotでコピペしてプログラムを動かしたところ正常に動きました。
    なのでちょっと原因はわからないです。

    一度botではなく自分のアカウントでOAuth認証して『Consumer key』などを取得してみてはどうでしょうか?

    また、他の解決方法を探るために『$result』にキチンと値が入っているか確認するのもアリです。
    上記ソースコードの『//扱いやすくする』の上に『var_dump($result)』と書いて実行すると$resultの中身が表示されるはずです。
    そこでtwitterのデータっぽいのが入っていれば『simplexml_load_string()』自体がおかしいと言う事になります。
    入っていなければAPIがキチンと取得出来てないと言うことになります。

    頑張ってくださいね。

  5. からし より:

    レスなんどもありがとうございます!
    『var_dump($result)』を試してみたところそれっぽいのが表示され、ソースを見てみるとxmlらしいものが取得できていたので
    simplexml_load_string()に何かあるようですね。
    扱いやすく~のほかにforeachを使い~の前に『var_dump($xml);』と打ってみたら
    Warning: simplexml_load_string() expects parameter 1 to be string,(以降パスなど)
    NULL
    と返されました。NULL…?はtwitteroauth.phpに関連してるんでしょうか…
    basic廃止までまだ時間がありますしもう少し考えつくだけ試してみますね、
    ありがとうございました、頑張ります…!

  6. hosimitu より:

    こちらでも色々と考えてみましたが、決定打となる場所は推測できませんでした(´ω`)

    エラー内容から見るに『simplexml_load_string()』に入れている$resultが正しい形ではないみたいですね。
    『abraham’s twitteroauth at master – GitHub』のバージョン2以降を使って、ほかのAPI、例えばホームタイムラインとか、を取得してキチンと動くか試してみたりすると何かに気付けるかも知れません。

    他に強引にエラーを表示させなくする方法もあります。
    http://jp2.php.net/manual/ja/language.operators.errorcontrol.php
    今回の場合は『$xml』がNULLで、中に何も入っていない状態になっているようなのでまったく意味は無いと思いますが・・・。

  7. YUU より:

    これってどういうエラーでしょうか?
    Warning: array_merge() [function.array-merge]: Argument #2 is not an array in **********\OAuth.php on line 301

  8. niwa より:

    こんばんは。こちらの方法で新たに設置するbotのOAuth取得しようと
    試してみたのですが、昔の0.1.1の方法でもこの方法でも4つのキーを
    取得するところまではできるのですが、投稿テストをすると真っ白で何も表示されず
    強引にbotにつぶやかせようとすると
    object(SimpleXMLElement)#10 (2) {
    [“request”]=>
    string(20) “/statuses/update.xml”
    [“error”]=>
    string(34) “Could not authenticate with OAuth.”
    }
    と出てきます。
    『http://api.twitter.com/1/statuses/mentions.xml?count=30』の内容をモニョモニョする。
    というのは具体的にどうすることなのでしょうか?
    前に取得したときはここまで詰まることはなかったのですが、削除して新たに
    設定しなおそうとしてもTwitterの処理限界を超えてできませんとくじらが出てきて
    削除が出来ず、完全にお手上げです。何かアドバイスいただければ幸いです。
    よろしくお願いします

  9. niwa より:

    すみません。自己解決しました。
    EasyBotter2.04なのですが、setting.phpに4つのキーを入力したら
    できました。焦って投稿してスレ汚ししてしまい、申し訳ありませんでした

タイトルとURLをコピーしました