$api_key , 'oauth_token' => $_GET['oauth_token'] , 'oauth_signature_method' => 'HMAC-SHA1' , 'oauth_timestamp' => time() , 'oauth_verifier' => $_GET['oauth_verifier'] , 'oauth_nonce' => microtime() , 'oauth_version' => '1.0' , ) ; // 配列の各パラメータの値をURLエンコード foreach( $params as $key => $value ) { $params[ $key ] = rawurlencode( $value ) ; } // 連想配列をアルファベット順に並び替え ksort($params) ; // パラメータの連想配列を[キー=値&キー=値...]の文字列に変換 $request_params = http_build_query( $params , '' , '&' ) ; // 変換した文字列をURLエンコードする $request_params = rawurlencode($request_params) ; // リクエストメソッドをURLエンコードする $encoded_request_method = rawurlencode( $request_method ) ; // リクエストURLをURLエンコードする $encoded_request_url = rawurlencode( $request_url ) ; // リクエストメソッド、リクエストURL、パラメータを[&]で繋ぐ $signature_data = $encoded_request_method . '&' . $encoded_request_url . '&' . $request_params ; // キー[$signature_key]とデータ[$signature_data]を利用して、HMAC-SHA1方式のハッシュ値に変換する $hash = hash_hmac( 'sha1' , $signature_data , $signature_key , TRUE ) ; // base64エンコードして、署名[$signature]が完成する $signature = base64_encode( $hash ) ; // パラメータの連想配列、[$params]に、作成した署名を加える $params['oauth_signature'] = $signature ; // パラメータの連想配列を[キー=値,キー=値,...]の文字列に変換する $header_params = http_build_query( $params , '' , ',' ) ; // リクエスト用のコンテキストを作成する $context = array( 'http' => array( 'method' => $request_method , //リクエストメソッド 'header' => array( //カスタムヘッダー 'Authorization: OAuth ' . $header_params , ) , ) , ) ; // cURLを使ってリクエスト $curl = curl_init() ; curl_setopt( $curl , CURLOPT_URL , $request_url ) ; curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ; // メソッド curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書の検証を行わない curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す curl_setopt( $curl , CURLOPT_HTTPHEADER , $context['http']['header'] ) ; // ヘッダー curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数 $res1 = curl_exec( $curl ) ; $res2 = curl_getinfo( $curl ) ; curl_close( $curl ) ; // 取得したデータ $response = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど) $header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ) // [cURL]ではなく、[file_get_contents()]を使うには下記の通りです… // $response = @file_get_contents( $request_url , false , stream_context_create( $context ) ) ; // リクエストが成功しなかった場合 if( !isset( $response ) || empty( $response ) ) { $error = 'リクエストが失敗してしまったようです。Twitterからの応答自体がありません…。' ; } else { // 文字列を[&]で区切る $parameters = explode( '&' , $response ) ; // エラー判定 if( !isset( $parameters[1] ) || empty( $parameters[1] ) ) { $error_msg = true ; } else { // それぞれの値を格納する配列 $query = array() ; // [$parameters]をループ処理 foreach( $parameters as $parameter ) { // 文字列を[=]で区切る $pair = explode( '=' , $parameter ) ; // 配列に格納する if( isset($pair[1]) ) { $query[ $pair[0] ] = $pair[1] ; } } // エラー判定 if( !isset( $query['oauth_token'] ) || !isset( $query['oauth_token_secret'] ) ) { $error_msg = true ; } else { // 各データの整理 $access_token = $query['oauth_token'] ; // アクセストークン $access_token_secret = $query['oauth_token_secret'] ; // アクセストークン・シークレット $user_id = $query['user_id'] ; // ユーザーID $screen_name = $query['screen_name'] ; // スクリーンネーム // 出力する $html = '' ; $html .= '

実行結果

' ; $html .= '

下記の通り、認証情報を取得しました。

' ; $html .= '
' ; $html .= '
アクセストークン
' ; $html .= '
' . $access_token . '
' ; $html .= '
アクセストークン・シークレット
' ; $html .= '
' . $access_token_secret . '
' ; $html .= '
ユーザーID
' ; $html .= '
' . $user_id . '
' ; $html .= '
スクリーンネーム
' ; $html .= '
' . $screen_name . '
' ; $html .= '
' ; } } // エラーの場合 if( isset( $error_msg ) && !empty( $error_msg ) ) { $error = '' ; $error .= 'アクセストークンを取得できませんでした…。セッションが上手く働いていない可能性があります。' ; } } // セッション終了 $_SESSION = array() ; session_destroy() ; } // 「キャンセル」をクリックして帰ってきた時 elseif( isset( $_GET['denied'] ) && !empty( $_GET['denied'] ) ) { // エラーメッセージを出力して終了 echo 'You have rejected the app...Bye...' ; // 何故か昔、迷惑ユーザーをとりあえずYahoo!に飛ばすという謎文化がありました… header( 'Location: http://www.yahoo.co.jp/' ) ; exit ; } /*** [手順1] リクエストトークンの取得 ***/ else { // [アクセストークンシークレット] (まだ存在しないので「なし」) $access_token_secret = '' ; // エンドポイントURL $request_url = 'https://api.twitter.com/oauth/request_token' ; // リクエストメソッド $request_method = 'POST' ; // キーを作成する (URLエンコードする) $signature_key = rawurlencode( $api_secret ) . '&' . rawurlencode( $access_token_secret ) ; // パラメータ([oauth_signature]を除く)を連想配列で指定 $params = array( 'oauth_callback' => $callback_url , 'oauth_consumer_key' => $api_key , 'oauth_signature_method' => 'HMAC-SHA1' , 'oauth_timestamp' => time() , 'oauth_nonce' => microtime() , 'oauth_version' => '1.0' , ) ; // 各パラメータをURLエンコードする foreach( $params as $key => $value ) { // コールバックURLだけはここでエンコードしちゃダメ(よ〜、ダメダメ) if( $key == 'oauth_callback' ) { continue ; } // URLエンコード処理 $params[ $key ] = rawurlencode( $value ) ; } // 連想配列をアルファベット順に並び替える ksort( $params ) ; // パラメータの連想配列を[キー=値&キー=値...]の文字列に変換する $request_params = http_build_query( $params , '' , '&' ) ; // 変換した文字列をURLエンコードする $request_params = rawurlencode( $request_params ) ; // リクエストメソッドをURLエンコードする $encoded_request_method = rawurlencode( $request_method ) ; // リクエストURLをURLエンコードする $encoded_request_url = rawurlencode( $request_url ) ; // リクエストメソッド、リクエストURL、パラメータを[&]で繋ぐ $signature_data = $encoded_request_method . '&' . $encoded_request_url . '&' . $request_params ; // キー[$signature_key]とデータ[$signature_data]を利用して、HMAC-SHA1方式のハッシュ値に変換する $hash = hash_hmac( 'sha1' , $signature_data , $signature_key , TRUE ) ; // base64エンコードして、署名[$signature]が完成する $signature = base64_encode( $hash ) ; // パラメータの連想配列、[$params]に、作成した署名を加える $params['oauth_signature'] = $signature ; // パラメータの連想配列を[キー=値,キー=値,...]の文字列に変換する $header_params = http_build_query( $params , '' , ',' ) ; // リクエスト用のコンテキストを作成する $context = array( 'http' => array( 'method' => $request_method , //リクエストメソッド 'header' => array( //カスタムヘッダー 'Authorization: OAuth ' . $header_params , ) , ) , ) ; // cURLを使ってリクエスト $curl = curl_init() ; curl_setopt( $curl , CURLOPT_URL , $request_url ) ; curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ; // メソッド curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書の検証を行わない curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す curl_setopt( $curl , CURLOPT_HTTPHEADER , $context['http']['header'] ) ; // ヘッダー curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数 $res1 = curl_exec( $curl ) ; $res2 = curl_getinfo( $curl ) ; curl_close( $curl ) ; // 取得したデータ $response = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど) $header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ) // [cURL]ではなく、[file_get_contents()]を使うには下記の通りです… // $response = @file_get_contents( $request_url , false , stream_context_create( $context ) ) ; // リクエストが成功しなかった場合 if( !isset( $response ) || empty( $response ) ) { $error = 'リクエストが失敗してしまったようです。Twitterからの応答自体がありません…。' ; } // 成功した場合 else { // 文字列を[&]で区切る $parameters = explode( '&' , $response ) ; // エラー判定 if( !isset( $parameters[1] ) || empty( $parameters[1] ) ) { $error_msg = true ; } else { // それぞれの値を格納する配列 $query = array() ; // [$parameters]をループ処理 foreach( $parameters as $parameter ) { // 文字列を[=]で区切る $pair = explode( '=' , $parameter ) ; // 配列に格納する if( isset($pair[1]) ) { $query[ $pair[0] ] = $pair[1] ; } } // エラー判定 if( !isset( $query['oauth_token'] ) || !isset( $query['oauth_token_secret'] ) ) { $error_msg = true ; } else { // 本番では出力しない (内容を見たかったら[echo][exit]で見て下さい) $html = '' ; $html .= '

実行結果

' ; $html .= '
' ; $html .= '
oauth_token
' ; $html .= '
' . $query['oauth_token'] . '
' ; $html .= '
oauth_token_secret
' ; $html .= '
' . $query['oauth_token_secret'] . '
' ; $html .= '
' ; /*** [手順2] ユーザーを認証画面に移動させる ***/ // セッション[$_SESSION["oauth_token_secret"]]に[oauth_token_secret]を保存する session_start() ; session_regenerate_id( true ) ; $_SESSION['oauth_token_secret'] = $query['oauth_token_secret'] ; // ユーザーを認証画面へ飛ばす header( 'Location: https://api.twitter.com/oauth/authorize?oauth_token=' . $query['oauth_token'] ) ; // 処理を終了 exit ; } } // エラーの場合 if( isset( $error_msg ) && !empty( $error_msg ) ) { $error = '' ; $error .= 'リクエストトークンを取得できませんでした…。[$api_key]と[$callback_url]、そしてTwitterのアプリケーションに設定している[Callback URL]を確認して下さい。' ; $error .= '([Callback URLに設定されているURL]→' . $callback_url . ')' ; } } } // エラーメッセージがある場合 if( isset( $error ) && $error ) { $html .= '

エラー内容

' ; $html .= '

' . $error . '

' ; } // 検証用にレスポンスヘッダーを出力 [本番環境では不要] $html .= '

取得したデータ

' ; $html .= '

下記のデータを取得できました。

' ; $html .= '

ボディ

' ; $html .= '

' ; $html .= '

レスポンスヘッダー

' ; $html .= '

' ; // アプリケーション連携の解除 $html .= '

アプリケーション連携の解除

' ; $html .= '

このアプリケーションとの連携を解除するには、下記ページより、行なって下さい。

' ; $html .= '

https://twitter.com/settings/applications

' ; ?> Twitter APIで、アクセストークンを取得するサンプルデモ

配布元: Syncer