Сегодня мы рассмотрим как отслеживать упоминания нашего домена в Twitter и постить об этом в канал Slack. Для этого отлично подойдут модули slacker и twython. Также мы используем configparser и logging в нашем проекте.
Настройки проекта
Мы будем использовать slacker и twython, поэтому установите их с помощью pip install или выполните команду pip install -r requirements.txt (после создания virtual env).
Вам понадобится токены от Twitter API и от Slack.
С помощью configparser мы прочитаем эти токены из конфигурационного файла. Внимание: это только шаблон конфига, настоящий мы добавили в игнор-лист, чтобы защитить эти секретные данные.
В случае со Slack вы должны сначала создать бота и добавить его в ваш канал.
Разработка
Полный код проекта находится здесь. Ниже я разберу его по шагам:
— импортируем настройки и токены:
import configparser
import logging
from slacker import Slacker
from twython import TwythonStreamer
config = configparser.ConfigParser()
config.read('config.ini')
CONSUMER_KEY = config['Twitter']['cs_key']
CONSUMER_SECRET = config['Twitter']['cs_secret']
ACCESS_TOKEN = config['Twitter']['acc_token']
ACCESS_SECRET = config['Twitter']['acc_secret']
SLACK_TOKEN = config['Slack']["token"]
— Зададим несколько констант. Помните, что CHANNEL должен содержать знак #, а домен для отслеживания должен быть задан как кортеж. Сообщение составлено так, чтобы можно было быстро перейти к твиту и понять кто его запостил:
CHANNEL = '#pybites-mentions'
DOMAIN = ('pybit', 'es')
MSG = '''A new mention of {domain}:
{user} (name: {name} / followers {followers}) tweeted:
{tweet_text}
Link to tweet: https://twitter.com/{user}/status/{tweet_id}
'''
— Создадим объект Slacker:
slack = Slacker(SLACK_TOKEN)
— настроим логгирование для возможной отладки в будущем:
logging.basicConfig(level=logging.DEBUG,
format='{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}(asctime)s {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}(name)-12s {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}(levelname)-8s {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}(message)s',
datefmt='{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}m-{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}d {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}H:{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}M',
filename='bot.log')
— Метод создания сообщения в канале Slack:
def create_post(data):
tweet_text = data['text']
tweet_id = data['id_str']
user = data['user']['screen_name']
name = data['user']['name']
followers = data['user']['followers_count']
return MSG.format(domain='.'.join(DOMAIN),
user=user,
name=name,
followers=followers,
tweet_text=tweet_text,
tweet_id=tweet_id)
— Очень круто, что у нас есть Streaming API. TwythonStreamer позволяет очень легко начать мониторить Twitter: всего 6 строк кода в документации и 10 здесь, так как мы добавили обработку исключений, логгирование и постинг в Slack:
class MyStreamer(TwythonStreamer):
''' https://twython.readthedocs.io/en/latest/usage/streaming_api.html '''
def on_success(self, data):
post = create_post(data)
logging.debug(post)
try:
slack.chat.post_message(CHANNEL, post, as_user=True)
except Exception as exc:
logging.error('cannot post to channel: {}'.format(exc))
def on_error(self, status_code, data):
print('An error occurred: {}, exiting'.format(status_code))
self.disconnect()
— Приступим к Streamer. Внимание: pybit.es (одним словом) не работает, поэтому мы должны обрабатывать stream.statuses.filter ‘pybit es’, который работает как логическое И (подробнее об этом здесь):
if __name__ == "__main__":
stream = MyStreamer(CONSUMER_KEY, CONSUMER_SECRET,
ACCESS_TOKEN, ACCESS_SECRET)
# https://dev.twitter.com/streaming/overview/request-parameters#track
stream.statuses.filter(track=' '.join(DOMAIN))
Деплой
Я запускаю этот скрипт на своём сервере. Так как я хочу, чтобы он работал круглосуточно, я написал командный сценарий, который оживляет скрипт при его остановке (Об этом я писал в предыдущей статье).
Результат
При любом упоминании нашего домена, мы получаем уведомление об этом:
По материалам «How to Write a Simple Slack Bot to Monitor Your Brand on Twitter»
Разработчик: java, kotlin, c#, javascript, dart, 1C, python, php.
Пишите: @ighar. Buy me a coffee, please :).