Node.js+ExpressでFacebook APIをさわる


# 使うもの

* [node](https://nodejs.org/)
* [express](http://expressjs.com/)
* [facebook-node-sdk](https://github.com/amachang/facebook-node-sdk)
* [facebook Graph API](https://developers.facebook.com/docs/javascript/reference/FB.api)

# 基本の型をつくる

## パッケージのインストール

1.`package.json`をつくる

"*"にしてるので最新が落ちる。
バージョンしてしたければ、"express": "3.2.*"のようにする。

```package.json
{
    "name": "node-sns",
    "version": "0.0.1",
    "private": true,
    "dependencies":{
        "express": "*",
        "facebook-node-sdk": "*"
    }
}
```

2.インストール

```
npm install
```

## 本体

ルーティングファイルを指定しているところだけ注意。
ルーティングファイルを別ファイルにしていて同じディレクトリのroutes.jsということ。

```app.js
'use strict';
var http = require('http');
var express = require('express');
// ルーティングファイルを指定
var routes = require('./routes');
var app = express();
var server = http.createServer(app);

routes.configRoutes(app, server);

server.listen(3000);
console.log('Listening on port %d in %s mode', server.address().port, app.settings.env);
```

## ルーティング

`app.all`で`api/*`というurlでアクセスされたときの共通処理を記述している。

`/api/facebook/search`というurlでアクセスされたときに`facebook`を呼んで結果を返している。
この`facebook`は`var facebook = require('./facebook');`のとおり、別ファイルのfacebook.jsを指している。

```routes.js
'use strict';
var configRoutes;
var url = require('url');
var facebook = require('./facebook');
var urlInfo;

configRoutes = function(app, server) {
    app.get('/', function(request, response) {
        response.redirect('/index.html');
    });

    app.all('/api/*', function(request, response, next){
    	// クエリー文字列を含めてurl情報を取得（trueオプションでクエリ文字列も取得）
    	urlInfo = url.parse(request.url, true);
    	// jsonでレスポンス（外部の人もアクセスできるようにAccess-Control-Allow-Originを設定）
	    response.contentType('json');
	    response.header('Access-Control-Allow-Origin', '*');
	    next();
	});
    app.get('/api/facebook/search', function(request, response) {
    	facebook.search(urlInfo,
            function(result){
                response.send(result);
            }
        );
    });
}

module.exports = {configRoutes: configRoutes};
```

## Facebook API処理

### Facebook APIのアカウント作成

以下にアクセスしてログインする。

https://developers.facebook.com/


[MY APPS]タブの[Add a New App]でwwwのAppを追加する。

で、以下をメモ。
App ID
App Secret

### 環境変数設定

App IDとApp Secretは環境変数に設定する。
Macだったら.bash_profileとかで以下のように書いて、`source ~/.bash_profile`するかターミナルを再起動する。

```.bash_profile
export FB_APP_ID="YOURS"
export FB_APP_SECRET="YOURS"
```

### Facebook API処理

とりあえず、検索だけ。
[Facebook Graph API](https://developers.facebook.com/docs/graph-api/using-graph-api/v2.3)は、次のようにGETでアクセスする。

* `/me`
* `/{user-id}`
* `/{user-id}/feed`
* `/{album-id}/photos`

とりあえず、パターンによらず全てクエリ文字列のidとして受け取ってそのまま渡す。
一応、fields指定もクエリ文字列指定でできるようにする。

**search以外のメソッドを追加したときは、最後のexportsに追加するのを忘れないように。**

**[facebook-node-sdk公式サイト](https://github.com/amachang/facebook-node-sdk)のREADME.mdがタイポしていてappIdがappIDになっているので注意。正しいのはappId。**

```facebook.js
'use strict';
// https://github.com/amachang/facebook-node-sdk
var Facebook = require('facebook-node-sdk');
var facebook = new Facebook({
  appId: process.env.FB_APP_ID,
  secret: process.env.FB_APP_SECRET
});

function search(urlInfo, callback) {
  var id = '/4';
  if( urlInfo.query.id ) {
    id = urlInfo.query.id
  }
  var parameters = {};
  if( urlInfo.query.fields ) {
    parameters.fields = urlInfo.query.fields
  }
  facebook.api(id, parameters, function(err, data) {
    console.log(err);
    callback(data);
  });
}

module.exports = {
    search: search
}
```

# 動かす

1.server起動

```
node app.js
```

2.アクセス

http://localhost:3000/api/facebook/search?id=/Little.Pink.Brokiga/feed?fields=picture

# 参考

https://github.com/itagakishintaro/node-sns