TwitterAPI と Slack ボットで情報収集を効率化する
最先端のトピックを知るために,ウェブサイト・Twitter・ブログ・論文などの情報収集は大切ですが,非常に面倒です。今回 Slack に以下のような機能を実現し,情報収集の効率化を図りました。
- Slack に RSS を流し込む
- Slack にメール(主に Google アラート)を流し込む
- Slack に特定ユーザのツイートを流し込む
各サイトのタイムラインをいちいち確認せず必要な情報を一元管理できる点,既読の履歴が残る点などが便利です。
Twitter の自動収集システムの構築が一番大変で(多くはコピペで済みますが),技術的には Twitter API, heroku, Python(Tweepy)を利用しています。
Slack に RSS を流し込む
Slack のアプリ機能として RSS リーダーが提供されており,非常に簡単に実行できます。チャンネル単位で RSS を流し込め,Slack の機能としてブックマークや既読が整備されているので,Feedly などと似た感覚で使えます。
方法については,すでに情報がたくさんあります。
Qiita の特定タグの投稿情報とかも RSS で収集できます。いちいちタイムラインを見なくて済むので楽です。
Slack にメールを流し込む
私は各種メルマガや Google アラートでの情報収集も行なっているので,それを Slack に流し込む必要があります。こちらも既に情報がたくさんあります。いくつかの方法があるのですが,私は以下のようにしています。
- Slack ダイレクトメッセージに転送するためのメールアドレスを発行
- https://slack.com/intl/ja-jp/help/articles/206819278-Slack-にメールを送信する
- ↑のページの「転送用のメールアドレスを設定する」というセクションです
- Gmail で上記のアドレスに特定のメールを転送
他の手法には以下のようなものがありました。色々試しましたが,使い勝手では上記が一番でした。
Zapier
- 特定のチャンネルに特定のメールを流しこめます。
- 詳しい方法は,https://qiita.com/mr_t_free/items/fd05ac8306fd5fcc1b37 などを参照ください
- しかし,そもそも Slack が HTML に対応しておらず,Google アラートなどはレイアウトが崩れ使い勝手が悪いです (ダイレクトメッセージへの転送であればメールが埋め込みされ綺麗に表示されます)
Slack の Email アプリ
- 有料なので試していません。しかし,設定が楽で特定のチャンネルにメールを転送できるという利点があり,お金を払えるのであれば便利そうです。
Slack for Gmail
- 手動で転送を行うため,情報収集の自動化になりませんでした
API を用いてガリガリ実装する
- 手間がかかりそうで試していません。
Slack に特定ユーザのツイートを流し込む
はじめは IFTTT で簡単にできると思っていましたが,使い勝手が悪く結局断念。Twitter 自動収集ボットの構築をしました。大まかな手順は以下の通りです。
- 環境構築,サービスへの登録,トークンの入手
- Tweet 収集と Slack 転送システム
- heroku 実行ファイル
- デプロイ
以下の2つが非常に参考になります。 というよりも, むしろほぼコピペで済みます。
環境構築
Python をメインで利用。パッケージとして, Tweepy が必要です。
pip install tweepy
pip install requests
細かい処理で pytz も使っています。あと git が必要です。
各種サービスへの登録
Twitter API, Slack Webhook, heroku を利用します。
Twitter API ではアクセストークンが必要になります。
Slack Webhook では, チャンネルの URL が必要になるので, それもメモします。
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
以下は 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 には必要パッケージを記載します。
worker: python main.py
tweepy==3.8.0
requests==2.22.0
pytz==2019.3
注意が必要なのは, Dyno として web ではなく worker を使用していることです。web だと, Error R10
が発生します。
デプロイ
以下の感じです。
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
削除は,
heroku apps:destroy --app アプリ名
となります。
改善点
- heroku のクレジット登録をする。クレジットカードを登録しないと, 常時稼働ができませんので...