2012-11-17

[Node.js] request を使って Facebook の Graph API にアクセスする

Facebook Graph API など REST で OAuth 2.0 な API にアクセスする際は素朴な HTTP クライアントがあれば十分と思うので Node.js では最近は request を使っています。

このクライアントを使うにあたり中間者攻撃などを防ぐためオプション strictSSL を true として SSL の証明書の検証を行うことを有効にすることが大切だと思います。しかし残念なことに Node.js v0.8.14 では graph.facebook.com の wildcard 証明書について壊れていますw (#4255) Node.js v0.8.16 で直っているように見えます。

request について、パラメータの与え方が GET の場合は qs、POST の場合は form になることに注意します。また、オプション json を true にしておくとレスポンスを JSON としてデコードしてくれます (正確にはリクエストボディ body の Content-Type を application/json に設定する機能も含みます)。

さらに詳しくは 公式ドキュメント をご参照ください。

Graph API には具体的に以下のコードでアクセスできます。

var request = require('request').defaults({
    strictSSL: true
});

function getIdentity() {
    request.get('https://graph.facebook.com/me', {
        qs: {
            access_token: ACCESS_TOKEN
        },
        json: true
    }, function (err, resp, data) {
        if (err) { throw err; }
        if (resp.statusCode !== 200) { throw new Error(JSON.stringify(data)); }
        console.log(data);
    });
}

function writeWall() {
    request.post('https://graph.facebook.com/me/feed', {
        form: {
            message: MESSAGE,
            access_token: ACCESS_TOKEN
        },
        json: true
    }, function (err, resp, data) {
        if (err) { throw err; }
        if (resp.statusCode !== 200) { throw new Error(JSON.stringify(data)); }
        console.log(data);
    });
}

蛇足ですが request には OAuth 1.0 用のリクエスト署名機能も内蔵されているので oauth パラメータを渡すことで Twitter - REST API にも追加モジュールなしでアクセス可能です。