PHPでFacebookアプリ作ってみた(2)

※この記事の情報は古いです。
現在はFacebook API v2.0になっており、一部権限で申請と承認が必要になっています。
詳しくは、Facebook APIの仕様がかわったFacebook APIの承認がおりましたを御覧ください。

さて、第2回目です。
実際にFacebook APIを呼び出して使ってみましょう。
Facebook APIを使うことによって、ウォール投稿やユーザー情報の取得などを簡単に実装できます。

2012/03/18 0:40追記

ウォール投稿のサンプルが間違っていたので修正しました。
申し訳ないっ!

2013/04/16 1:20追記

エラー発生時にエラーメッセージを表示するように修正しました。


前回はディベロッパー登録とアプリ登録でほとんど終わってしまっていたので、今回はPHPからAPIを使ってみよう編です。

ユーザー情報取得API

Facebookアプリというくらいですから、Facebookからユーザーの情報を取得できて当然ですね。
この機能を知るだけでFacebookを利用した会員登録の仕組みなんかは作れちゃったりします。

まず、前回ご紹介したFacebook SDKを用意します。
持っていない方は→Facebook SDK
ダウンロードして解凍しておいてください。

ユーザー情報の取得はFacebookクラスを作っておけば、以下の1行で行えます。

<?php
$user_profile = $facebook->api('/me','GET');
?>

簡単です。
裏で行われることを簡単にまとめると、

  1. Facebookクラスがユーザーのアクセストークンを取得
  2. そのアクセストークンをもとにhttps://graph.facebook.com/me/にGET送信
  3. かえってきたデータを連想配列の形で$user_profileに代入

こんな感じ。

ログイン処理とかも含めて、全体的なコードはこんな感じ。

<?php
//FacebookSDKを読み込む
//自分の設置したパスを指定
require_once("./src/facebook.php");

// appId と secret は「マイアプリ」のページで確認できます
// https://www.facebook.com/developers/apps.php
$facebook = new Facebook(array(
	'appId' => '***************',
	'secret' => '*************************',
));
//ログイン状態を取得
$user_id = $facebook->getUser();
?>
<html>
<head></head>
<body>
<?php
if($user_id) {
	//ログインしている場合
	try {
		//ユーザー情報取得
		$user_profile = $facebook->api('/me','GET');
		//出力
		print_r($user_profile);
	} catch(FacebookApiException $e) {
		//エラー発生時
		echo 'エラー発生!!<br>';
		echo $e->getMessage();
		//エラーログの書き出し
		error_log($e->getType());
		error_log($e->getMessage());
	}   
} else {
	//ログインしていない場合
	//ログインURL取得
	$login_url = $facebook->getLoginUrl();
	echo '<a href="' . $login_url . '">ログイン</a>してね。<br />';
}
?>

とても簡単にいろんな情報にアクセスできちゃいますね。
悪用厳禁です!笑

ウォール投稿API

さー、面白くなってきませんか?
ウォール投稿も同様に簡単に実装できます。

ただ一つ注意点があります。
ログインURLを取得する際に引数にscopeというものを設定します。

$login_url = $facebook->getLoginUrl(
	array(
		'scope' => 'publish_stream'
	));

スコープの設定はこのように指定します。
これは、なぜ設定したかというと、アプリの権限設定を事前に行い、ユーザーがアプリを利用する際に「どの情報にアクセスされる恐れがあるのか」という情報として提供されます。
これにより、ユーザーはアプリが何をするのかがわかり、不用意にアプリを許可してしまうということを防ぐことができます。

アプリ側もこの設定をしない限りその権限は与えられないのでご注意ください。

では、本題に戻って投稿のAPI呼び出し部分です。

$ret_obj = $facebook->api(
	'/me/feed',
	'POST',
	array(
		'link' => 'blog.zolesystem.info',
		'message' => 'えー本日はお日柄もよく…みなさんいかがお過ごしでしょうか?'
	));

このコードを記述することでユーザーさんのFacebookのウォールへ投稿ができます。
※linkの指定は必須ではありません。
簡単ですね。

こちらもログイン処理から投稿までをまとめるとこのようになります。

<?php
//FacebookSDKを読み込む
//自分の設置したパスを指定
require_once("./src/facebook.php");

// appId と secret は「マイアプリ」のページで確認できます
// https://www.facebook.com/developers/apps.php
$facebook = new Facebook(array(
	'appId' => '***************',
	'secret' => '*************************',
));
//ログイン状態を取得
$user_id = $facebook->getUser();
?>
<html>
<head></head>
<body>
<?php
if($user_id) {
	//ログインしている場合
	try{
	//ユーザー情報を取得
	$user_profile = $facebook->api('/me','GET');
	//ユーザーの名前を表示
	echo "ようこそ!" . $user_profile['name'] ."さん!";
	// メッセージが投稿されたときは Facebook に送信
	if(isset($_POST['message'])) {
		$facebook->api(
			'/me/feed','POST',
			array(
			'message' => $_POST['message'],
			));
		echo "投稿が完了しました!";
	}else{
		//投稿フォーム
		echo "<form action='' method='POST'>
		<input type='text' name='message' /><br />
		<input type='submit' value='投 稿' />
		</form>";
	}
	}catch(FacebookApiException $e){
		//エラー発生時
		echo 'エラー発生!!<br>';
		echo $e->getMessage();
		//エラーログの書き出し
		error_log($e->getType());
		error_log($e->getMessage());
	}
}else{
	//ログインしていない場合
	//ログインURL取得
	$login_url = $facebook->getLoginUrl(
		array('scope' => 'publish_stream'));
	echo '<a href="' . $login_url . '">ログイン</a>してね。<br />';
}
?>
</body>
</html>

とても簡単にウォール投稿までが実装できてしまいました。
まだまだいじれるAPIはたっくさんありますよ〜
では、また次回。

    • 松岡
    • 2013 04/15 6:17pm

    はじめまして。
    こちらのページを参考にしてfacebookのアプリを作成してます。
    大変勉強になりました。
    ありがとうございます。

    ひとつ質問なのですが、facebookにPCでアクセスすると$user_profileが正常に取得できるのに、iPhoneで同じページにアクセスすると取得できないという症状に悩まされています。
    ログインできているかの判定を乗り越えているので、ログインはできているはずなんですが、$user_profileの取得が出来ず、その為かウォールへの投稿もiPhoneから行うとエラーが出てしまいます。
    どういった事が原因なんでしょうか?

      • yu29ozaki
      • 2013 04/16 1:25am

      ありがとうございます。
      いただいた情報のみでは原因を突き止めることはできないのですが、エラー発生時にはfacebookからエラー値が帰ってきます。
      $_GET[‘error’]に値が入っているかもしれないので確認してみてください。
      あと、access_tokenがないと情報が取得できないことが稀にあるようです。
      $access_token = $facebook->getAccessToken();
      で取得して、
      $user_profile = $facebook->api(‘/me’, array(‘locale’ => ‘ja_JP’,’access_token’=>$access_token));
      こんな感じで取得してみてください。

    • トラ
    • 2013 10/02 7:37pm

    はじめまして。

    参考にさせていただいています。

    サンプルをxamppで実行したところ、
    投稿の権限がない。という風にエラーが出てくるのです

    投稿ボタンまではスムーズに動作するのですが、
    投稿ボタンを押下したら、下記のエラーが出てしまうのです。

    どうすることで回避出来るのかが、不明なのでご教授願えませんでしょうか?

    「(#200) The user hasn’t authorized the application to perform this action」

      • yu29ozaki
      • 2013 10/02 11:53pm

      コメントありがとうございます。
      原因はいくつか考えられるのですが、

      1. ログインURLの取得時にpublish_streamの権限スコープを設定していない。一度セッションを削除して、スコープを設定しなおして再度お試し下さい。
      2. FacebookのDeveloperサイトでAppを登録する際にwebアプリの場合URLドメインを登録するよう言われることがあります。このドメインと実際のアクセス(今回の場合XAMPPなのでIPアドレスだと思います)が異なっている場合に認証を弾いてしまうことがあります。

      ログインURL取得
      $login_url = $facebook->getLoginUrl(array('scope' => array('publish_stream','status_update')));

    • トラ
    • 2013 10/03 3:50pm

    返信・アドバイスありがとうございます。
    上記のうち

    1.スコープは修正しました。
    2.127.0.0.1に合わせました。

    そうすると自分の端末のxamppから書き込みが出来ました。

    ですが、
    レンタルサーバにupし、実行したのですが、その時は同じエラーになってしまいます。
    サーバの設定などがおかしいのでしょうか??

    • トラ
    • 2013 10/03 4:12pm

    度々失礼します。
    facebookアプリを作成したいと思って今勉強しているのですが、

    1)developersのところでアプリを登録(アドレスなどうんぬんかんぬん)
    2)ローカルで動くことと確認
    3)レンタルサーバへアップ(設定などは完了として)
    4)アプリの詳細ページを登録 という処理をfacebookで行うことではじめて
      アプリとして承認されると思って良いのでしょうか?

    キャンパスページのアドレスをクリックしても「接続がリセットされました」と
    なるのです。

    基本的にしたいことは、「facebookページ」にアプリを載せて
    「いいね」を押してもらってアプリを実行してもらいウォールへ投稿。
    という一般的なものを作りたいと思っています。

    でもまず基本から、ということでこのサイトを参考にさせていただいている。
    ということなのです。

      • yu29ozaki
      • 2013 10/03 5:00pm

      ぼくは普段、ローカルでの確認は飛ばしてます。
      なので、

      1. アプリケーションをサーバーにアップ
      2. Facebookでアプリ登録
      3. 細かい設定をして完了!

      こんなかんじです。1と2は順不同です。アプリケーション登録しないとアプリは完成しないし、アップロードしてURLを確定させないとアプリの設定ができないので…。
      さて、設定ですが、『127.0.0.1』では正しく参照されないので、取得されたドメイン(hogehoge.comのようなもの)またはサーバーのグローバルIPアドレスが必要になります。

      Facebookアプリ登録

      Facebookページ内でアプリを表示させるためには、サーバー側で用意したスクリプト(PHPファイル)のURLをFacebookに登録しなければなりません。
      上記画像中の「App Domains」にはアクセスを許可するドメインを全て書きます。
      例えば、このブログサイトであれば「blog.zolesystem.info」になります。
      この設定が間違っていると投稿ができなかったり、ユーザー情報が取得できないなどの問題が起こることがありますので注意が必要です。

      ページのいいねを取得する方法は


      $data = $facebook->getSignedRequest();
      $page_liked = (!empty($data)) ? $data['page']['liked'] : false;
      if($page_liked){
      echo 'いいねしてくれてありがとう。';
      }else{
      echo 'ぜひ、いいねしてね。';
      }

      まえにアプリ作ったときはこれだけで出来てたんだけど、どうなんだろう…。
      ちなみにFacebookの埋め込みの時だけページ情報が送られてくるので、通常のアクセスではイイネしているかどうかわかりません。

      ながながと書いてしまいましたが、わからなことがあれば言ってください。
      ブログ更新は滞っていますが、時間あるときにコメントは見ますので。

        • トラ
        • 2013 10/04 5:09pm

        ご返信ありがとうございます。

        ローカルでの確認はしていない。
        ということは、xamppなどでは確認していない。ってことですよね?

        確認しているアドレスでいうと、

        1)アプリケーションをサーバーにアップ

          → レンタルサーバなどのことですよね?

        2)Facebookでアプリ登録

          →facebookページことですよね?

           https://apps.facebook.com/xxxxxxxx/

           のことですよね?

        今サンプルから改良をしていって、
        「いいね」を確認しているのですが、
        1)の場合、単純に「いいねを押してね」と表示が出てきます。
        もちろん、レンタルサーバのアドレスから起動しているため、
        facebookの画面はでていないため、こうなるかな・・と

        2)の場合、まだ、登録されていないためかわからないのですが、
          ”接続がリセットされました。”とメッセージが出てきてしまうのです。
          (facebookの画面でiframeで出てくるイメージ)

        今現在としてfacebookデベロッパーズ内の基本設定で
        facebook上のアプリは”http://apps.facebook.com/xxxxxxx”
        となっています。(基本データのNamespaceを設定しているため?)

        キャンパスURLは、レンタルサーバのアドレスを入れています。

        想定としては、レンタルサーバ上での分では正常に動いてる?ので、
        facebookから起動したら、「いいね」をうながす画面(どんな画面か
        不明なのですが)が出てくるかな?と思っているのですが・・・

        まだ、認証されていなかったりするから、画面が出てこないのかな?
        って思っていますが、この部分についてもどうなのでしょうか??

        次から次へと質問してしまってすみません・・・

        • yu29ozaki
        • 2013 10/05 1:40pm

        アプリケーションをサーバーにアップ→レンタルサーバーでOKです。
        Facebookでアプリ登録→https://developers.facebook.com/から登録します。
        基本データの「App Domains」はレンタルサーバーにアップしたサイトURLのドメインを入力します。http://apps.facebook.com/xxxxxは入力しなくて大丈夫です。
        ※ここで正しく入力されていないと認証がうまくいきません。

        Facebookページからのアクセスの場合getSignedRequest()で情報取得できるので、emptyの場合にはアクセスを弾いてもいいかもしれません。


        < ?php $data = $facebook->getSignedRequest();
        if(empty($data)){
        die('Facebookページからアクセスしてね。');
        }
        ?>

        おそらくApp Domainsを修正すれば動くのではないでしょうか。

    • トラ
    • 2013 10/08 4:18pm

    何度も質問してしまっているのに、丁寧な回答ありがとうございます。

    いろいろ試して見てはいるのですが、現象は変わらないんです・・・

    URLを載せましたので見てもらって良いですか?
    たぶん、何も写らないと思いますが・・・・

    • トラ
    • 2013 10/23 1:46pm

    お久しぶりです。
    あれからいろいろ試しまして、レンタルサーバがSSL対応していなかったことが判明し、
    他のレンタルサーバを使って試してみたら、動きました。

    ただ、今自分で作ってるもので上で教えてもらったように
    「いいね」判定をしています。

    ですが、今度は、その「いいね」ぼたんが無いため、
    そこまでとなってしまっているのです・・・

    ——————————-
    ようこそ!○○○○さん!
    いいね押してね
    ——————————-
    が出てくるだけで「いいね」ボタンがありません。
    この「いいね」ボタンってfacebook上に表示されているものでは
    無いんでしょうか?

    お忙しいところ恐縮ですがご教授お願いします。

      • yu29ozaki
      • 2013 10/30 6:02pm

      返信が遅くなってしまい申し訳ないです。
      Facebookアプリを登録した後に登録した後にページにアプリを登録する必要があります。
      追加方法は簡単ですが、解説ページがいくつかありますのでそちらをご参照ください。
      http://ja-jp.facebook.com/help/172925542764476

        • トラ
        • 2013 10/31 11:57am

        いつも参考にさせていただいています。

        facebookページに登録が完了しました。
        それで、プログラム的には、最終のウォールに書き込み処理まで
        きている段階なのですが、ここでも問題が発生しました。

        前にも質問させていただいてるのですが、
        「(#200) The user hasn’t authorized the application to perform this action」
        がまたもや発生。権限がないということになりました。
        それで教えてもらった通り、「publish_stream」の権限を付与したのですが、同じでした・・・

        そこで何がおかしいのかを切り分けるため、上記のサンプルを使用してみたんですが、同じくエラーになります。

        権限付与がうまくいっていないというのは解るのですが、
        publish_stream を与えるだけではだめなのでしょうか?

        developersの設定の中で
        権限の設定というのがあるので
        1「デフォルトのアクティビティのプライバシー:」なし
        2「User & Friend Permissions:」空白
        3「追加許可」空白
        4「Auth Token Parameter:」URI Fragment(#access_to///)
        としました。(4つ目だけ変更)

        他の基本設定の中にある
        domainなどは教えてもらった通りに入れています。

        この権限の設定があやしいのでしょうか?
        ウォールの書き込み部分まではうまくいっているのですが、
        ここでつまずいています。
        他のサイトを見ても同じような書き方なので、問題はなさそう・・・
        と思っていますが・・・・

        長文すみません。よろしくご教授お願いいたします。

        • yu29ozaki
        • 2013 11/02 9:39pm

        まず疑われるのは、ログイン時の権限設定とログインURLへの誘導ですが、クリアされているということなので別のアプローチを試みてみるのが良いと思います。
        権限が明示的に指定できない場合など、権限を付与したアクセストークンの指定を入れることによって解決することがあります。

        $access_token = $facebook->getAccessToken();
        $ret_obj = $facebook->api(
        	'/me/feed',
        	'POST',
        	array(
        		'message' => 'フィード投稿テスト',
        		'access_token'=>$access_token
        	));
        

        これでお試しください。
        なお、これで投稿できない場合、これ以上の技術的なアドバイスはソースコードを提供していただかないと難しいかもしれません。
        コメント欄からご連絡いただくか、Twitter @yu29ozaki、またはYu Ozakiこちらからご連絡ください。連絡先をお教えします。

    • Bernard
    • 2014 08/18 10:22am

    Hi, I just hopped over to your website via StumbleUpon. Not somthing I would usually browse, but I appreciated your thoughts none the less. Thank you for creating something well worth reading through.

  1. 2015 05/04
    トラックバック先:mukena katun jepang termurah

return top