第1回で書いた方法の場合(参考:Facebookのアカウントを利用してユーザ登録、ログインページを作成する(OAuth認証)(第1回))、ユーザの名前は英語名しか取得できません。scopeを変更することで日本語名を取得できるものだと思っていましたが、色々試してみても取得できませんでした。そこで見つけたのがFQL(Facebook Query Language)です。データベースを扱うSQL(Structured Query Language)のFacebook版です。
認証プログラムのことを書いていますので、SQLはご存知だと思いますのでFQLはすぐに理解できると思います。ワイルドカードが使えなかったり、幾つか制限はあるようですが、テーブル構成なども一覧でありますので難しくありません。
FQLのページにユーザ名を取得する例が書かれています。
SELECT name FROM user WHERE uid = me()
これをどうやって実行するか、結果がどうなるのか気になるところだと思いますので、実際に上記のクエリを実行できるページ(テストコンソールが用意)で実行してみてください。上記のクエリを「query」に入力し、「コールメソッド」ボタンをクリックします。
テストコンソールの右側に下記のような結果が表示されます。
[ { "name": "Takahito Kikuchi" } ]
このuserテーブルにローカライズした情報が含まれているのかをチェックしましたが、特にそのようなフィールドを見つけることができませんでした。
同じようなテーブルとしてprofileというものがあります。ここでもnameというフィールドがありますので試してみます。テストコンソールで「query」に下記のクエリを入力し、「コールメソッド」ボタンをクリックします。
SELECT name FROM profile WHERE id = me()
結果は下記のように日本語が返ってきました。日本語を登録していない場合は英語のままで返ってくると思いますので、このクエリを使ってユーザの名前を取得するのが良いでしょう。
[ { "name": "菊地 崇仁" } ]
日本語名を取得するクエリは作成できましたので、これをプログラムに組み込んでみます。先ほどのテストコンソールの右側に結果が表示され、その上にURLが表示されています。
https://api.facebook.com/method/fql.query?query=SELECT%20name%20FROM%20profile%20WHERE%20id%20%3D%20me()&access_token=...
query=という箇所はFQLのエンコードしたものが入っています。access_token=…となっている…の部分は変数です。先日のサンプルコードでaccess_tokenは取得していますので、こちらのURLにaccess_token($params[‘access_token’])を付与してアクセスすれば良さそうです。先日のサンプルを少し修正してみます。「ここから、ここまで」という箇所が追加したものです。それ以外は変更していません。
<?php $app_id = "YOUR_APP_ID"; $app_secret = "YOUR_APP_SECRET"; $my_url = "YOUR_URL"; session_start(); $code = $_REQUEST["code"]; if(empty($code)) { $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" . $_SESSION['state']; echo("<script> top.location.href='" . $dialog_url . "'</script>"); } if($_REQUEST['state'] == $_SESSION['state']) { $token_url = "https://graph.facebook.com/oauth/access_token?" . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&client_secret=" . $app_secret . "&code=" . $code; $response = file_get_contents($token_url); $params = null; parse_str($response, $params); $graph_url = "https://graph.facebook.com/me?access_token=" . $params['access_token']; $user = json_decode(file_get_contents($graph_url)); print_r ($user); // echo("Hello " . $user->name); // ここから $fql = "https://api.facebook.com/method/fql.query?query=SELECT%20name%20FROM%20profile%20WHERE%20id%20%3D%20me()&access_token=" . $params['access_token']; $userxml = simplexml_load_file (rawurlencode ($fql)); print_r ($userxml); // ここまで } else { echo("The state does not match. You may be a victim of CSRF."); } ?>
上記の変更をし、先日の「3-3.ブラウザから認証ページにアクセス」のURLをブラウザに入れてアクセスすると、設置したredirect_urlのページに日本語名が表示されるはずです。print_r ($userxml)をecho $userxml->profile->nameに変更するとユーザの日本語名だけを取得できます。
ピンバック:Facebookのウォールにアプリから投稿する方法 | 菊地崇仁ブログ「ポイ探社長のブログ」
ピンバック:Googleのアカウントを利用してユーザ登録、ログインページを作成する(OAuth認証) | 菊地崇仁ブログ「ポイ探社長のブログ」