Twitterの特定のハッシュタグでつぶやかれたツイートを収集する

#概要
node.jsで特定のハッシュダグでつぶやかれたツイートを収集して、csvファイルに保存します。

#Twitter Developer Platformにアプリを登録

##1.登録画面右上の「Create an app」をクリック
[アプリ登録画面](https://developer.twitter.com/en/apps)

![twitter01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43894/4d8376d1-95a2-db48-41e6-7f85df2996f0.png)

##2.用途の選択
今回は「Making a bot」にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43894/cecf4bd7-b6c6-faee-ec10-295c1d2ea9ba.png)

##3.ツイッターアカウントの確認
現在、ログインしているツイッターのアカウントで問題ないか聞いてきます。
どこに住んでいるか、名前を聞かれるので記入
![twitter02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43894/1bbb060b-7051-aa92-fe01-989b31f6a67c.png)

##4.使用用途を細かく聞かれる
以前はそんなに聞かれなかったのに、現在は色々聞かれます。
下記の２つだけ入力してそれ以外は「No」にしています。

>・In English, please describe how you plan to use Twitter data and/or APIs. The more detailed the response, the easier it is to review and approve.


>・Please describe how you will analyze Twitter data including any analysis of Tweets or Twitter users.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43894/6eeff1c9-e88f-62e6-0cf1-1206484fc76f.png)

入力した内容はグーグル翻訳で適当に翻訳しました。

>In order to investigate the client's products and reputation, I want to collect tweets posted with a specific hashtag, aggregate them, and make suggestions for improving their products and websites to the client.

##5.規約などに同意する

規約に同意、送信されたメールアドレスから確認画面へ
遷移すると開発者アカウントの審査に入ります・・・・・・・

・・・・・ってここまで、アカウント審査の画面やったんかい！！
どうやら色々と仕様が変わったようです。昔はもっと簡単だったのに・・・

審査はいつ通るかわからないので（審査落ちるかも）既存のアプリがある場合はそちらをお使いください。

##6.API key取得
「Keys and tokens」の「API key」「API secret key」「Access token」「Access token secret」をメモっておく

2020年1月20日に、また何かが変わるようです。

![twitter03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43894/d8564911-046d-8a2f-08e0-2d6f6024910f.png)


#開発ソース

###package.json

```js
{
  "name": "twitter_test",
  "version": "0.0.1",
  "dependencies": {},
  "devDependencies": {
    "dotenv": "^8.2.0",
    "fs": "0.0.1-security",
    "twitter": "^1.7.1"
  }
}
```

###.env

```js
consumer_key = 'ここにAPI keyを入力する'
consumer_secret = 'ここにAPI secret keyを入力する'
access_token_key =  'ここにAccess tokenを入力する'
access_token_secret = 'ここにAccess token secretを入力する'
```

Githubの「.env_sample」は「.env」にファイル名を変更してください。

###twitter.js

今回は比較的ツイートが多そうな「#ダイエット」で収集しています。

```js
const fs = require("fs");
let Twitter = require('twitter');
require('dotenv').config();

let client = new Twitter({
    consumer_key: process.env.consumer_key,
    consumer_secret: process.env.consumer_secret,
    access_token_key: process.env.access_token_key,
    access_token_secret: process.env.access_token_secret
});


const main = async () => {
    const stream = await client.stream('statuses/filter', {'track':'#ダイエット'});
    stream.on('data', async data => {
        try {
            fs.appendFile("tweet/tweet.csv", JSON.stringify(data) + "\n", (err) => {
                if (err) throw err;
                console.log("正常に書き込みが完了しました");
            });

        } catch (error) {
            console.log(error);
        }
    });
};

main();
```

[ソース(Github)](https://github.com/hiron712/twitter-hashtag)

####解説

「#ダイエット」でつぶやかれた時に帰ってきたJSONをtweet.csvに保存します。
※パースせずにJSONを文字列にしてそのまま保存しています。

##収集方法

コマンドラインで下記を入力してenter

```
node twitter.js
```

そのままほっておいて、ツイートされると「正常に書き込みが完了しました」と表示され、どんどん溜め込んでいきます。

収集をやめる場合は「Control + c」で終了


##最後に

Twitter APIの仕様も色々変わっていくので、いつまで使えるかはわかりません。
収集する場合はずっとプログラムを動かしておく必要があります。
ツイートが多すぎると、リクエスト回数の制限に引っかかると思います。

仕事中バックグランドで動かしていましたが、
2100ツイートぐらい収集出来ました。