TwitterAPI と Slack ボットで情報収集を効率化する

# TwitterAPI と Slack ボットで情報収集を効率化する


最先端のトピックを知るために，ウェブサイト・Twitter・ブログ・論文などの情報収集は大切ですが，非常に面倒です。今回 Slack に以下のような機能を実現し，情報収集の効率化を図りました。

- Slack に RSS を流し込む
- Slack にメール（主に Google アラート）を流し込む
- Slack に特定ユーザのツイートを流し込む

各サイトのタイムラインをいちいち確認せず必要な情報を一元管理できる点，既読の履歴が残る点などが便利です。

Twitter の自動収集システムの構築が一番大変で（多くはコピペで済みますが），技術的には Twitter API, heroku, Python（Tweepy）を利用しています。

## Slack に RSS を流し込む

Slack のアプリ機能として RSS リーダーが提供されており，非常に簡単に実行できます。チャンネル単位で RSS を流し込め，Slack の機能としてブックマークや既読が整備されているので，Feedly などと似た感覚で使えます。

方法については，すでに情報がたくさんあります。

https://slack.com/intl/ja-jp/help/articles/218688467-Slack-に-RSS-フィードを追加する

https://ferret-plus.com/14641

Qiita の特定タグの投稿情報とかも RSS で収集できます。いちいちタイムラインを見なくて済むので楽です。

## Slack にメールを流し込む

私は各種メルマガや Google アラートでの情報収集も行なっているので，それを Slack に流し込む必要があります。こちらも既に情報がたくさんあります。いくつかの方法があるのですが，私は以下のようにしています。

1. Slack ダイレクトメッセージに転送するためのメールアドレスを発行
    - https://slack.com/intl/ja-jp/help/articles/206819278-Slack-にメールを送信する
    - ↑のページの「転送用のメールアドレスを設定する」というセクションです
2. Gmail で上記のアドレスに特定のメールを転送

他の手法には以下のようなものがありました。色々試しましたが，使い勝手では上記が一番でした。

Zapier

- 特定のチャンネルに特定のメールを流しこめます。
- 詳しい方法は，https://qiita.com/mr_t_free/items/fd05ac8306fd5fcc1b37 などを参照ください
- しかし，そもそも Slack が HTML に対応しておらず，Google アラートなどはレイアウトが崩れ使い勝手が悪いです (ダイレクトメッセージへの転送であればメールが埋め込みされ綺麗に表示されます)

Slack の Email アプリ

- 有料なので試していません。しかし，設定が楽で特定のチャンネルにメールを転送できるという利点があり，お金を払えるのであれば便利そうです。

Slack for Gmail

- 手動で転送を行うため，情報収集の自動化になりませんでした

API を用いてガリガリ実装する

- 手間がかかりそうで試していません。

## Slack に特定ユーザのツイートを流し込む

はじめは IFTTT で簡単にできると思っていましたが，使い勝手が悪く結局断念。Twitter 自動収集ボットの構築をしました。大まかな手順は以下の通りです。

1. 環境構築，サービスへの登録，トークンの入手
2. Tweet 収集と Slack 転送システム
3. heroku 実行ファイル
4. デプロイ


以下の2つが非常に参考になります。 というよりも, むしろほぼコピペで済みます。

https://qiita.com/yuhkan/items/805159f88dd0ad6b21c7

https://stefafafan.hatenablog.com/entry/2015/11/14/220601

### 環境構築

Python をメインで利用。パッケージとして, Tweepy が必要です。

https://kurozumi.github.io/tweepy/

```
pip install tweepy
pip install requests
```

細かい処理で pytz も使っています。あと git が必要です。

### 各種サービスへの登録

Twitter API, Slack Webhook, heroku を利用します。

Twitter API ではアクセストークンが必要になります。

https://qiita.com/kngsym2018/items/2524d21455aac111cdee#consumer-api-keysアクセストークン情報を使用したpythonスクリプト

Slack Webhook では, チャンネルの URL が必要になるので, それもメモします。

https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-での-Incoming-Webhook-の利用

heroku は無料版（クレジット登録なし）を使っています。しかし, 一ヶ月間フル稼働できないので，将来的にはクレジット登録をするつもりです。

### ツイートの収集と Slack への転送

私は Rest API ではなく Streaming を用いています。こちらの方が実装がとても楽です。具体的には，`tweepy.StreamListener.filter(follow=query)`に`query`として収集したいユーザ ID のリストを渡します。ユーザ名からユーザ ID への変換も tweepy で簡単にできます。また，特定ユーザの監視だけでなくキーワードの監視などもできます。

Slack 転送部分の実装の実際としては, `tweepy.StreamListener` の`on_status`メソッドに, 

- リツイートなど不要なツイートをフィルタリングする処理
- Slack 転送用にデータを整形する処理
- Slack に転送する処理

を噛ませます。不要ツイートのフィルタリングは, 例えば下の感じです。

```
def is_invalid_tweet(self, status):             
    if isinstance(status.in_reply_to_status_id, int):
        # リプライなら True
        return True

    if "RT @" in status.text[0:4]:
        # RT なら True
        return True

    return False
```

https://www.pytry3g.com/entry/twitter-api-seq2seq



以下は json への整形です.

```
import json
from datetime import timedelta 

def format_status(status):
    channel = '#twitter_collection'
    text = status.text
    status.created_at += timedelta(hours=9) # 日本時間に
    username = str(status.user.name) + '@' + str(status.user.screen_name) + ' (from twitter)'

    json_dat = {
        "channel": channel,
        "username": username,
        "icon_url": status.user.profile_image_url,
        "text": text
    }
    json_dat = json.dumps(json_dat)

    return json_dat
                   
```

Slack への転送は非常に簡単で，`request.post`を用いるだけです。

```
def post_to_slack(json_dat):
    url = SLACK_WEBJOOK_URL
    requests.post(url, data=json_dat)
    return    
```

###  heroku 実行ファイル

heroku を利用する場合, 

- Profile
- requirements.txt

というファイルが必要になります。Profile は実行時のメイン処理を記載します。requirements.txt　には必要パッケージを記載します。

``` Profile
worker: python main.py
```

``` requirements.txt
tweepy==3.8.0
requests==2.22.0
pytz==2019.3
```

注意が必要なのは, Dyno として web ではなく worker を使用していることです。web だと, `Error R10`が発生します。

https://qiita.com/m_rn/items/9a580d04781b34f64693


### デプロイ

以下の感じです。

```
heroku login
git init 
git add .
git commit -m "test"
heroku create # アプリを登録
git push heroku master # アプリを転送
heroku scale worker=1 # アプリを実行
```

web プロセスだと `git push heroku master` でデプロイできるのですが, worker プロセスだと `heroku scale worker=1`が必要です。

ログ監視は,  

```
heroku logs -t
heroku ps
```

で行います. 停止は, 以下です。

```
heroku scale worker=0
```

https://qiita.com/naberina/items/da4a6d3c480aa7a62b06

削除は,

```
heroku apps:destroy --app アプリ名
```

となります。

https://qiita.com/chihiro/items/5c3ff400f6cb99deb945

## 改善点

- heroku のクレジット登録をする。クレジットカードを登録しないと, 常時稼働ができませんので...