みなさんこんにちは。Advent Calender14日目担当のCulMenです。
突然ですが、皆様はTwiterやってますでしょうか?私はやってないです。
そんなTwitterとは関係ない話なのですが、インターネットサービスを利用中に「こんな機能があったらいいのにな~」なんて思った経験はないですか?そしてその機能を実現できるツールがあるとすれば?これはもう自分で作るしかないですね!
という事で今回は何故かTwitterにおける「自分のやりたい事を実現する手段」、Twitter APIに関してその初歩の初歩を紹介していきたいと思います。
うるせーこっちはお前の製作物見に来たんや!お前の説明なんかどうでもええんや!という方はこちらからどうぞ。
もくじ
1.Twitter APIとは
2.Twitter APIを使う~サーバー編~
3.Twitter APIを使う~登録編~
4.Twitter APIを使う~認証編~
5.Twitter APIを使う~プログラミング編~
6.おまけ(製作物)
7.参照リンク
1.Twitter API #とは
API(Application Programming Interface)とは、コンピュータプログラムにおいてその機能やデータ等を利用する為の命令や関数の集合体のことです。
「Twitter API」と書くとTwitterで利用するAPIなんだろうな、というのはお分かりでしょうが、「Twitter API」という表記のみだと基本的にTwitter社が提供しているAPIの総称となります。
Twitter社の公式のAPIであるため当然Twitterの公式アプリ・クライアントでも用いられており、使用した際の挙動が†ほぼ†公式のそれと一致します。あと転がっている情報が多い
(Twitter APIは過去に大きな改修が行われており、現在使うことができるのはREST APIと呼ばれるVar1.1のみです。自己で検索する際は2013年以降の情報をご利用ください)
2.Twitter APIを使う~サーバー編~
インターネット上でWebサービスを利用するにはそのサービスを設置するための場所が必要となります。それがサーバーです。
当然自作サーバーや有料サーバーを利用しても良いのですが、無料で利用できるものもあります。
その際、主に以下の点に気を付けてサーバーを借りれば良いと思います。
・使用したい言語が利用可能であること(PHPが主流だと思います)
・使用したい言語のバージョン(PHPだと5.6.xが現在メイン)
・無料プランと別に有料プランが存在すること(収入源のわからないサービスは突然終了する可能性があります)
3.Twitter APIを使う~登録編~
Twitter APIを使用するためには、Twitterアカウントのログイン情報とAPIを使用するためのアプリケーション情報が必要となります。
それらの取得の為Twitter developersにてデベロッパーの登録を行う必要があります。Twitterをやっていない皆様もTwitterアカウントを作成し、なおかつ電話番号の登録が必要となりますのでご注意を。
Twitter developersにアクセス後、画面上側の「My apps」をクリックし、Twitterアカウントを入力してください。
続いて「Create New App」ボタンをクリック。アプリの製作フォームが開きます。
Name | アプリの名称。被りが無いように上手いことつけてください。ツイートを行った場合のクライアント名はこれが表示されます |
Description | アプリの説明。10字以上で必須です |
Website | 使用ウェブサイト。基本自由でいいと思います。迷ったら借りたサーバーのURLでも |
Callback URL | **[借りたサーバーのURL]/callback.php**と入力してください |
登録が完了したら、上のような画面が出ると思います。上記タブのなかから「Keys and Access Tokens」をクリックしてください。
この画面で表示された「Consumer Key」と「Consumer Secret」がTwitter APIを利用するために必要なキーとなります。Consumer Keyは公開情報ですが、Consumer Secretは自身しか知りえない情報なので取り扱いにはご注意ください。
次の「Access Level」はAPIに与えるアカウントに対する権限を表しています。modify app permissions先のリンクから変更できます。
Read only | TLやプロフィール情報等の読み込みのみができる。 |
Read and write | 上記に加え、投稿・RT・fav・ミュート・ブロック・プロフィール変更等が可能になる。 |
Read, Write and Access direct messages | 上記に加え、DMの読み取りや書き込みが可能になる。 |
Owner,Owner IDはAPI作成者の情報です。Twitterやってないです。
4.Twitter APIを使う~認証編~
TwitterにてAPIを利用するためには、APIを利用したいアカウントとAPI間にてOAuthと呼ばれる認証が必要となります。(OAuth自体についてはこちら)
本来認証の為には色々書かないといけないのですが、PHPならばそのあたりをまとめてくれたライブラリが存在するので、それを使っていきましょう。
上記リンクからClone or download→Download ZIPでファイルをダウンロードし、解凍したファイルの全内容をサーバーにアップロードしてください。
続いて以下のディレクトリをサーバーに作成してください。
・common.php(APIキーの入力)
・login.php(認証画面へのリダイレクト処理)
・callback.php(認証終了後のリダイレクト先)
・main.php(メイン処理部)
common.php
<?php
define( 'CONSUMER_KEY', 'Consumer Keyの値' );
define( 'CONSUMER_SECRET', 'Consumer Secretの値' );
define( 'OAUTH_CALLBACK', 'API作成フォームにて入力したCallback URLのリンク([サーバーのURL]/callback.php)' );
login.php
<?php
session_start();
require_once 'common.php';
require_once './TwitterOAuth/autoload.php'; //この辺りはディレクトリ設定によって適宜変えてください
use Abraham\TwitterOAuth\TwitterOAuth;
//TwitterOAuth をインスタンス化
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
//コールバックURLセット
$request_token = $connection->oauth('oauth/request_token', array('oauth_callback' => OAUTH_CALLBACK));
//callback.phpで使うのでセッションに入れる
$_SESSION['oauth_token'] = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];
//Twitter.com 上の認証画面のURLを取得
$url = $connection->url('oauth/authenticate', array('oauth_token' => $request_token['oauth_token']));
//oauth/authenticateで二回目以降の認証画面がスキップされます。アカウント変更等の為毎回認証画面を出したい場合はoauth/authorizeに変更してください
//Twitter.com の認証画面へリダイレクト
header( 'location: '. $url );
callback.php
<?php
session_start();
require_once 'common.php';
require_once './TwitterOAuth/autoload.php';//この辺りはディレクトリ設定によって適宜変えてください
use Abraham\TwitterOAuth\TwitterOAuth;
//login.phpでセットしたセッション
$request_token = [];
//ここでエラーが出る場合は使用しているサーバーのPHPバージョンが古いため大人しく別のサーバーに乗り換えましょう
$request_token['oauth_token'] = $_SESSION['oauth_token'];
$request_token['oauth_token_secret'] = $_SESSION['oauth_token_secret'];
//Twitterから返されたOAuthトークンと、あらかじめlogin.phpで入れておいたセッション上のものと一致するかをチェック
if (isset($_REQUEST['oauth_token']) && $request_token['oauth_token'] !== $_REQUEST['oauth_token']) { die( 'Error!' ); }
//OAuth トークンも用いて TwitterOAuth をインスタンス化
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $request_token['oauth_token'], $request_token['oauth_token_secret']);
//配列access_tokenにOauthトークンとTokenSecretを入れる
$_SESSION['access_token'] = $connection->oauth("oauth/access_token", array("oauth_verifier" => $_REQUEST['oauth_verifier']));
//セッションIDをリジェネレート
session_regenerate_id();
//リダイレクト
header( 'location: /main.php' );
main.php
<?php
session_start();
require_once 'common.php';
require_once './TwitterOAuth/autoload.php';//この辺りはディレクトリ設定によって適宜変えてください
use Abraham\TwitterOAuth\TwitterOAuth;
//セッションに入れておいたさっきの配列
$access_token = $_SESSION['access_token'];
//OAuthトークンとシークレットも使って TwitterOAuth をインスタンス化
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);
//以下、自分でやりたい動作をさせよう
※エラーが出る場合
Warning: Cannot modify header information - headers already sent by~といったエラーが出る場合、アップロードした.phpのディレクトリの文字コードに問題がある可能性があります。
文字エンコーディングにUTF-8を使用している場合設定により、BOMと呼ばれる0xEF 0xBB 0xBFの3バイト文字が頭に挿入されていることがあります。
このとき、上記ソースにて用いたheader関数に「header関数以前に余計なものを入れてはいけない」という制約があるため、「余計もの」であるBOMに反応してエラーを吐いてしまうのです。
よって、エラーを回避するためにはディレクトリにBOMを入れない設定にする(文字コードをUTF-8Nにするのが殆どだと思います。)必要があります。サーバーのアップローダーにてBOMに関する設定が見当たらない場合、ローカルのファイルにてBOMを入れない設定にした後再度アップロードしてください。
Fatal error: Uncaught exception 'Abraham\TwitterOAuth\TwitterOAuthException' with message~といったエラーが出る場合、Twitter developersのKeys and Access TokensからApplication ActionsのRegenerate Consumer Key and Secretボタンを押しアクセストークンを更新してみてください。common.phpの値の変更もお忘れなく。
5.Twitter APIを使う~プログラミング編~
さていよいよプログラミングを本格的にはじめていく訳ですが、TwitterOAuthライブラリを使用することでAPIを使う際に必要な作業が大幅に軽減されます。
公式のAPIドキュメント(邦訳)から行いたい命令を探し、そのGETとPOSTを確認し、特定の構文に当てはめる。以上です。
試しにアカウントのタイムラインを取得するAPIを使ってみましょう。
使用する命令はstatuses/home_timeline、GET型の命令です。ということでmain.phpの末尾に以下を入力します。
$home = $connection->get('statuses/home_timeline', array('count' => 10));
echo"<pre>";
var_dump($home);
echo"</pre>";
これで実行すると認証を行ったアカウントの最新のタイムラインが10件表示されることになると思います。
[変数名] = $connection->get/post;
の形式に合わせればいいのですね。
そうして取得した情報を変数$homeに入れ、$homeを命令var_dumpにてブラウザ上で表示させています。preタグで囲んでいるのは改行のためと思ってください。
なお、ここで表示された値はいわゆるオブジェクト型のjsonと呼ばれる形式で返されており、個別に要素を取り出す事も可能です。
詳しくはリンクから該当ページを見てもらえれば良いと思うのですが、変数には複数の「オブジェクト型のjson」が配列として格納されていることに注意してください。
さきの例でみると、タイムラインの1番目のユーザー名を変数$usernameに代入したい場合、1番目に取得したツイートは$homeの0番目に格納されているため
$username = $home[0]->user->name;
とする必要があるわけですね。
以上でTwitter APIを作成する際における基礎の基礎は終了です。
皆様が皆様自身の手でよりよいTwitterライフを送れるようになることを楽しみにしています。
6.おまけ
という事で記事作成と並行して製作したTwitter APIを公開します。
リンクは以下からどうぞ(認証画面に飛ぶためご注意ください)。
TwitterBioBlock
使用方法はリンク先のマニュアルをご覧ください。
なんかブロックに関して色々言うつもりでしたけど今回は控えておきます。
一応「プロフィールからヤバい感じが溢れ出ている見ず知らずのアカウントから事前に身を守る」ことを想定しています。
用法を守って安心安全なTwitterライフを送れるように願っております。
7.参照リンク
Twitter APIの使い方まとめ
【PHP】新TwitterOAuthでログイン機能を実装する
PHPでJSONのデータを処理する方法