ラベル facebook の投稿を表示しています。 すべての投稿を表示
ラベル facebook の投稿を表示しています。 すべての投稿を表示

2012年3月31日土曜日

FacebookのGraph APIを使った時に付いてくる"#_=_"とjQuery Mobile

FacebookのGraph APIを使って認証をして元のページに戻ってきた時に、URLパラメータに"#_=_"という謎の文字列がくっついてくるときがあります。

常に付いてくるわけではないのが厄介で、getLoginUrlの引数にredirect_uriがないからとか書いてるところもあるけど、ちゃんと書いてても付いてくるときがあり、結局取れないよね、というのが共通認識らしい。

で、大概の場合、それが付いていても影響はないけれど、jQuery Mobileを使ってる時に画面が表示されなくなる(正確には、レンダリング中に処理が止まる)問題が出たので、対策を調査。

下のコードを埋め込めばOK。

<script type="text/javascript">
if (window.location.hash == '#_=_')window.location.hash = '';
</script>

なんかムリヤリでイヤやけど、見る限りこれしか対策見つからず。

2012年3月10日土曜日

Facebook SDK for Android を使って、ダイアログを使わずにウォールにポストするコード例

Facebook SDK for Android に同梱されているサンプルには、ウォールにポストする方法としてダイアログを一旦表示させてそこにポスト内容を書かせてから投稿、というパターンしか見つかりませんでした。

でも、「ねちゃったー」みたいに何かしらの動作により裏で自動的にポストがしたい場合には、そのサンプルだと実現できません。

なので調べましたが、どんぴしゃのものが見つかりませんでした。

というわけで、いろんなサンプルを見ながら試行錯誤しているうちに動いたので、備忘録および共有のために書きました。

要は、SDKのAsyncFacebookRunner#requestというメソッドを叩けばいいのですが、ちゃんとした説明がない!
検索して見つけたサンプルも前のバージョンでパラメーターの数が違ったりとか。

お好きなようにお使いください。

なお、SDKのバージョンナンバーが見当たらないのですが、2012/3/10 時点で最新のバージョンを使ってます。


public class ReturnActivity extends Activity {

    Facebook facebook = new Facebook(Constants.FACEBOOK_APP_ID);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.thanks);

        FacebookSessionStore.restore(facebook, this); 

        AsyncFacebookRunner runner = new AsyncFacebookRunner(facebook);
        Bundle params = new Bundle();
        params.putString("message", "Activityからポストするテスト");
        params.putString("access_token", facebook.getAccessToken());
        runner.request("me/feed", params, "POST", new RequestListener() {

          @Override
            public void onMalformedURLException(MalformedURLException e, Object state) {
                e.printStackTrace();
            }

            @Override
            public void onIOException(IOException e, Object state) {
                e.printStackTrace();
            }

            @Override
            public void onFileNotFoundException(FileNotFoundException e, Object state) {
                e.printStackTrace();
            }

            @Override
            public void onFacebookError(FacebookError e, Object state) {
                e.printStackTrace();
            }

            @Override
            public void onComplete(String response, Object state) {
                // do nothing.
            }
        }, null);
    }

2012年1月11日水曜日

アプリから管理者名でFacebookページに投稿するための超簡単なaccess token取得方法

アプリからFacebookページに投稿する方法は、個人名での投稿でも管理者名での投稿でも方法は同じですし、調べたらそれなりの適解がいっぱい出ているので省略。

ここで書くのは、FacebookページにそのFacebookページの管理者名で投稿するための準備としての、access tokenを取得する超簡単な方法です。


検索して出てくる多くの記事では、

  • これをするためだけのコードを書く。
  • サーバーにアップする。
  • 動かす。
  • 表示されたページのURLのパラメータにあるaccess_tokenの部分をコピー

ってやるけど、めんどくさくないですかね。


一度、やっとこさ見つけたどこかのページを参考にしてやったものの、久々にその作業が必要になったときにその方法が思い出せず、さらにそのとき参考にしたページが見つからず、長時間ハマりまくったので備忘録として残すことにしました。

以下、その手順です。
(注)先にアプリを作っておいてください。(このやり方も省略)

  1. Facebookの「Graph API Explorer」にアクセスします。
  2. 画面右上のプルダウンから予め作っておいたアプリを選択します。
  3. 2のプルダウンのちょっと下にある「アクセストークンを取得する」ボタンを押します。
  4. ダイアログが開くので、そこの「Extended Permissions」を押して、「manage_pages」と「offline_access」と「publish_stream」のチェックを入れて、「Get Access Token」ボタンを押します。
  5. ダイアログが閉じて別のウインドウが開くので、そこの「許可する」ボタンを押します。 (※1)
  6. ウインドウが閉じたら、元のウインドウに戻って、3のボタンのちょっと下にある「accounts」というリンクを押します。(※2)
  7. 入力欄の下にAPIからの返り値として、自分が管理しているすべてのFacebookページのページ名とかページIDとかがズラズラっと表示されるので、そこの中からアプリを使って管理者名で投稿したいFacebookページを探して、そのaccess_tokenの値をコピーします。

※1 ブラウザの設定で、ポップアップウィンドウを許可してないとダメかも。
※2 「送信」ボタンの左にある入力欄に最初から表示されているURLの末尾に、「/accounts」を追記して「送信」ボタンを押してもOK。

おしまい。

2011年7月31日日曜日

Facebookアプリのアクセス許可ダイアログの表示方法

最初から言い訳しますが、Facebookアプリと言ってますが正しい用語が分からないです。
Facebookページに追加するアプリのことです。
Canvas Pageとも呼ぶんですかね。
親切な人、教えてくださいな。

Facebookアプリを使うときに、そのアプリに対してアクセス許可をしていなければダイアログが出ますが、
1.新しいウインドウが開いて、そこに承認画面が表示されるタイプ
2.ページ内にダイアログのレイヤー(lightbox的なカンジ)が表示されて、そこに承認画面が表示されるタイプ
の2種類あります。

言葉で説明するのは難しいので、実際に見てください。
1は、画面左にあるメニューの「承認方法テスト(別ウインドウに表示版)」から、
2は、「承認方法テスト(ページ内に表示版)」から試してください。
このブログのFacebookページ

1はポップアップブロックに引っ掛かってしまうという大弱点がありますし、
Facebook公式アプリの認証が2なので、できれば2にしたいと思い、
調べたけどなかなか分からないので試行錯誤を重ねまして、その成功したコードを紹介します。
(Javascript SDKを使いました。)

1のコード:
<div id="fb-root"></div>
<script src="http://connect.facebook.net/ja_JP/all.js"></script>
<script type="text/javascript">
  FB.init({
    appId  : 'アプリのApp ID',
    status : true,
    cookie : true,
    xfbml  : true
  });
  FB.getLoginStatus(function(response) {
    if (response.session) {
      // 許可済みの時の挙動
    } else {
      FB.ui({
        method: 'permissions.request', // 
        display: 'popup'
      },
      function (response) {
        if(response.session){
          // 許可されたときの挙動
        }else{
          // 許可されなかったときの挙動
        }
      });
    }
  });
</script>
2のコード:
<div id="fb-root"></div>
<script src="http://connect.facebook.net/ja_JP/all.js"></script>
<script type="text/javascript">
  FB.init({
    appId  : 'アプリのApp ID',
    status : true,
    cookie : true,
    xfbml  : true
  });
  FB.getLoginStatus(function(response) {
    if (response.session) {
      // 許可済みの時の挙動
    } else {
      FB.ui({
        method: 'auth.login',
        display: 'iframe' // pageでもOK。違いはよく分からんw
      },
      function (response) {
        if(response.session){
          // 許可されたときの挙動
        }else{
          // 許可されなかったときの挙動
        }
      });
    }
  });
</script>

違うのは赤字の部分です。
<script></script>の部分は、<head>内に入れてもOKですが、
離れてるのもイヤなんで<body>に置いてます。
</body>の直前に入れるのが描画上良いんでしたっけね。
まあ細かいことは置いておきます。

で、普通考えればdisplayだけ変えればいいような気がしますが、違ったんです。
auth.loginは使われなくなって、permissions.requestを代わりに使えという話もあるんですが、
permissions.requestはバグのせいか何かでdisplayがpopupしか使えないみたいです。
なので、auth.loginを使っています。(いずれpermissons.requestが使えるんでしょうかね。)

リファレンスが公式にも少なくて手探り過ぎて笑えます。
これ、仕事でやってる人は大変そう。