Twitter APIへcURLを使ってPHPで利用する方法〜request_token編〜
どうも、UT(@ut_1029)です。Webサービスを運営するとTwitterなどのSNS連携することってよくありますよね?今回はPHPでcURLを使ってTwitter APIを利用した時のプログラムを紹介します。

PHPでTwitter APIをググったらライブラリの「abraham/twitteroauth」を使ったサンプルコードの情報が多いですよね。今回はcURLを使って一からPHPでコードを書いたサンプルになります。
Twitter APIを利用するためのDeveloper登録を行う手順は、以前記事に書いたのでご覧ください。
→Twitter APIを利用する方法〜Developer登録〜
Twitter APIについて
Webサイトやアプリから、Twitterの情報にアクセスして取得したり、Twitterへツイートを行ったりすることができるTwitterが提供してくれているシステムです。よくある例としては、Instagramに画像を投稿するとTwitterに自動でツイートする機能が、このTwitter APIを利用しているシステムになります。
TwitterのAPIについて
ウェブやモバイル端末からTwitterにアクセスできます。Twitterにある情報をできるだけ広く共有するために、API (アプリケーション・プログラミング・インタフェイス)を通してTwitterデータにプログラムレベルでアクセスし、企業、開発者、利用者に提供します。
https://help.twitter.com/ja/rules-and-policies/twitter-api
abraham/twitteroauthとは
Twitter APIをPHPで使う時によく使われているライブラリです。サンプルコードの情報も豊富なので、簡単に利用することも出来るライブラリです。
TwitterOAuth
https://twitteroauth.com/
The most popular PHP library for use with the Twitter OAuth REST API.
が、今回はabraham/twitteroauthのライブラリは使いません。
OAuth認証とは
OAuthとは、自分のサイトがTwitterなどの他サービスから情報を利用する許可を得る為の仕組み。といった感じです。
OAuthは、流れがちょっと複雑になっています。図でわかりやすく説明してくれているサイトがあったので紹介しておきます。
→多分わかりやすいOAuth
SNSなどのサービスと連携する際は、このOAuthという仕組みが使われていることが多いので理解していて損はありません。
Twitter APIでツイート出来るまでの流れ
Twitter APIでツイートするまでの流れを簡単に説明します。
- [アプリ]Twitter APIでリクエストトークンを要求
- [アプリ]要求したリクエストトークンを使ってアクセストークンを要求
- [ユーザ]Twitter APIでTwitterアカウントの情報を操作することを承認
- [アプリ]要求したアクセストークンを使ってツイートを行う
こういった流れになります。
前置きが長くなりましたが、実際にコードを書いて理解する方が体感できてわかりやすいと思います。
cURLを使ってPHPでTwitter APIを利用するサンプルコード
実際にTwitter APIを利用するPHPのサンプルコードを紹介します。そのあとにコードの説明を軽く行っていきます。
今回は、Twitter APIのrequest_tokenで、oauth_callbackにoob(out-of-band)を指定するサンプルになります。なので、最後PINコード画面が表示されるところで終わりとします。
Twitter APIでリクエストトークンを要求するサンプルコード
<?php
/**
* request_token
*/
$consumer_key = ''; // Twitter Developer登録でアプリ登録した時の値
$consumer_secret = ''; // Twitter Developer登録でアプリ登録した時の値
$token = ''; // Twitter Developer登録でアプリ登録した時の値
$secret = ''; // Twitter Developer登録でアプリ登録した時の値
$request_method = 'POST';
$request_url = 'https://api.twitter.com/oauth/request_token';
$authorizations = [
'oauth_nonce' => md5(uniqid(rand(), true)),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_timestamp' => time(),
'oauth_consumer_key' => $consumer_key,
'oauth_version' => '1.0',
// 'oauth_callback' => '',
'oauth_callback' => 'oob',
];
// 署名(signature)作成では、アルファベット順にソートする決まり
ksort($authorizations);
/*
* Signature_base_stringを作成
* ・oauth_signatureを作る時のメッセージ部分
*/
$signature_base_string = http_build_query($authorizations, '', '&');
// HTTPメソッドとリクエストトークンURLをURLエンコードして&で繋ぐ
$signature_base_string = _rawurlencode($request_method)
. '&'
. _rawurlencode($request_url)
. '&'
. _rawurlencode($signature_base_string);
/*
* Signature_keyの作成
* oauth_signatureを作る時のキー部分
* oauth_access_secretがあれば"&"の後ろにつける
*/
$signing_key = _rawurlencode($consumer_secret) . '&';
// if ($oauth_access_secret) {
// $signing_key .= _rawurlencode($oauth_access_secret);
// }
/*
* oauth_signatureの作成
*/
$oauth_signature = base64_encode(
hash_hmac('sha1', $signature_base_string, $signing_key, true)
);
$authorizations['oauth_signature'] = $oauth_signature;
/*
* リクエスト準備
*/
// リクエスト用コンテキスト作成
$request_context = [
'http' => [
'method' => $request_method,
'header' => [
'Authorization: OAuth ' . http_build_query($authorizations, '', ',')
]
]
];
/*
* cURL設定
*/
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $request_url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request_context['http']['method']);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// SSL
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
// レスポンスヘッダの出力
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
// Locationヘッダを追跡
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
// HTTPヘッダ
curl_setopt($curl, CURLOPT_HTTPHEADER , $request_context['http']['header']);
if (isset($request_context['http']['content']) && $request_context['http']['content']) {
curl_setopt($curl, CURLOPT_POSTFIELDS , $request_context['http']['content']);
}
// 結果達
$response = curl_exec($curl);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$info = curl_getinfo($curl);
$error = curl_error($curl);
$errno = curl_errno($curl);
// 終了
curl_close($curl);
/*
* cURLの結果
*/
$result = [
'response' => $response,
// cURLでリクエストした結果達
'code' => $code,
'info' => $info,
'error' => $error,
'errno' => $errno,
];
echo "<pre>";
print_r($result['response']);
// cURLリクエストで失敗した時とかは、$resultをprint_rすると原因が分かるかも....
// print_r($result);
echo "</pre>";
if (!$response || $error || $errno || $code != 200) {
echo "<span>";
echo 'Twitter APIのリクエストに失敗';
echo "</span>";
}
echo "<br>";
echo "以下へoauth_tokenを付与してアクセス<br>";
echo "https://api.twitter.com/oauth/authorize?oauth_token=";
exit;
/**
* URLエンコード RFC2986版
*/
function _rawurlencode($str='') {
if (!$str) {
return $str;
}
$result = str_replace(['+', '%7E'], ['%20', '"'], $str);
$result = rawurlencode($result);
return $result;
}
上記のコードを実行するとTwitter APIから以下のようなレスポンスが返ってきます。
oauth_token=*******************&oauth_token_secret=******&oauth_callback_confirmed=true
このレスポンスの"oauth_token=*****“をコピーします。そしてTwitter APIのAuthorize URLへくっ付けてブラウザでアクセスします。
https://api.twitter.com/oauth/authorize?oauth_token=*********

そうすると承認画面が表示されます。ちなみにこの画面で"連携アプリを承認“すると「Twitterアカウントの情報をアプリが取得することに承諾します」という許諾の確認画面になります。
そして"連携アプリを承認“すると、PINコード画面が表示されます。このPINコードを使ってTwitter APIのaccess_tokenでoauth_verifierへPINコードを設定してリクエストすると完了となります。
通常のアプリだとoauth_callbackにoobではなくコールバックURLを指定します。そうすると"連携アプリを承認“した後は、oauth_callbackで指定したURLへ戻ってくるフローとなります。
サンプルコードの解説
$consumer_key = '';
$consumer_secret = '';
$token = '';
$secret = '';
この部分ですが、前回の記事Twitter APIを利用する方法〜Developer登録〜でやったTwitterでDeveloper登録を行い、アプリ登録を行った時に発行される情報であるアプリの情報をセットします。
$authorizations = [
'oauth_nonce' => md5(uniqid(rand(), true)),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_timestamp' => time(),
'oauth_consumer_key' => $consumer_key,
'oauth_version' => '1.0',
// 'oauth_callback' => '',
'oauth_callback' => 'oob',
];
// 署名(signature)作成では、アルファベット順にソートする決まり
ksort($authorizations);
/*
* Signature_base_stringを作成
* ・oauth_signatureを作る時のメッセージ部分
*/
$signature_base_string = http_build_query($authorizations, '', '&');
// HTTPメソッドとリクエストトークンURLをURLエンコードして&で繋ぐ
$signature_base_string = _rawurlencode($request_method)
. '&'
. _rawurlencode($request_url)
. '&'
. _rawurlencode($signature_base_string);
/*
* Signature_keyの作成
* oauth_signatureを作る時のキー部分
* oauth_access_secretがあれば"&"の後ろにつける
*/
$signing_key = _rawurlencode($consumer_secret) . '&';
// if ($oauth_access_secret) {
// $signing_key .= _rawurlencode($oauth_access_secret);
// }
この配列情報は、署名を作成するための情報になります。
/*
* oauth_signatureの作成
*/
$oauth_signature = base64_encode(
hash_hmac('sha1', $signature_base_string, $signing_key, true)
);
$authorizations['oauth_signature'] = $oauth_signature;
そして上記のように署名を作成します。
/*
* リクエスト準備
*/
// リクエスト用コンテキスト作成
$request_context = [
'http' => [
'method' => $request_method,
'header' => [
'Authorization: OAuth ' . http_build_query($authorizations, '', ',')
]
]
];
署名が作成できたので、次にTwitter APIへcURLでリクエストする準備を行います。HTTPリクエストのヘッダをカスタマイズします。
「Authorization: OAuth パラメータ名=値,パラメータ名=値,パラメータ名=値,…」
/*
* cURL設定
*/
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $request_url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request_context['http']['method']);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// SSL
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
// レスポンスヘッダの出力
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
// Locationヘッダを追跡
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
// HTTPヘッダ
curl_setopt($curl, CURLOPT_HTTPHEADER , $request_context['http']['header']);
if (isset($request_context['http']['content']) && $request_context['http']['content']) {
curl_setopt($curl, CURLOPT_POSTFIELDS , $request_context['http']['content']);
}
// 結果達
$response = curl_exec($curl);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$info = curl_getinfo($curl);
$error = curl_error($curl);
$errno = curl_errno($curl);
// 終了
curl_close($curl);
そしてcURLで実行を行います。
参考サイト
Twitter APIをPHPで実装する方法を日本語で紹介してくれている数少ない情報サイトです。Twitter APIをcURLで実装する際にはとても重宝するサイトと思います。
→Twitter REST APIの使い方
最初にも触れましたが、Twitter APIのライブラリを使わない方法でPHPで実装する情報は少ないです。そこで出会った情報がこのサイトでした。サンプルコードを書く際に、参考にしました。
→OAuthをPHPでイチから書いてみた(その1)
ディスカッション
コメント一覧
まだ、コメントがありません