« 02.06 ハッカソンに初参加 | ココ | 02.11 FQLでいいね!取り »

2011年2月 9日

Facebook Graph API でいいね!取り   このエントリーを含むはてなブックマーク 

さて、前回家に帰ってからうまくいかなくなってしまったAPIでのアクセス、とりあえずできるようになったので。AKB48で学ぶFacebookアプリとファンページの連携方法 (ref. web探検隊)を参考にしたことは、書いた通り。


<?php

require_once 'facebook-php-sdk/src/facebook.php';

// Create our Application instance.
$facebook = new Facebook(array(
  'appId' => 'xxxxxxxxxxxxx',
  'secret' => 'xxxxxxxxxxxxx',
  'cookie' => false,
));

$session = $facebook->getSession();
if (!$session) {
  $url = $facebook->getLoginUrl(array(
    'canvas' => 0,
    'fbconnect' => 0,
    'next' => 'http://localhost/h/', // 遷移先(ここではlocalhost)
    // offline_accessオフラインでのアクセス許可
    'req_perms' => 'offline_access,user_status,read_stream,user_likes,friends_likes'
  ));
  // アプリ未登録ユーザーなら facebook の認証ページへ遷移
  echo "<script type='text/javascript'>top.location.href = '$url';</script>";
  exit();
}

$me = $facebook->api('/me');

?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
  <head>
    <title>php-sdk</title>
    <style>
      body {
        font-family: 'Lucida Grande', Verdana, Arial, sans-serif;
      }
      h1 a {
        text-decoration: none;
        color: #3b5998;
      }
      h1 a:hover {
        text-decoration: underline;
      }
    </style>
  </head>
  <body>
    <h3>You</h3>
    <img src="https://graph.facebook.com/<?php echo $me['id']; ?>/picture">
    <?php echo $me['name']; ?>

    <h3>Your User Object</h3>
    <pre><?php print_r($session); ?></pre>

  </body>
</html>

http://localhost/h/index.phpを↑のようにすると、最初にhttp://localhost/h/にアクセスしたときに認証を求める↓のようになる。

ここで、作業を落ち着いてできるように、そして今後バックグラウンドで処理することを考慮して、オフラインでのアクセス許可(offline_access)を要求するPermissionに含めておく。すると、画面上では赤で囲んだように出てくる。

許可すると、今後アクセスするために必要となるaccess_tokenを含むセッション情報が画面に表示されるのでコピる。

<?php

require_once 'facebook-php-sdk/src/facebook.php';

// Create our Application instance.
$facebook = new Facebook(array(
  'appId' => 'xxxxxxxxxxxxx',
  'secret' => 'xxxxxxxxxxxxx',
  'cookie' => false,
));

// さっき取ってきたアクセストークン
$access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";

// FB APIで友人の配列を取得
$friends = $facebook->api('/me/friends','GET',array('access_token'=>$access_token));
// FB APIで自分の投稿を取得
$myposts = $facebook->api('/me/posts','GET',array('access_token'=>$access_token));

$like_users = array();
$like_user_ids = array();

?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
  <head>
    <title>php-sdk</title>
    <style>
      body {
        font-family: 'Lucida Grande', Verdana, Arial, sans-serif;
      }
      h1 a {
        text-decoration: none;
        color: #3b5998;
      }
      h1 a:hover {
        text-decoration: underline;
      }
    </style>
  </head>
  <body>
    <h3>You</h3>
    <img src="https://graph.facebook.com/<?php echo $me['id']; ?>/picture">
    <?php echo $me['name']; ?>

    <h3>Your posts</h3>

    <?php foreach ($myposts['data'] as $post) { ?>
      <h4><?php echo $post['id']; ?> : <?php echo $post['message']; ?></h4>
      <pre>
      <?php
        // FB APIで投稿についての「いいね!」しているユーザーを取得
        $likes = $facebook->api($post['id']."/likes",'GET',
                  array('access_token'=>$access_token));
        foreach ($likes['data'] as $like) {
          if (!$like_users[$like['name']]) {
            $like_users[$like['name']] = 1;
            $like_user_ids[$like['name']] = $like['id'];
          } else {
            $like_users[$like['name']]++;
          }
          echo $like['name']." ";
        } ?></pre>
    <?php } ?>

  </body>
</html>

新しくPHPファイルを↑のように作ることで、↓のようなアクセス結果が得られる、と(これを前回出したかった!!)。

そして、$like_usersには(name => like数)、$like_user_idsには(name => user_id)が格納されるので、あとはこいつらを利用すると。けど…これは意外と遅い。そりゃ、投稿ごとに1回1回API呼び出してるんやから、意外というほどのことでもないけど。

まぁ、とりあえずこれで目的は達成したので今回はここまで。

前回のエラーののち、どうやって復旧させたかについて、メモ。どうも、Facebook APIでは、一度確立しているセッション($facebook->getSession())は、$facebook->getLogoutUrl(array('session_key' => $session['session_key']))とかやっても、セッションをリセットできないらしい…何度やっても、オフラインアクセスを有効にしている状態では同じアクセストークンが返ってきてしまうという、なんという仕様(FBアプリのシークレットコードを変更しても無駄だった)。

なので、アクセストークンをリセットするためには、ユーザー側でアプリを削除しないといけなかった。しかもその場所がややこしい。

左から、「アカウント>プライバシー設定」、「アプリ・ゲーム・ウェブサイト」、「利用しているアプリ」、赤で囲んだところをクリックしていくと見れるわけやけど…これ絶対見つけにくい。ここから、自分で作ったアプリを削除すると、セッション情報がきれいさっぱりなくなる。

By ただ at 21:02 カテゴリー ; PinMarch Samples , プログラミング単語帳 , プログラミングとか

« 02.06 ハッカソンに初参加 | 02月の記事 | 02.11 FQLでいいね!取り »




トラックバック

このエントリーのトラックバックURL:
http://pinmarch.sakura.ne.jp/mt/mt-tb.cgi/1715

このリストは、次のエントリーを参照しています: Facebook Graph API でいいね!取り:

» replica montre rolex submariner from replica montre rolex submariner
We won my mum over to computers with spreadsheets and online banking (because...

トラックバック時刻: 2015年9月20日 19:16