FacebookのSDKで、自分のアルバムに写真を投稿し、タグ付けする方法

映画「ソーシャルネットワーク」を見て創作意欲が湧き、コードが書きたくなったwatanabeです。

今年はFacebook元年と言われており、Facebookを利用した販促や広告、キャンペーンなどが増えてくるでしょう。
その中でよく使われそうな「アルバムへの投稿」をピックアップして、実装してみました。

今回はFacebookのPHPのSDKを利用します。
https://github.com/facebook/php-sdk/

SDKならソーシャルグラフAPIを使うと便利です。
Graph API Reference

折角なので、FQLも使ってみましょう。
http://developers.facebook.com/docs/reference/fql/

早速、日曜大工的にコードを書いてみたので、見てみましょう。  

クラス

<?php

include('lib/facebook.php');

class MyPhotoAlbumFacebook
{
    const APP_ID = '000000';

    const SECRET = 'xxxxxx';

    var $facebook;

    public function __construct()
    {
        $this->facebook = new Facebook(
                array(
                    'appId'  => self::APP_ID,
                    'secret' => self::SECRET,
                    'cookie' => true,
                    )
                );
    }

    public function login()
    {
        if (!$this->facebook->getSession()) {
            $loginParameters = array(
                    'canvas'    => 1,
                    'fbconnect' => 0,
                    'req_perms' => 'status_update, publish_stream, user_photo_video_tags, friends_photo_video_tags, user_photos, friends_photos'
                    );
            $url = $this->facebook->getLoginUrl($loginParameters);
            echo "<script type='text/javascript'>top.location.href = '$url';</script>"; 
            exit;
        }
        return true;
    }

    public function getFacebook()
    {
        return $this->facebook;
    }

    public function getMe()
    {
        return $this->facebook->api('/me');
    }

    public function postPhoto($source, $message = null, $tags = array())
    {
        $source = '@' . realpath($source);
        try {
            $requestParameters = array(
                    'access_token' => $this->facebook->getAccessToken(),
                    'message'      => $message,
                    'source'       => $source,
                    );
            if ($tags) {
                $requestParameters['tags'] = array($tags);
            }
            $this->facebook->setFileUploadSupport(true);
            $response = $this->facebook->api('me/photos', 'POST', $requestParameters);
        } catch (FacebookApiException $e) {
            throw $e;
        }
        return $response;
    }

    public function getProfilePhoto($uid)
    {
        // use FQL. (http://developers.facebook.com/docs/reference/fql/)
        $fql = 'SELECT pic_big FROM profile WHERE id = ' . $uid;
        $url = 'https://api.facebook.com/method/fql.query?query=' . urlencode($fql);
        $xml = simplexml_load_file($url);
        if (!$xml || !$xml->profile) {
            return false;
        }
        $source = (string)$xml->profile->pic_big;

        // create local file.
        $file = file_get_contents($source);
        $tmpfname = tempnam('/tmp', 'source');
        $handle = fopen($tmpfname, "w");
        fwrite($handle, $file);
        fclose($handle);
        return $tmpfname;
    }
}

コード

こちらのMyPhotoAdbumFacebookクラスを使い、下記のようにコードを書くだけで、
Facebookのアルバムに自分のプロフィールの写真を登録し、自分のタグをつけることができます。

$fb = new MyPhotoAlbumFacebook();
$fb->login();
$me = $fb->getMe();
$source = $fb->getProfilePhoto($me['id']);
$message = 'photo comment.';
$tags = array(
   'tag_text' => $me['name'],
   'tag_uid'  => $me['id'],
   'x'        => 50,
   'y'        => 25,
);
$response = $fb->postPhoto($source, $message, $tags);
print_r($response);

補足

$tags = array( ‘tag_text’ => $me[‘name’], ‘tag_uid’ => $me[‘id’], ‘x’ => 50, ‘y’ => 25, );

XとYはその方向の軸の割合の位置です。
横はセンタリング、縦は4分の1の位置を設定をしています。
もし人の写真だった場合、顔認識技術により自動的に位置が補正されるようです。(ドキュメント未確認)

$source = ‘@’ . realpath($source);

SDKのファイルアップロード機能では、リモートのファイルをアルバムに投稿できないようです。
@をつけたローカルファイルの絶対パスを指定することにより、POSTすることができるようです。

req_perms’ => ‘status_update, publish_stream, user_photo_video_tags, friends_photo_video_tags, user_photos, friends_photos

アプリケーションの認証の際に必要な権限を掲示しますが、そのスコープになります。
今回のケースでは、友達の写真やタグ付けを扱っていないので、friends_photo_video_tagsfriends_photosは不要になります。
下記のドキュメントを確認して、適切なスコープを選択してください。
http://developers.facebook.com/docs/authentication/permissions

サンプル

Manga BusinessCard Maker
http://apps.facebook.com/manga-card-maker/

カヤックのお年賀コンテンツの一つとして、Facebookアプリを作ってみました。
Facebookのプロフィール写真からカンタンに漫画風名刺をつくることができるジェネレーターです。
名刺デザインは、熱血風やお姫様風、KAYACのサービスキャラクターをつかったものなど多数用意しています。
あけましておめでとうございます(遅)

次回予告

次回はFBMLやDialogについて触れようと思います。
若干クセがあるので現状だと使いにくく、慣れが必要かもしれません。
・・・ということで、慣れたらご紹介したいと思います。

 カヤックでは思い立ったらすぐコードが書ける技術者も募集しています!