昨日のFacebook 開発者ブログ

昨日のFacebook 開発者ブログ『The Send Button, Because Sometimes It’s Private』(http://developers.facebook.com/blog/post/494)は、Send(送信)ボタンの話。のsend属性をtrueにすると、いいねボタンの隣に送信ボタンがつく。で送信ボタンを単独で表示することもできる。送信ボタンを押した後のダイアログに関しては、別の資料を参照しないといけないようだ。

Facebook のJavaScrpit Test Consoleなどについて、今日調べたこと

Facebook のJavaScrpit Test Consoleは、http://developers.facebook.com/tools/console/からアクセスすることができる。実体は、とあるように、http://www.fbrell.comで動いている。

http://www.fbrell.comにアクセスすると、http://fbrell.comへ301でリダイレクトされる。
そこから先の動作は、追い切れていないが、ようするに、http://fbrell.comから返ってくるHTMLのレスポンスをローカルのWebサーバ上に保存し、en_USとなっている部分を、片っぱしからja_JPに変える。そして、CSSJavaScriptのURLのパスで、ホスト名が付いていないものには、http://fbrell.comというホスト名を付ける。以上で、JavaScrpit Test Consoleの実行結果は日本語で表示されるようになる。他人のHTMLを改造して使うというのが倫理上の是非はさておいて。ブラウザは一度キャッシュしたCSSやJSファイルは、取りに行かないので、fbrell.comに対しては、そんなに迷惑はかけないはずである。

http://www.atmarkit.co.jp/fsmart/articles/oauth2/01.htmlによると
OAuth2.0は、OAuth1.0と比べて、認証と署名が簡単になっている。(HTTPS必須でトークン取得を簡略化)
OAuth1.0は、Webアプリだけに対応し、クライアントに対応していなかった。(4つのクライアントプロファイルを導入。ただし実用段階にあるのは、Webサーバとユーザエージェントだけ)
OAuth1.0は、トークンとクレゼンシャルの保持が大変だった。(アクセストークンだけでリソース取得が可能に)

英語版での最新はv15である模様(http://tools.ietf.org/html/draft-ietf-oauth-v2-15)。
日本語版の最新はv10だった。

クライアントプロファイルという言葉自体がv15には存在しない。

ソーシャルグラフなどについて今日調べたこと

ソーシャルグラフとは、「ノード(ヒト)」と「エッジ(関係)」であらわされる人間関係図のこと。狭義ではヒトとヒトとの関係だけを表すが、広義では、例えば芸能人や製品の集まりなど、「ヒト」と「モノ」との関係にも拡張される。一般に、AとBが友達である場合、Aが好んでいるものはBが好む確率は高く、マーケティング上の観点から注目を集めている。また、AやBにとっても、自分が探している情報や商品が見つかりやすいという利点がある。(参考:http://blogs.itmedia.co.jp/saito/2010/06/post-09c2.html

Facebookのオープングラフを外部サイトで利用するためには,Facebookアプリとして登録する必要がある。したがって、そのサイトはFacebookのアプリ利用規約に従う義務を負う。取得したソーシャルグラフを保存することは規約によって禁じられている。

http://bradfitz.com/social-graph-problem/による問題提起。
FacebookMixiTwitterMySpace、携帯電話のアドレス帳...あらゆるところで、友達関係を構築していく作業を繰り返すのは、わずらわしい。かといって、Facebookにすべてまとめて依存してしまうのもインターネットの精神に反する。ソーシャルグラフをコミュニティの資産にするのが理想だ。

Facebookの)ソーシャルグラフに属する全てのオブジェクトはユニークなIDを持っている。データを取得するには "https://graph.facebook.com/ID" のようなフォーマットでFacebookにリクエストを投げる。すべてのレスポンスはJSON形式で返ってくる。(参考:http://blogs.itmedia.co.jp/naoto/2010/04/facebookgraph-a.html

ArjunのWallに投稿するには、以下のようにHTTP POST リクエストを送信する。現在サポートされている書きこみは、Wallへの書き込み、コメント、Like(支援関係ON/OFF)、プロフィールに対するノート・リンク・イベント・アルバムの作成、イベントへの出欠表明、アルバムに対する画像のアップロードがある。

curl -F 'access_token=...' \
-F 'body=Hello, Arjun. I like this new API.' \
https://graph.facebook.com/arjun/feed

http://openid-foundation-japan.github.com/draft-ietf-oauth-v2.ja.htmlにOAuth 2.0仕様の日本語訳がある。

Facebookのソーシャルプラグインを使用すると、ブログパーツウィジェットと呼ばれるようなコンテンツと同様に、コードを自分のサイトのHTMLに埋め込むだけで、Facebookのいろいろな機能を簡単に自分のサイトやブログに取り込むことができる。プラグイン内のデータはすべてFacebookから提供される。Facebook内にファンページを設けなくても、自社ホームページにFacebookのソーシャルプラグインを埋め込めば、Facebook内と同様に消費者との対話が可能になる。(参考:http://techwave.jp/archives/51440123.html

FacebookJavaScript Test ConsoleでXFBMLタグを実行させると、必ず英語で表示される。まあ、en_USのall.jsが使われているので、あたりまえかもしれないが。
fb_sig_localeタグは使えるのかなあ。(obsoluteになっているようだ)
fb:intlというものもある(あった)。(FBMLのタグが今となっては使えない)
サーバ側で対処するしかないのかなあ。

Facebook Credits等について今日調べたこと

Facebook Creditsの実装方法(http://developers.facebook.com/blog/post/489
1. Developer Appの‘Credits’ タブで企業情報を登録する。
2.JavaScript SDK でpayダイアログを生成する
3.サーバ側でOrderを処理するコードを実行する。
  Facebookからのpayments_get_itemsリクエストとpayments_status_updateリクエストに対応する
4. Developer Appの‘Credits’ タブで、Credit Callback URLを登録する。
  Facebookからのリクエストであるから、グローバルにアクセス可能でないといけない。
  
Facebook Creditsのメインページ(http://developers.facebook.com/credits/

http://developers.facebook.com/attachment/FacebookCreditsIntegrationGuidev1.pdfによると、
Facebook Creditsでは以下のことはできない。
1.現実世界の通貨への換金
2.他人への資金移動
3.物理的あるいは現実世界のアイテムの購入

basic account informationとは、 name, email, gender, birthday, current city, and profile picture URL.

Facebookアプリテストユーザー作成方法〜実践編(http://blog.livedoor.jp/takah0918/archives/50175801.html

1.アプリケーションのアクセストークンを取得する。
client_idとclient_secretは、http://www.facebook.com/developers/apps.phpで表示されるアプリIDとアプリの秘訣。

curl -F grant_type=client_credentials \

  • F client_id=XXXXXXXX \
  • F client_secret=YYYYYYYY \

https://graph.facebook.com/oauth/access_token

2.1.で取得したアクセストークンを用いて、アプリケーションのテストユーザを作成する。

curl -F installed=true \

  • F permissions=read_stream
  • F access_token=********************

https://graph.facebook.com/app_id/accounts/test-users

id, access_token, login_urlを属性に持つJSONが返ってくる。

3.2.で取得したログインURLで実際にアクセス

Lindaさんというアカウントが作られている。installed=trueを設定していたので、「プライバシー設定アプリ、ゲーム、ウェブサイト」では利用しているアプリに、自分のアプリが登録されている。

* その他の操作

もうひとりテストユーザ(名前はNancy)を作成して、友達としてつなげる

curl -F access_token=Linda's access_token \
https://graph.facebook.com/Linda's ID/friends/Nancy's ID

trueが返ってくれば成功、LindaからNancyへ友達申請が送られる。

Nancyからの承認は以下のようにしておくる。

curl -F access_token=Nancy's access_token \
https://graph.facebook.com/Nancy's ID/friends/Linda's ID?

* テストユーザの削除

curl -X DELETE \

https://graph.facebook.com/Nancy's ID?

curlコマンドでDELETEメソッドにてリクエストを送信する。

Webサイトのインサイトを取得するためには、ルートウェブページにfb:admins、fb:page_id、またはfb:app_idの各メタタグを追加して、個人用アカウント、ページ、またはアプリケーションにリンクする必要がある。

http://developers.facebook.com/opensource/Facebookが提供しているオープンソースSDKなどが紹介されている。

http://developers.facebook.com/docs/reference/rest/fql.query/にFQLを試すためのページが用意されている。古いAPI用か。

http://www.facebook.com/translations/で翻訳に関する議論や討論が行われている。

Jenkins等について今日しらべたこと

HudsonはJenkinsに改名されていた。

Jenkinsには、いろいろと便利なプラグインがあるようだ。http://www.atmarkit.co.jp/fjava/rensai4/devtool21/devtool21_4.htmlによると、TracLightingには以下のプラグインが標準でインストールされている。
・Static Analysis Utilities:静的コード分析のユーティリティ
Checkstyle Plug-in:CheckStyleによるコードチェック
FindBugs Plug-in:FindBugsによるバグ検出
・PMD Plug-in:PMDによるバグ検出
・Duplicate Code Scanner Plug-in:重複したコードの検出
・Hudson Violations plugin:静的解析結果の違反検出
・Hudson Emma plugin:Emmaにより、カバレッジの統計

JavaScript用には、JSCoverageというカバレッジツールがあるようだ。
ActionScript用には、flexcoverというカバレッジツールが存在する。

Facebookで使用されている、Apache Cassandraについて調べてみる。
ドキュメントを見る限り、おもにLinux上で動かすべきもののようであり、Windows上での動作はあまり例がないようだ。

オプトイン:ユーザが許可したデータだけにアプリケーションはアクセスできること。

Graph APIソーシャルグラフを利用するためのコアとなるAPI

Facebookが提供する開発用ツール
Developer App :Facebookアプリを管理するためのアプリ(http://www.facebook.com/developers/
Live Status:APIのパフォーマンスなどを確認できる(http://developers.facebook.com/live_status
Change Log :チェンジログを確認できる(http://developers.facebook.com/docs/changelog/
Test Users:アプリのテストユーザーの作成方法を示したページ(http://developers.facebook.com/docs/test_users/
Insights :アプリまたはページに指標を設定しその情報を分析できる(http://developers.facebook.com/docs/insights/
インサイトダッシュボードは、http://www.facebook.com/insights/
JavaScript Test Console :JavaScript SDKの学習、またはデバッグができる(http://developers.facebook.com/tools/console/
URL Linter :ソーシャルグラフを利用したページのデバッグができる(http://developers.facebook.com/tools/lint/

connect-jsのサンプルサイト:http://fbrell.com/examples

FacebookとOAuth2.0

http://d.hatena.ne.jp/bang_yy/20101103/1288799126によると、
Facebookはweb applicationを対象にしたFlow以外に

JavaScript-based authentication
Desktop application authentication
Mobile Web authentication
Canvas Applications (beta)
の4つのタイプをサポートしている。

web application flowに関して、
authZ endpointは、https://graph.facebook.com/oauth/authorize
(最新のFacebookのドキュメントによると、https://www.facebook.com/dialog/oauthのようだ)
token endpointは、https://graph.facebook.com/oauth/access_token
アクセストークン取得後のAPIリクエストの例は、https://graph.facebook.com/me?access_token=...

http://developers.facebook.com/docs/authentication/によると、Facebook Platformがサポートするユーザログイン用のフローは、server-side (OAuth2.0仕様では、authentication code flow )とclient-side (OAuth2.0仕様では、implicit flow)。どちらの場合にも、user authentication(ユーザが本人であることを確認)、app authorization(ユーザがアプリケーションに自分のデータを提供することを確認)、app authentication(ユーザ本人のデータを提供されていることをアプリケーションが確認)の3つのステップに従って、行われる。

Server-side Flowの場合、user authenticationとapp authorizationは、以下のURLに示されるOAuth Dialogにユーザがリダイレクトされることによって行われる。ここで、client_idは、Facebook Platformに登録したWebアプリケーションのID。redirect_uriは、ユーザが情報提供を承認または拒絶した後にリダイレクトされるURL。
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL

ユーザから基本情報以外のデータも提供してもらう必要があるときには、以下のようにscopeパラメータを指定する。
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=email,read_stream

ユーザが情報提供を拒絶した場合、以下のURLにリダイレクトする。
http://YOUR_URL?error_reason=user_denied&error=access_denied&error_description=The+user+denied+your+request

ユーザが情報提供を承認した場合、以下のようにauthorization codeが返される。
http://YOUR_URL?code=A_CODE_GENERATED_BY_SERVER

authorization codeを取得したら、以下のURLでアクセストークンを取得する。client_secretは、FacebookアプリケーションとFacebook Platformとの間の秘密であり、ユーザなど他の誰かには知らせないようにする。
https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

Client-side Flowの場合も、user authenticationとapp authorizationには、OAuth Dialogを使用するが、以下のように、response_typeパラメータにtokenという値をセットする点が異なる。scopeパラメータを追加できる点は、Server-side Flowのときと同じ。
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&response_type=token

ユーザが情報提供を承認した場合、authorization codeではなく、アクセストークンがデスクトップクライアントに直接返される。app authorizationは、YOUR_URLがFacebook Platformに登録したサイトのURLと合致するかを検証することによって行われる。
http://YOUR_URL#access_token=166942940015970%7C2.sa0&expires_in=64090

ユーザがApp Dashboardhttp://www.facebook.com/settings/?tab=applications)上で、アプリケーションへの情報提供を取りやめた場合、Developer App(http://www.facebook.com/developers/)内で設定したDeauthorize Callbackで指定したURLに対して、通知が行われる。

Facebook Platform では、User Loginに加えて、OAuth 2.0 Client Credential flowを利用したApp Loginをサポートしている。以下のように、Developer Appでアプリケーションを登録したときに生成されたIDと秘密を指定し、grant_typeパラメータにclient_credentialsを指定することで、Insights データの取得や、Requestの承認などの管理タスクを行うことができる。
https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&client_secret=YOUR_APP_SECRET&grant_type=client_credentials

取得したアクセストークンを用いて、下記のようにInsightsデータの取得などを行うことができる。
https://graph.facebook.com/YOUR_APP_ID/insights?access_token=TOKEN_FROM_ABOVE

アプリケーションからFacebookページの管理タスクを行うためには、管理者ユーザからmanage_pagesの許可を得る必要がある。
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=manage_pages&response_type=token
manage_pagesの許可があると、accountコネクションを取得することができ、そのユーザが管理しているページの一覧が各ページのアクセストークンとともに取得することができる。
https://graph.facebook.com/me/accounts?access_token=TOKEN_FROM_ABOVE

Facebookプログラミングなどについて、今日調べたこと

http://developers.facebook.com/docs/samples/からサンプルをダウンロードして動かしてみる。
Social Plugins(winefriends)は、htmlにLogin/Activity/Recommendation/Like/Commentを組み込む例。

Canvas(Run with Friends)は、Google App Engine 上で動くPythonアプリケーション。UbuntuVM上で動かしてみる。http://www.vmware.com/appliances/directory/cat/508からUbuntu 10.10 Gnome desktopをダウンロードする。デフォルトでNumLockがかかっていて、面喰ったが、タイムゾーンJST-9に修正し、時刻も手で直す。SSHでログインできるように、sudo aptitude install sshSSHをインストール。PHPのサンプルも動かしたいので、先にApachePHPをインストールする。sudo apt-get install apache2 でApacheをインストール。sudo apt-get install php5 でPHP5.3.3をインストール。phpinfoが実行されることを確認。

いよいよ、Google App Engine のインストール。まずは、sudo apt-get install python2.5でPython 2.5をインストール。

そうすると、Package 'python2.5' has no installation candidateというエラーになるので、aptの設定ファイルに設定を以下のように変更する。

$ sudo vi /etc/apt/sources.list

deb http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu lucid main
deb-src http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu lucid main

そして、再度apt-getでPython2.5をインストールする。

$ sudo apt-get update
$ sudo apt-get install python2.5

Python 2.5がインストールされたら、Google App Engineをインストールする。

$ wget http://googleappengine.googlecode.com/files/google_appengine_1.4.3.zip
$ unzip google_appengine_1.4.3.zip
$ cd google_appengine

HelloWorldアプリケーションを作成して、動作確認を行う。
$ mkdir helloworld
$ cd helloworld

$ vi helloworld.py
print 'Content-Type: text/plain'
print ''
print 'Hello, world!'

$ vi app.yaml
application: helloworld
version: 1
runtime: python
api_version: 1

handlers:

  • url: /.*

script: helloworld.py

google_appengineディレクトリに戻って、HelloWorldアプリケーションを起動する。

$ cd ..
$ python2.5 ./dev_appserver.py helloworld/

Webブラウザhttp://localhost:8080/にアクセスし、Hello, world!と表示されたら、成功。なお、ローカルホスト以外からのGoogle App Engineへの接続は行えないようになっている。--address=0.0.0.0を指定すれば、ネットワーク上のどのましんからもアクセスが行えるようになる。

$ python2.5 ./dev_appserver.py --address=0.0.0.0 helloworld/

いよいよ、Canvas(Run with Friends)のインストール。

google_appengineディレクトリにCanvas(Run with Friends)用のディレクトリを作成する。curlがインストールされていなかったので、sudo apt-get install curlcurlをインスールしてから、サンプルのソースコードをダウンロードし、展開する。

$ mkdir runwithfriends
$ cd runwithfriends
$ curl -L http://github.com/facebook/runwithfriends/tarball/master | tar xzvf - --strip-components=1

conf.py.exampleをコピーして、conf.pyを作成し、FACEBOOK_APP_ID、FACEBOOK_APP_SECRET、ADMIN_USER_IDSを設定する。Real-time API用に、どのような設定が必要かは、よくわからない。EXTERNAL_HREFに対して、Facebookのサーバからアクセスが発生するので、グローバルにアクセス可能なURLを設定しないと駄目なようだ。

$ cp conf.py.example conf.py
$ vi conf.py

設定がすんだら、runwithfriendsを起動する。

$ python2.5 ../dev_appserver.py --address=0.0.0.0 .

アプリケーションのWeb Site URLとCanvasのURLにrunwithfriendsのURLをセットしたら、統合されているかのテストを行うことができる。


Insights(Export Insights Data)は、PHPで動くサンプルと、Google App Engine 上で動くPythonのサンプル。CSVでInsightデータをダウンロードする。PHP版は、RedirectionException が発生して動かない。Python版は、No ssl package foundでサーバ自体が起動しない。

ssl 1.15をダウンロードして、インストールする。
$ wget http://pypi.python.org/packages/source/s/ssl/ssl-1.15.tar.gz
$ tar xvzf ssl-1.15.tar.gz
$ cd ssl-1.15
$ sudo python2.5 setup.py install

SSLのライブラリがなかったので、インストール。
$ sudo apt-get install libssl-dev

Python.hがなかったので、インストール
$ sudo apt-get install python2.5-dev

今度は、bluetooth/bluetooth.hがない。
$ sudo apt-get install libbluetooth-dev

AppConfigがみつからないというエラーだったから、app.yaml.sampleをもとにapp.yamlを作らないといけなかった。

やっと動いたと思ったら、
Missing redirect_uri parameter.が返ってきた。
確かにコードのどこを見ても、redirect_uriはセットしていない。サンプルとサーバのAPIとの間で整合性が取れていない模様。

Credits Sample Appは、Facebook Creditsの設定を行っていないので、下記のようなエラーとなる。

API Error Code: 1151
API Error Description: Application is not enabled for using Facebook Credits.
Error Message: Invalid Application