SDN Project

"SDN" doesn't have a deep meaning...

2017.02.22 大幅に書き換え
2012.09.14 新API仕様(Ver 1.1)へ更新

PHP+OAuthでTwitter

このエントリーをはてなブックマークに追加

TwitterでBotを作りたい人のために、Twitterへのアプリケーションの登録から簡単なタイムラインの取得、ツイートを行えるプログラムをPHPで作っていきます。

Twitter APIを利用するにはOAuth認証が必要

Twitter といえば、twitter.com から直接ツイートしている人もいれば iPhone や Android のアプリからツイートしている人もいます。他にも、Togetter などの外部サービスはツイートを取得したりします。
これらのアプリや Togetter などのTwitter連携サービスは全てTwitterのAPIを使用しており、そのAPIはOAuth認証が必要です。

Twitterにアプリケーションを登録

Twitterにアプリケーション情報を登録します。
Twitterのアプリケーションマネジメントページにアクセスしてサインインしますが、TwitterのBotとして登録する場合はBotのアカウントでサインインし、それ以外なら自分のアカウント等でサインインします。

Twitter Application Management

サインインしたら右側の "Create New App" をクリックし、クライアント登録ページへ行きます。
最低限 NameDescriptionWebsite が入力されていれば大丈夫です。

Name
アプリケーションの名前です。日本語も使えます。
このアプリケーション名は、既に他の人が登録している場合は登録する事ができません。早い者勝ちです。
Description
アプリケーションの説明です。
10~200文字の範囲で入力します。
Website
アプリケーションの開発者などのサイトURLを入力します。BotならBotの説明ページでもいいかもしれません。
Callback URL
Twitter関連サービス(Webアプリケーション)としてOAuthを利用する際に、認証後に飛ばされるURLを指定します。詳しくはここでは説明いたしません。
空欄で構いません。

Twitterのデベロッパーに関する規約およびポリシー(英語)に同意であれば、"Yes, I have read and agree to the Twitter Developer Agreement." にチェックを入れ、"Create your Twitter application" をクリック。
これにて登録完了ですが、これで終わりではありません。

アプリケーション情報の編集

登録したアプリのページにアクセスすると様々な情報が載っています。
登録したアプリの情報は Settings タブから編集できます。
そして、登録時にはなった項目もあります。

Privacy Policy URL
アプリケーションのプライバシーポリシーのページのURLを入力します。
Terms of Service URL
開発チームなどのサイトのURLを入力します。
Enable Callback Locking
チェックは入れないでください。ここでは説明しません。
Allow this application to be used to Sign in with Twitter
Twitter関連サービスで Sign in with Twitter を使う場合にチェック。ここでは詳しく説明しません。
Application Icon
アプリケーションのアイコンです。
そのままデフォルトのアイコンでも大丈夫です。自分の好きなアイコンにしても構いません。
Organization
個人なので空欄のままでも構いません。企業や団体なら記入します。

アプリケーションの権限

権限によってアプリケーションで使用できるAPIが変わってきます。重要な部分です。
Permissions タブから設定します。

Read only
タイムラインの取得等、GETメソッドで使用するAPIのみ使えます。(一部を除く)
ツイートなどはできません。取得メインならこちらでよいでしょう。
Read and Write
タイムラインの取得やツイートの投稿、フォロー/フォロー解除、プロフィールの更新などが行えますが、ダイレクトメッセージの取得・送信はできません。
ダイレクトメッセージ関連以外のほとんどのAPIを使用できます。
Read, Write and Access direct messages
ダイレクトメッセージ関連含め、すべてのAPIを使用できます。

ここでは、タイムラインの取得およびツイートを行うので、"Read and Write" に設定します。

権限は作ろうとしているアプリケーションに合わせましょう。
例えば、タイムラインの取得のみなのに "Read, Write and Access direct messages" などに設定してしまうと、過剰な権限でありおすすめしません。

"Consumer Key" と "Consumer Secret"

APIに接続するために必要な情報を見ていきます。
Keys and Access Tokens タブをクリックします。

"Application Settings" の項目に "Consumer Key""Consumer Secret" があります。
それらがAPIへ送信するアプリケーション情報になります。必要な情報なのでメモしておきます。
簡単に説明すると、"Consumer Key" がアプリケーションのユーザーIDで、"Consumer Secret" がアプリケーションのパスワードという扱いです。
"Consumer Secret" は他人に知られないようにしてください。悪用される恐れがあります。

まだまだ、この情報だけでは足りません。

"Access Token"と"Access Token Secret"

ユーザーがアプリケーションを使用するために必要な情報を取得していきます。
先ほどと同じく、Keys and Access Tokens タブを見ていきます。

"Your Access Token" の項目に "Create my access token" というボタンがあります。
このボタンをクリックすると情報が更新され、"Access Token""Access Token Secret" が表示されます。
それらが、アプリケーションを登録したアカウント用の情報になります。必要な情報なのでメモしておきます。
簡単に説明すると、"Access Token" がアプリケーションを使用するためのユーザーIDで、"Access Token Secret" がアプリケーションを使用するためのパスワードという扱いです。
"Access Token Secret" は他人に知られないようにしてください。アカウント乗っ取りなど、悪用される恐れがあります。

PHPでTwitter APIを使用するための準備

PHP5.4以上であれば問題ないかと思います。
Twitter APIへ接続するために、"tmhOAuth" というPHPライブラリを使用していきます。

GitHub - themattharris/tmhOAuth: An OAuth 1.0A library written in PHP

緑の "Clone or download" からzipファイルがダウンロードできます。
zipファイルを展開し、"tmhOAuth.php" を任意の場所へ移動させておきます。

実際にタイムラインを取得してみる

それでは、タイムラインを取得するコードを書いてみます。
文字コードは UTF-8 でないと文字化けする可能性があります。

<?php
// tmhOAuth.php の読み込み。パスはあなたが設置した場所に合わせてください
require_once '/your/path/tmhOAuth.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';

// tmhOAuth クラスの呼び出し
$twitter = new tmhOauth([
    'consumer_key'    => $consumer_key,
    'consumer_secret' => $consumer_secret,
    'user_token'      => $access_token,
    'user_secret'     => $access_token_secret,
]);

// タイムラインの最新50件を取得
$status_code = $twitter->request('GET', 'https://api.twitter.com/1.1/statuses/home_timeline.json', [
    'count' => '50',
]);

// HTTPステータスコードが200なら成功
if ($status_code !== 200) {
    exit('Error: ' . $status_code);
}

// APIはJSON形式で返ってくるのでデコードする
$json = $twitter->response['response'];
$timeline = json_decode($json);

// foreach でまわす
foreach ($timeline as $status) {
    $status_id   = $status->id_str;             // ツイートのID
    $tweet       = $status->text;               // ツイート本文
    $user_id     = $status->user->id_str;       // ユーザーの数字ID
    $screen_name = $status->user->screen_name;  // スクリーンネーム(通常目にするユーザーID)
    $name        = $status->user->name;         // ユーザーの名前

    echo '<p><b>' . $screen_name . '/' . $name . '</b><br>' . $tweet . '<br>';
    echo '<a href="https://twitter.com/' . $screen_name . '/status/' . $status_id . '">パーマリンク</a></p>' . PHP_EOL;
}

あっさりと取得できました。

tmhOAuth でのAPIリクエストの形式は以下のような感じです。

/* $method: リクエストのメソッド GET / POST など
 * $api_url: APIのURL
 * $params: 送信するパラメータ */

// リクエストの返り値はHTTPステータスコードなので注意
$status_code = $twitter->request($method, $api_url, $params);

// APIのJSON
$json = $twitter->response['response'];

気を付けないといけないのが、Twitter APIには制限があります。
タイムライン取得に関しては、15分に15回リクエストが可能です。それ以上になると403エラーになります。

APIが返すJSONの中身について詳しく知りたい場合はドキュメントを見てください。
GET statuses/home_timeline — Twitter Developers

実際にツイートしてみる

ツイートも簡単にできます。

<?php
// tmhOAuth.php の読み込み
require_once '/your/path/tmhOAuth.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';

// tmhOAuth クラスの呼び出し
$twitter = new tmhOauth([
    'consumer_key'    => $consumer_key,
    'consumer_secret' => $consumer_secret,
    'user_token'      => $access_token,
    'user_secret'     => $access_token_secret,
]);

// ツイートする
$status_code = $twitter->request('POST', 'https://api.twitter.com/1.1/statuses/update.json', [
    'status' => 'ツイートテストだよ',
]);

// HTTPステータスコードが200なら成功
if ($status_code !== 200) {
    exit('Error: ' . $status_code);
}

// APIはJSON形式で返ってくるのでデコードする
$json = $twitter->response['response'];
$result = json_decode($json);

// 結果の表示
echo '<pre>';
var_dump($result);

意外と簡単にできるものですね。
APIにはたくさん種類があるので、これでやりたいことをたくさんやりましょう。

Reference Documentation — Twitter Developers