Flickrの承認は、次の3段階で行われます。
1. oauth_tokenおよびoauth_token_secretを取得します。 最初のステップでは、oauth_tokenはrequest_tokenです。
2.ユーザープロファイルでのアプリケーションの承認。
3. oauth_tokenおよびoauth_token_secretを受け取ります。 3番目のステップでは、oauth_tokenはaccess_tokenです。
ステージ1
理由はわかりませんが、この段階で10回のうち2、3回エラーが発生するので、再帰を追加し、エラーがある場合はrequest_tokenを再度要求します。
ボタンをクリックするだけですべてが始まります
$("#flickr_connect").click(function(){ flickrauth(); return false; }); function flickrauth(){ $.ajax({ type: "POST", url: "/auth/flickr.php?type=get_request_token", success: function(result){ var oResult = $.parseJSON(result); if(oResult.oauth_problem == "signature_invalid"){ , flickrauth(); } if(oResult.oauth_callback_confirmed == "true"){ , . flickr.com oauth_token = oResult.oauth_token; location.href = "http://www.flickr.com/services/oauth/authorize?oauth_token="+oauth_token+"&perms=read"; } } }); }
以下は、上記の例で呼び出されたコードです
if($_GET["type"] == "get_request_token"){ $request_token_url = "http://www.flickr.com/services/oauth/request_token"; $oauth_nonce=md5(microtime().mt_rand()); $timestamp = time(); $consumer_key = "676d28f0d2ae990730a3fb232c252a8b"; $consumer_secret = "36b056c53456fef"; $sig_method = "HMAC-SHA1"; $oauth_version = "1.0"; $callback_url = "http://example.com/auth/flickr.php"; $basestring = "oauth_callback=".urlencode($callback_url)."&oauth_consumer_key=".$consumer_key."&oauth_nonce=".$oauth_nonce."&oauth_signature_method=".$sig_method."&oauth_timestamp=".$timestamp."&oauth_version=".$oauth_version; // basestring , . $basestring = "GET&".urlencode($request_token_url)."&".urlencode($basestring); $hash_key = $consumer_secret."&"; // $hash_key $consumer_secret $oauth_signature = base64_encode(hash_hmac('sha1', $basestring, $hash_key, true)); $url = $request_token_url."?oauth_nonce=".$oauth_nonce."&oauth_timestamp=".$timestamp."&oauth_consumer_key=".$consumer_key."&oauth_signature_method=".$sig_method."&oauth_version=".$oauth_version."&oauth_signature=".$oauth_signature."&oauth_callback=".$callback_url; if( $curl = curl_init() ) { curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); $out = curl_exec($curl); $aOut = array(); foreach(explode("&", $out) as $key=>$value){ list($k,$v) = explode("=", $value); $aOut[$k] = $v; if($k == "oauth_token_secret"){ $recent_update = mysql_query("UPDATE users SET oauth_token_secret='".$v."' WHERE user_id=".$_SESSION['user_id']); oauth_token_secret, oauth_signature, access_token } } echo json_encode($aOut); curl_close($curl); } }
ステージ2
最初の段階が完了し、リダイレクトが発生してアプリケーションが承認されます。 ユーザーが「はい」を押すと、別のリダイレクトが発生し、oeth_tokenがまだrequest_tokenおよびoauth_verifierであり、3番目の段階でaccess_tokenを取得する必要があるため、GETに送信されます。
ステージ3
以下はaccess_token取得コードです
if(isset($_GET["oauth_token"])){ $recent_update = mysql_query("UPDATE users SET oauth_verifier='".$_GET['oauth_verifier']."' WHERE user_id=".$_SESSION['user_id']); $recent = mysql_query("SELECT * FROM users WHERE user_id=".$_SESSION['user_id']); $recent_info = mysql_fetch_assoc($recent); $request_token_url = "http://www.flickr.com/services/oauth/access_token"; $oauth_nonce=md5(microtime().mt_rand()); $timestamp = time(); $consumer_key = "676d28f0d2ae990730a3fb232c252a8b"; $consumer_secret = "36b056c53456fef"; $sig_method = "HMAC-SHA1"; $oauth_version = "1.0"; $oauth_token_secret = $recent_info['oauth_token_secret']; $basestring = "oauth_consumer_key=".$consumer_key."&oauth_nonce=".$oauth_nonce."&oauth_signature_method=".$sig_method."&oauth_timestamp=".$timestamp."&oauth_token=".$_GET['oauth_token']."&oauth_verifier=".$_GET['oauth_verifier']."&oauth_version=".$oauth_version; $basestring = "GET&".urlencode($request_token_url)."&".urlencode($basestring); // $hash_key $hash_key = $consumer_secret."&".$oauth_token_secret; $oauth_signature = base64_encode(hash_hmac('sha1', $basestring, $hash_key, true)); $url = $request_token_url."?oauth_nonce=".$oauth_nonce."&oauth_timestamp=".$timestamp."&oauth_verifier=".$_GET['oauth_verifier']."&oauth_consumer_key=".$consumer_key."&oauth_signature_method=".$sig_method."&oauth_version=".$oauth_version."&oauth_token=".$_GET['oauth_token']."&oauth_signature=".$oauth_signature; if( $curl = curl_init() ) { curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); $out = curl_exec($curl); $aOut = array(); foreach(explode("&", $out) as $key=>$value){ list($k,$v) = explode("=", $value); $aOut[$k] = $v; if($k == "oauth_token"){ $recent_update = mysql_query("UPDATE users SET oauth_token='".$v."' WHERE user_id=".$_SESSION['user_id']); } if($k == "oauth_token_secret"){ $recent_update = mysql_query("UPDATE users SET oauth_token_secret='".$v."' WHERE user_id=".$_SESSION['user_id']); } } echo json_encode($aOut); curl_close($curl); } }
ここで取得したoauth_tokenおよびoauth_token_secretは、後続のすべてのリクエストを完了するために必要です。
写真のリストを取得する
FlickrでOAUTH認証を使用する場合、 www.flickr.com / services / apiで説明されている方法は機能しません。 より正確に機能しますが、いくつかの修正が必要です。
以下は、1人のユーザーの写真を一覧表示する例です
// url $request_url = "http://www.flickr.com/services/rest"; $oauth_nonce=md5(microtime().mt_rand()); $timestamp = time(); $consumer_key = "676d28f023e990730a3fbc12c252a8b"; $consumer_secret = "36b05634d0626fef"; $sig_method = "HMAC-SHA1"; $oauth_version = "1.0"; // $oauth_token = "72157630222363050-c9347c35c6f40906"; $oauth_token_secret = "568455560efe6e4e"; $format = "json"; $method = "flickr.photos.search"; $user_id = "22227268@N03"; $basestring = "format=".$format."&method=".$method."&oauth_consumer_key=".$consumer_key."&oauth_nonce=".$oauth_nonce."&oauth_signature_method=".$sig_method."&oauth_timestamp=".$timestamp."&oauth_token=".$oauth_token."&oauth_version=".$oauth_version."&user_id=".$user_id; $basestring = "GET&".urlencode($request_url)."&".urlencode($basestring); $hash_key = $consumer_secret."&".$oauth_token_secret; $oauth_signature = base64_encode(hash_hmac('sha1', $basestring, $hash_key, true)); $url = $request_url."?format=".$format."&method=".$method."&oauth_consumer_key=".$consumer_key."&oauth_nonce=".$oauth_nonce."&oauth_signature_method=".$sig_method."&oauth_timestamp=".$timestamp."&oauth_token=".$oauth_token."&oauth_version=".$oauth_version."&oauth_signature=".$oauth_signature."&user_id=".$user_id; if( $curl = curl_init() ) { curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); $out = curl_exec($curl); echo $out; curl_close($curl); }