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


# 使うもの

* [node](https://nodejs.org/)
* [express](http://expressjs.com/)
* [node-twitter](https://github.com/desmondmorris/node-twitter)
* [Twitter The Search API](https://dev.twitter.com/rest/public/search)

# 基本の型をつくる

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

1.`package.json`をつくる

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

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

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

```routes.js
'use strict';
var configRoutes;
var url = require('url');
var twitter = require('./twitter');
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/twitter/search', function(request, response) {
    	twitter.search(urlInfo,
            function(result){
                response.send(result);
            }
        );
    });
}

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

## Twitter API処理

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

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

https://apps.twitter.com/

[Create New App]する。

API KEYSタブで次の作業をする。
[Cange App Permissions]
[Create my access token]

で、以下をメモ。
API key
API secret
Access token
Access token secret

### 環境変数設定

[node-twitterのサイト](https://github.com/desmondmorris/node-twitter)をみると、Twitterのキーは環境変数に設定するといいよとあるのでそうする。
Macだったら.bash_profileとかで以下のように書いて、`source ~/.bash_profile`するかターミナルを再起動する。

```.bash_profile
export TWITTER_CONSUMER_KEY="YOURS"
export TWITTER_CONSUMER_SECRET="YOURS"
export TWITTER_ACCESS_TOKEN_KEY="YOURS"
export TWITTER_ACCESS_TOKEN_SECRET="YOURS"
```

### Twitter API処理

とりあえず、検索だけ。
リクエストのクエリ文字列をそのまま[Twitter APIのオプション](https://dev.twitter.com/rest/reference/get/search/tweets)にする。
とりあえず、qとcountだけ。

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

```twitter.js
var Twitter = require('twitter');

var client = new Twitter({
  consumer_key: process.env.TWITTER_CONSUMER_KEY,
  consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
  access_token_key: process.env.TWITTER_ACCESS_TOKEN_KEY,
  access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET,
});

//キーワードで検索
function search(urlInfo, callback){
	var options = {};
	if( urlInfo.query.q ) {
		options.q = urlInfo.query.q
	}
	if( urlInfo.query.count ) {
		options.count = urlInfo.query.count
	}
	client.get('search/tweets', options, function(error, tweets, response){
   		callback(tweets);
	});
}

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

# 動かす

1.server起動

```
node app.js
```

2.アクセス

http://localhost:3000/api/twitter/search?q=node&count=3

# 参考

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