Twitterをモニタリングして、特定キーワードを含むツイートをリアルタイムにSlackに転送する方法について紹介します。スプリプトはpython3で、ツイートのリアルタイム取得には、Twitter APIのstatuses/filter.json
を利用しています。
システム概略図
こんなシステム構成を想定します。この記事では、この図の左下にあるtwitter_monitoring.py
のスクリプトの例を紹介します。
スクリプトの動作としては、Twitter APIのstatuses/filter.json
で特定キーワードを含むツイートを取得し、Slack API経由でそのツイートをSlackbotが任意のチャネルに投稿するようにします。
事前準備
Twitter APIとSlack APIを利用するための準備をします。
Twitter APIアカウント作成
取得対象トークン
Twitter APIアカウントを作成し、下記の4つのトークンを入手できたらOKです。
- API key
- API secret key
- Access token
- Access token secret
作成方法
アカウント作成方法については、下記サイトが参考になりました。
- https://www.itti.jp/web-direction/how-to-apply-for-twitter-api/
- https://dev.classmethod.jp/articles/twitter-api-approved-way/
- https://cre8cre8.com/python/twitter-api.htm
Slackbotの作成
Slack APIのページから、ツイートの投稿ユーザとなるBotを作成します。
取得対象トークン
Slackbot作成後に、Slack API管理サイトのOAuth & Permissions
のページから、下記のトークンを入手できたらOKです。
- Bot User OAuth Access Token
作成方法
Slackbotの作成方法については、下記サイトが参考になりました。
スコープ(権限)
Slackbotのスコープ(権限)設定は、今回の用途ではchat:write
のみ許可すれば十分です。
Pythonスクリプト
今回作成するtwitter_monitoring.py
について解説します。
コード全体
下記はPythonスクリプトのコーディング例(全45行)です。
# coding: utf-8
import json
import logging
from time import sleep
import requests_oauthlib
import slack
# Parameters
keyword = 'keyword' # 任意の検索キーワードを指定する
# Twitter parameters
consumer_key = 'xxxxxxxxxxxxxxxxxxxxxxxxx' # Twitter API key
consumer_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # Twitter API secret key
access_token = '9999999999999999999-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # Twitter Access token
access_token_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # Twitter Access token secret
# Slack parameters
bot_token = "xoxb-999999999999-9999999999999-xxxxxxxxxxxxxxxxxxxxxxxx" # Slack Bot User OAuth Access Token
channel_id = 'xxxxxxxxxxx' # Slack channel ID
# Logging
logging.basicConfig(filename='twitter_monitoring.log', format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.WARNING)
# 処理
uri = 'https://stream.twitter.com/1.1/statuses/filter.json'
twitter_session = requests_oauthlib.OAuth1Session(consumer_key, consumer_secret, access_token, access_token_secret)
slack_client = slack.WebClient(token = bot_token)
while True:
try:
logging.info("Request to Twitter API.")
twitter_response = twitter_session.post(uri, data=dict(track=keyword), stream=True)
if twitter_response.status_code != 200: # Twitter rate limitに引っかかった場合など
logging.warning("status_code:%s, reason:%s", twitter_response.status_code, twitter_response.reason)
sleep(900) # 15分待機
continue
for line in twitter_response.iter_lines():
if not line: # 該当ツイート無し
logging.info("No any tweets.")
continue
tweet_dict = json.loads(line.decode("utf-8"))
tweet_link = 'https://twitter.com/i/web/status/' + tweet_dict['id_str']
slack_response = slack_client.chat_postMessage(channel = channel_id , text = tweet_link) # ツイートのリンクをSlackに転送
except Exception as e:
logging.error(f'{e}')
設定パラメータ
コード自体が短いので、この例ではスクリプト内に設定パラメータを埋め込んでいます。下記の変数に、各種トークンとパラメータの値を指定します。
分類 | 対象 | 変数名 | 説明 |
---|---|---|---|
トークン | consumer_key | Twitter API key | |
トークン | consumer_secret | Twitter API secret key | |
トークン | access_token | Twitter Access token | |
トークン | access_token_secret | Twitter Access token secret | |
トークン | Slack | bot_token | Slack Bot User OAuth Access Token |
パラメータ | keyword | Twitterの検索キーワード | |
パラメータ | Slack | channel_id | 投稿先Slack チャネルID1 |
キーワードに一般的な用語を指定してこのスクリプトを実行すると、転送先のSlackチャネルが大量のツイートで溢れかえってしまう可能性があるため、まずはテスト用のSlackチャネルで試すことを推奨します。
ロギング設定
デバッグ用にlogging
の設定を入れていますが、不要であれば削除しても大丈夫です。このまま実行すると、下記の動作をします。
- 実行時に同じディレクトリ上に
twitter_monitoring.log
のログファイルが出力される。 -
logging.info
で定義されたログも出力するには、事前にコード内のlogging.basicConfig
のlevel
パラメータをlogging.INFO
に変更しておく。
スクリプト実行方法
下記の方法で、Pythonスクリプトを実行します。
Pythonライブラリ
必要なPythonライブラリを、事前にインストールしておきます。
sudo pip install --upgrade pip
sudo pip install slackclient
sudo pip install requests_oauthlib
sudo pip install logging
実行コマンド
下記コマンドで、pythonスクリプトを実行します。
nohup python twitter_monitoring.py &
nohupで実行することで、Python実行機からログアウトしても、スクリプトが実行され続けるようにします。
以上で完了です。実行後、keywordに指定した文字列を含むツイートのリンクが、転送先のSlackチャネルにリアルタイムに転送され続けることを確認します。
結果
成功すると、ツイートがSlackにこのように転送されるようになります。
備考
-
SlackチャネルのリンクURLの末尾部分。 ↩