PHP : Twitter API 認証 : Access Token を取得する

  Twitterアプリケーション を登録して、Access Token を取得する手順



まず、Consumer key と Consumer secret を取得します。

この二つを使って順序良く取り出すだけです。リクエストは GET でも POST でも可能なようですが、
ドキュメントのサンプルが POST なのでそちらで実行しています。https が推奨との事で、その URL
を使用して、リクエストは ヘッダーと POST データとどちらでも動作しましたが、ヘッダーのほうが
よさそうなのでそちらを使っています。

以下の画像は、Acquiring.php を呼び出して最初に表示される画像で、最初のトークンをリクエストしています
( このトークンは呼び出す毎に変化する一時的なものです )

関連する記事

PHP + Twitter API : 資格情報の確認と アプリケーションに割り当てられた My Access Token


Twitter_api1

Acquiring.php
001.<?
002.session_start();
003.// **********************************************************
004.// Acquiring a request token
005.// **********************************************************
006.header( "Content-Type: text/html; Charset=utf-8" );
007.header( "pragma: no-cache" );
008.header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
009.header( "Cache-control: no-cache" );
010. 
011.// **********************************************************
012.// AOuth 用の urlencode 関数
013.// **********************************************************
014.function url_rfc3986( $str ) {
015.    // php 5.3.x ~ ではこの変換は必要無い
016.    return str_replace('%7E', '~', rawurlencode($str));
017.}
018. 
019.// **********************************************************
020.// API ( SSL is recommended )
021.// **********************************************************
022.$twitter_url = 'https://api.twitter.com/oauth/request_token';
023. 
024.// **********************************************************
025.// 認証データ
026.// **********************************************************
027.$oauth_consumer_key = "Consumer key";
028.$oauth_consumer_secret = "Consumer secret";
029.$oauth_token = "";
030.$oauth_secret = "";
031. 
032.// 毎回変化するランダムな文字列
033.$mt = microtime();
034.$rand = mt_rand();
035.$oauth_nonce = md5($mt . $rand);
036. 
037.$oauth_signature_method = "HMAC-SHA1";
038.$oauth_timestamp = mktime();
039. 
040.$oauth_version = "1.0";
041. 
042.// コールバック url
043.$oauth_callback = "http://localhost/web/twitter_api/callback.php";
044. 
045.// *********************************************************
046.// シグネチャ用ベース文字列作成
047./*
048.  httpMethod + "&" +
049.  url_encode(  base_uri ) + "&" +
050.  sorted_query_params.each  { | k, v |
051.      url_encode ( k ) + "%3D" +
052.      url_encode ( v )
053.  }.join("%26")
054.*/
055.// *********************************************************
056.$base_string = "POST";
057.$base_string .= "&" . url_rfc3986($twitter_url);
058.$base_string .= "&";
059. 
060.$base_string .= url_rfc3986("oauth_callback")."%3D".url_rfc3986(url_rfc3986($oauth_callback))."%26";
061.$base_string .= url_rfc3986("oauth_consumer_key")."%3D".url_rfc3986($oauth_consumer_key)."%26";
062.$base_string .= url_rfc3986("oauth_nonce")."%3D".url_rfc3986($oauth_nonce)."%26";
063.$base_string .= url_rfc3986("oauth_signature_method")."%3D".url_rfc3986($oauth_signature_method)."%26";
064.$base_string .= url_rfc3986("oauth_timestamp")."%3D".url_rfc3986($oauth_timestamp)."%26";
065.$base_string .= url_rfc3986("oauth_version")."%3D".url_rfc3986($oauth_version);
066. 
067.// *********************************************************
068.// シグネチャ作成
069./*
070.url_encode( consumer_secret ) + "&" +
071.url_encode( oauth_token_secret || nil )
072.*/
073.// *********************************************************
074.$oauth_signature =
075.base64_encode( hash_hmac(
076.    "sha1",
077.    $base_string,
078.    url_rfc3986($oauth_consumer_secret) . "&",
079.    true
080.));
081. 
082.// *********************************************************
083.// curl 処理
084.// *********************************************************
085.$curl = curl_init();
086.curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
087.curl_setopt($curl, CURLOPT_HEADER, false);
088.curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
089.curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
090.curl_setopt($curl, CURLOPT_URL, $twitter_url);
091.curl_setopt($curl, CURLOPT_POST, 1);
092.curl_setopt($curl, CURLOPT_POSTFIELDS, "");
093. 
094.// *********************************************************
095.// http ヘッダ作成
096.// *********************************************************
097.$header = array();
098.$header[] = 'Expect:';
099. 
100.$header[] = 'Authorization: OAuth '.
101.url_rfc3986("oauth_nonce")."=\"".url_rfc3986($oauth_nonce)."\",".
102.url_rfc3986("oauth_callback")."=\"".url_rfc3986($oauth_callback)."\",".
103.url_rfc3986("oauth_signature_method")."=\"".url_rfc3986($oauth_signature_method)."\",".
104.url_rfc3986("oauth_timestamp")."=\"".url_rfc3986($oauth_timestamp)."\",".
105.url_rfc3986("oauth_consumer_key")."=\"".url_rfc3986($oauth_consumer_key)."\",".
106.url_rfc3986("oauth_signature")."=\"".url_rfc3986($oauth_signature)."\",".
107.url_rfc3986("oauth_version")."=\"".url_rfc3986($oauth_version)."\"";
108. 
109.curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
110. 
111.// *********************************************************
112.// https 用
113.// *********************************************************
114.curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
115.curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
116. 
117.// *********************************************************
118.// 送信
119.// *********************************************************
120.$result = curl_exec($curl);
121. 
122. 
123.// *********************************************************
124.// 結果
125.// *********************************************************
126.print "<br>";
127. 
128.if($result === false) {
129.    echo 'Curl error: ' . curl_error($curl);
130.}
131.else {
132.    echo 'Operation completed without any errors';
133.}
134.curl_close($curl);
135. 
136.print "<br>";
137. 
138.parse_str($result,$arr);
139.print "<pre>";
140.print_r( $arr );
141.print "</pre>";
142. 
143.$_SESSION['oauth_token_secret'] = $arr['oauth_token_secret'];
144. 
145.?>
146.<a href="https://api.twitter.com/oauth/authorize?oauth_token=<?= $arr['oauth_token'] ?>">Twitterで許可</a>





  "/oauth/authorize?oauth_token=最初に取得したトークン" へ移動



表示されたリンクをクリックすると、認証の為に Twitter へ移動します。
( これは、本来はリダイレクトで行います )

Twitter_api2

既にログイン済だと、ボタンだけになりますが、ログインしていない場合は、任意のユーザがログイン
を行って、そのアカウントにアクセスする為のトークンを取得する次の手順に移ります。

許可すると、前回のコードで指定してあった、コールバックの URL へ移動します。
( これは、ブラウザに対するリダイレクトなので、localhost でもかまいません )







  コールバック先の処理

最初は、アクセスするトークンを取得する為の手順中のチェック作業です。
oauth_verifier という確認の為のコードが GET メソッドで送られてくるので、
それをいったん入力フィールドに表示しています。

最初から引き継いでいる一時的な oauth_token と、チェック用の oauth_verifier と、
最初のトークン取得時にセッションに保存しておいた、シークレットトークンの3つを使って、
永続的なアクセストークンの要求を行います

コールバックをテストの為に最初の URL と別にしていますが、
本来は同じにしておいて、再度呼ばれた時はすぐにリクエストトークンを取りに行って
最終的に Twitter に対して行いたい処理を行います。

セッション中は、永続的なアクセストークンを保存しておけば、認証の必要もありませんし、
クッキーや外部ファイルやデータベースに保存すると、ユーザが Twitter でアプリケーション
の利用を解除するまでずっとアカウントの委譲が継続する事になります


Twitter_api3

Twitter_api4


callback.php
001.<?
002.session_start();
003.header( "Content-Type: text/html; Charset=utf-8" );
004.header( "pragma: no-cache" );
005.header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
006.header( "Cache-control: no-cache" );
007.// **********************************************************
008.// AOuth 用の urlencode 関数
009.// **********************************************************
010.function url_rfc3986( $str ) {
011.    // php 5.3.x ~ ではこの変換は必要無い
012.    return str_replace('%7E', '~', rawurlencode($str));
013.}
014. 
015.print "<pre>";
016.print_r( $_GET );
017.print_r( $_SESSION );
018.print "</pre>";
019. 
020.if ( $_SERVER['REQUEST_METHOD'] != 'POST' ) {
021.// 以下初期画面
022.?>
023. 
024.<form method="POST">
025.<input type="submit" value="送信"><br>
026. 
027.oauth_token :
028.<input
029.    type="text"
030.    name="oauth_token"
031.    value="<?= $_GET['oauth_token'] ?>"
032.    size="80"
033.><br>
034.oauth_verifier :
035. 
036.<input
037.    type="text"
038.    name="oauth_verifier"
039.    value="<?= $_GET['oauth_verifier'] ?>"
040.    size="80"
041.><br>
042. 
043.oauth_token_secret :
044.<input
045.    type="text"
046.    name="oauth_token_secret"
047.    value="<?= $_SESSION['oauth_token_secret'] ?>"
048.    size="80"
049.><br>
050. 
051.</form>
052. 
053.<?
054.    exit();
055.}
056. 
057.//***********************************************************
058.// Exchanging a request token for an access token
059.//***********************************************************
060. 
061.// **********************************************************
062.// API ( SSL is recommended )
063.// **********************************************************
064.$twitter_url = 'https://api.twitter.com/oauth/access_token';
065. 
066.// **********************************************************
067.// 認証データ
068.// **********************************************************
069.$oauth_consumer_key = "Consumer key";
070.$oauth_consumer_secret = "Consumer secret";
071.$oauth_token = $_POST['oauth_token'];
072.$oauth_secret = $_POST['oauth_token_secret'];
073. 
074.// 毎回変化するランダムな文字列
075.$mt = microtime();
076.$rand = mt_rand();
077.$oauth_nonce = md5($mt . $rand);
078. 
079.$oauth_signature_method = "HMAC-SHA1";
080.$oauth_timestamp = mktime();
081. 
082.$oauth_version = "1.0";
083. 
084.// *********************************************************
085.// シグネチャ用ベース文字列作成
086./*
087.  httpMethod + "&" +
088.  url_encode(  base_uri ) + "&" +
089.  sorted_query_params.each  { | k, v |
090.      url_encode ( k ) + "%3D" +
091.      url_encode ( v )
092.  }.join("%26")
093.*/
094.// *********************************************************
095.$base_string = "POST";
096.$base_string .= "&" . url_rfc3986($twitter_url);
097.$base_string .= "&";
098. 
099.$base_string .= url_rfc3986("oauth_consumer_key")."%3D".url_rfc3986($oauth_consumer_key)."%26";
100.$base_string .= url_rfc3986("oauth_nonce")."%3D".url_rfc3986($oauth_nonce)."%26";
101.$base_string .= url_rfc3986("oauth_signature_method")."%3D".url_rfc3986($oauth_signature_method)."%26";
102.$base_string .= url_rfc3986("oauth_timestamp")."%3D".url_rfc3986($oauth_timestamp)."%26";
103.$base_string .= url_rfc3986("oauth_token")."%3D".url_rfc3986($oauth_token)."%26";
104.$base_string .= url_rfc3986("oauth_verifier")."%3D".url_rfc3986($_POST['oauth_verifier']);
105.$base_string .= url_rfc3986("oauth_version")."%3D".url_rfc3986($oauth_version);
106. 
107.// *********************************************************
108.// シグネチャ作成
109./*
110.url_encode( consumer_secret ) + "&" +
111.url_encode( oauth_token_secret || nil )
112.*/
113.// *********************************************************
114.$oauth_signature =
115.base64_encode( hash_hmac(
116.    "sha1",
117.    $base_string,
118.    url_rfc3986($oauth_consumer_secret) . "&" . url_rfc3986($oauth_secret),
119.    true
120.));
121. 
122.// *********************************************************
123.// curl 処理
124.// *********************************************************
125.$curl = curl_init();
126.curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
127.curl_setopt($curl, CURLOPT_HEADER, false);
128.curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
129.curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
130.curl_setopt($curl, CURLOPT_URL, $twitter_url);
131.curl_setopt($curl, CURLOPT_POST, 1);
132.curl_setopt($curl, CURLOPT_POSTFIELDS, "");
133. 
134.// *********************************************************
135.// http ヘッダ作成
136.// *********************************************************
137.$header = array();
138.$header[] = 'Expect:';
139.$header[] = 'Authorization: OAuth '.
140.url_rfc3986("oauth_consumer_key")."=\"".url_rfc3986($oauth_consumer_key)."\",".
141.url_rfc3986("oauth_nonce")."=\"".url_rfc3986($oauth_nonce)."\",".
142.url_rfc3986("oauth_signature_method")."=\"".url_rfc3986($oauth_signature_method)."\",".
143.url_rfc3986("oauth_timestamp")."=\"".url_rfc3986($oauth_timestamp)."\",".
144.url_rfc3986("oauth_token")."=\"".url_rfc3986($oauth_token)."\",".
145.url_rfc3986("oauth_verifier")."=\"".url_rfc3986($_POST['oauth_verifier'])."\",".
146.url_rfc3986("oauth_signature")."=\"".url_rfc3986($oauth_signature)."\",".
147.url_rfc3986("oauth_version")."=\"".url_rfc3986($oauth_version)."\"";
148. 
149.curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
150. 
151.// *********************************************************
152.// https 用
153.// *********************************************************
154.curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
155.curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
156. 
157.// *********************************************************
158.// 送信
159.// *********************************************************
160.$result = curl_exec($curl);
161. 
162.// *********************************************************
163.// 結果
164.// *********************************************************
165.print "<br>";
166. 
167.if($result === false) {
168.    echo 'Curl error: ' . curl_error($curl);
169.}
170.else {
171.    echo 'Operation completed without any errors';
172.}
173.curl_close($curl);
174. 
175.print "<br>";
176. 
177.parse_str($result,$arr);
178.print "<pre>";
179.print_r( $arr );
180.print "</pre>";
181. 
182.?>

関連する記事

 PHP+VBS : デスクトップ/Twitterへのアクセス準備
 PHP : TwitterAPI : Access Token取得
 PHP : TwitterAPI : 資格情報の確認
 PHP + Twitpic API v2 で画像アップロード
 VBScript : Twitpic に画像をアップロード
 VBScript : Picasa へ画像ファイルをアップロード
 VBScript : ココログマイフォトに画像アップロード
 PHP : bit.ly を使用した専用短縮URLサービス作成
 PHP : Google ドキュメントのセルのAPI更新
 PHP+Zend : Picasa APIアップロード
 PHP : cURL でFTPESダウンロード
 PHP : CodeIgniter+TwitterAPI投稿
 VBScript : Twitter API を呼び出して投稿する
 VBScript でバッチ twitter 投稿
 VBScript でバッチ mixi ボイス投稿
 Python3.1 : mixi ボイスへ投稿
 VBScript : Seesaaの禁止ワード一括登録
 VBScript : Seesaaブログのエクスポート
 VBScript : XML-RPC で Seesaa に投稿
 VBScript : 手書きブログAPIで画像ダウンロード
 Ruby+Mechanize : Twitter 投稿
 Ruby+Mechanize : Seesaa最新情報更新
 Ruby+Mechanize : Seesaaアクセス解析情報













   SQLの窓    create:2010/05/19  update:2018/02/18   管理者用(要ログイン)





フリーフォントWEBサービス

SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ