pythonでHerokuを使ってTwitterで特定ワードが呟かれたらSlack通知する

**2019年11月23日に記載した記事です。**

こんにちは。 [@kosukeobata](https://twitter.com/kosukeobata)です。
最近はPdMやマーケターという肩書きが多いのですが、エンジニアリングも再開したので、ちょっとばかし投稿してみます。

今回は特定のワードがTwitterで呟かれたら、Slack通知するBOTの作り方について記載します。
GitHubであまり綺麗とは言えないですが、ソースコードを公開しているので、そちらを参照しながら作っていただけるかなと思います。
https://github.com/kosukeobata/twitter-bot
## ■ 要件
- 特定のワードがTwitterに投稿されたら、Slack通知されること。
- 重複したツイートidのツイートは通知されないこと。
- リアルタイムでの通知ではなくてよい。

## ■ 技術周り
- python
- sqlite3
- Heroku
- Twitter API
- SlackのWebhook

## ■ やっていること
HerokuのSchedularというアドオンを用いて、10分に一度Twitterに検索をかけます。
引っかかる投稿があれば、指定した特定のSlackに通知してくれます。

その際に、取得したツイートの中でもっとも大きいツイートIDをsqlite3に保存します。
次回実行時に保存されたIDより大きいツイートのみを検索しにいくことで、重複したツイートIDの共有が無くなります。

## ■ 導入手順
1. Twitter APIのアカウント作成。
2. Herokuのアカウント作成し、インスタンスを追加。
3. SlackでWebhookの設定。
4. 僕のリポジトリからgit cloneする。
5. config.pyファイルの追加。
6. Herokuにデプロイ。
7. HerokuにSchedulerを追加。

### 1. Twitter APIのアカウント作成
https://developer.twitter.com/ から登録し、利用申請を行います。
申請から承認までは時間がかかりますので、ご注意ください。
詳細はこちらのQiitaを参照してください。
[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2019年8月時点の情報](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)

### 2. Herokuアカウント作成
https://jp.heroku.com/ から登録する。
特に難しいことはないので、すんなり行えると思います。

アカウントが作成できたらインスタンスを作成しましょう。
この記事では、例えばインスタンス名を「qiita-katsuo」として、進めます。
なので、この記事中に出てくるqiita-katsuoの箇所に関しては、ご自身でつけられた名前があると思うので、全てその名前に置換して読み進めてください。

### 3. SlackのWebhookの設定
こちらも色んなQiitaの記事があるので、そちらを参照ください。
[SlackのIncoming Webhooksを使い倒す](https://qiita.com/ik-fib/items/b4a502d173a22b3947a0)
「https://hooks.slack.com/services/ 」から始まるURLが取得できたら完了です。

### 4. git clone
作業したいディレクトリに移動し、git cloneしてください。
```$ git clone git@github.com:kosukeobata/twitter-bot.git```

### 5. config.pyファイルの追加
アクセストークンなどを記載するファイルなので、GitHub上にはアップロードしていません。
ご自身でファイルを追加してください。
以下のようなファイルになっていればokです。

- 上から4つはTwitter APIの設定。
- WEB_HOOK_KEYはSlackのWebhookの設定。
- SEARCH_KEYWORDはTwitterで呟かれたらpostしたいキーワードを指定してください。
- CHANNEL_NAMEはSlackで通知したいチャンネル名を指定してください。

```
CONSUMER_KEY = "*********"
CONSUMER_SECRET = "*********"
ACCESS_TOKEN = "*********"
ACCESS_TOKEN_SECRET = "*********"
WEB_HOOK_KEY = "*********"
SEARCH_KEYWORD = "*********"
CHANNEL_NAME = "#*********"
```

この時点でlocalで実行することができます。
localでテストをしたい方は、まずは以下のコマンドを実行し、localでの環境を整えてください。
**pipのインストール**

```
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py --user
$ export PATH="$HOME/Library/Python/2.7/bin:$PATH"
$ echo 'export PATH="$HOME/Library/Python/2.7/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
```

**requestのインストール**
```$ pip install requests requests_oauthlib --user```

**実行**
```$ python get_twitter_data.py```

### 6. Herokuにデプロイ
2の手順で作成したインスタンスに対してデプロイします。
まずはターミナルでlogin認証を行い、そしてインスタンスを紐づけ、そしてherokuにpushします。

```
$ heroku login
$ git init
$ heroku git:remote -a qiita-katsuo
$ git add .
$ git commit -am "make it better"
$ git push heroku master
```

### 7. HerokuにSchedularを登録。
Schedularのアドオンを利用すれば、10分に一度Twitterに検索をかけにいってくれます。
リアルタイムではないですが、それくらいの頻度なら問題ないかと思います。
まず、ターミナルで以下のコマンドを叩いてアドオンを追加します。
```$ heroku addons:create scheduler:standard --app qiita-katsuo```

そうすると、herokuの画面からスケジュールを登録できます。
https://dashboard.heroku.com/apps/qiita-katsuo/scheduler
指定するJobとして以下のコマンドを指定してください。
```$ python get_twitter_data.py```

これで設定はおしまいです。
他にちょっとした設定を変えたいなどは、少しずつチューニングいただければと思います。