Создаём Slack бота для отслеживания вашего бренда в Twitter

Создаём Slack бота для отслеживания вашего бренда в Twitter
Сегодня мы рассмотрим как отслеживать упоминания нашего домена в 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))

Деплой

Я запускаю этот скрипт на своём сервере. Так как я хочу, чтобы он работал круглосуточно, я написал командный сценарий, который оживляет скрипт при его остановке (Об этом я писал в предыдущей статье).

Результат

При любом упоминании нашего домена, мы получаем уведомление об этом:

Создаём Slack бота для отслеживания вашего бренда в Twitter

По материалам «How to Write a Simple Slack Bot to Monitor Your Brand on Twitter»

Leave a Comment