mixi engineer blog

*** 引っ越しました。最新の情報はこちら → https://medium.com/mixi-developers *** ミクシィ・グループで、実際に開発に携わっているエンジニア達が執筆している公式ブログです。様々なサービスの開発や運用を行っていく際に得た技術情報から採用情報まで、有益な情報を幅広く取り扱っています。

Facebook Platformを使ってみた

今日は米SNSのFacebookが提供している開発者向けのFacebook Platformに関して語ろうかと思います。もちろん、軽く使い方やサンプルコードなども紹介します。もともとは息抜きに遊び感覚で触ってみたのですが面白くて興奮気味になってしまいました。

そもそもFacebook Platformとは?

Facebook(以後、FB)の持つSNSならではの巨大ソーシャルグラフを利用した第三者のウェブアプリケーション開発を実現した基盤(プラットフォーム)の事です。このプラットフォームを使って開発されたアプリケーションを使っていないFBユーザはいないと言える程、熱い代物です。数多くの有名なウェブ系企業もオフィシャルFBアプリをリリースして参戦してたりしてます。 アプリケーションのスクリプトはFBのサーバでホストするのではなく、開発者側のサーバでホストします。アプリケーションに対するリクエストが生じた際、FBは開発者の指定したリモートのスクリプトを見に行く仕組みになっています。基本構成は簡素で良い感じですね。

使う前の準備

まず、FBが提供しているDeveloper Applicationを自分のFBアカウントにインストールします。次に提供されているClient API Libraryをダウンロードします。この記事を書いた時点で本家がサポートしている言語はPHPとJavaだけですが、非公式の他言語用クライエントライブラリもダウンロードページにて紹介されています。

PHP用のクライエントライブラリアーカイブをダウンロードしたと仮定して、アーカイブをPHPから呼び出せる場所に解凍してあげます。私の場合、アーカイブ内の"client"というディレクトリにしか興味がなかったので、そのディレクトリとファイル達だけを/var/www/html/includesの下に置きました。ちなみにfootprintsというディレクトリの中にはFBが提供しているデモアプリケーションのソースが入ってます。

最後にアプリケーションをDeveloper Applicationから登録してAPI KEYを入手します。この登録は完成したアプリを登録するのではなく、作る前に予め登録するというステップです。登録する課程で色々とフォームを記入する必要がありますが、恐らく悩みの種になるのはCallback URLかと思います。Callback URLにはアプリのスクリプトの場所を指定してあげます(例えば、http://貴方のドメイン/fb/my_fb_app/index.php等)。

アプリの登録が完了したら準備は整いました。

コードを書いてみよう

FB PlatformではFBML(Facebook Markup Language)とFQL(Facebook Query Language)という独自の言語があり、これらを使う事によってFBのデータベースから様々なデータをフェッチします。アプリを開発するには登録したアプリのAPI KEYとSECRET値が必要です。これはDeveloper ApplicationのMy Applicationsというリンクの先に表記されています。不慣れながらPHPでFBMLとFQLを使ったサンプルを書いてみました。 例えば自分の全ての友人の名前をPHPとFBMLでFBから引き出すとしましょう:
<?php 
include_once('/includes/client/facebook.php'); 

$api_key = "foo"; //入手したAPI KEYを使う 
$secret  = "hoge"; //入手したSECRET値を使う 

$facebook = new Facebook($api_key, $secret); 
$facebook->require_frame(); 
$user = $facebook->require_login(); 

// FB APIで友人の配列をフェッチ 
$friends = $facebook->api_client->friends_get(); 
foreach($friends as $friend) { 
    // FBMLを出力する 
    echo "<fb:name uid=\"$friend\"/><br/>"; 
} 
?>
次にFQLで自分の所属しているグループ、グループ紹介文、グループ写真、最新ニュースを引くqueryを調合してFBに投げてみました:
<?php 
$query = " 
    SELECT name, description, pic, recent_news 
    FROM group 
    WHERE gid IN ( 
        SELECT gid FROM group_member WHERE uid = $user 
    ) 
"; 

$result = $facebook->api_client->fql_query($query); 

foreach($result as $rec) { 
    echo "<p>"; 
    echo "<img src=\"$rec[pic]\" /><br/>"; 
    echo "グループ名: $rec[name] <br/>"; 
    echo "紹介文: $rec[description] <br/>"; 
    echo "最近のニュース: $rec[recent_news] <br/>"; 
    echo "</p>"; 
} 
?>
FQLのコードを展開するとこんな感じになりました:

Facebook Platform Example

てな感じで比較的楽にFBからデータを引き出す事が可能です。又、スクリプト自体は自分でホストするためMySQLなどのRDBMSやHyper Estraierなどの検索エンジンを使って複雑なものを作る事も可能です。正直な話、PHPはあまり得意でないので次にやる気が出たらDavid Romanoさんが書かれたPerl用のクライエントライブラリを使ってもうちょっと色々遊んでみようと思います。

思うにこれ、インフラが気になりますよね。きちんと設計しないとcacheうんぬん以前にDisk I/Oにいじめられそう。恐らく比較的に低コストのスレーブを何十台かPlatform用に分けて、そのクラスタに異常が起きても本サービスには影響しない分離された構成にしてるのかなー?と思うのですがどうなんでしょうね?

最後に一言

ユーザが何千万人もいながらこういうエンジニアにしか成し遂げることの出来ない壮大なものを実現してしまうとはエンジニア"魂"を感じますね。世の中にはこういった刺激あるものがどんどん生み出されています。私も取り残されないよう色々と他社のサービスも参考にしながら頑張って面白おかしくmixiと自分をよりよいものにしていきたいと思います。