Расширяя базовые возможности Slack, столкнулся с проблемой интеграции некоторых соц.сетей в чаты.
Чтобы подружить Slack и Вконтакте, было решено использовать Python и API. Ниже базовый рецепт того, как научить Slack-бота получать информацию о последних комментариях из постов на стене групп или сообществ Вконтакте.
Slack API
У популярного месенджера Slack есть удобный и простой API. С его помощью можно легко управлять чат-ботами и проводить различные манипуляции с каналами. Здесь представлен самый простой вариант по созданию чат-бота:
1. Откройте Slack.com (вы уже должны быть зарегистрированы в нем, для управления вашей командой).
2. Перейдите в управление приложениями slack.com/apps и откройте "Configure".
3. Откройте «Custom Integrations» и создайте своего первого бота для Slack. (Придумайте имя, выберите комнату, куда он будет отправлять сообщения)
4. Slack выдаст вам API token, который вы будете использовать для авторизации бота.
Slack-Bot.py
Начальная стадия пройдена, приступим к написанию бота. Для работы нам нужен установленный Python 3 и некоторые дополнительные библиотеки для работы c API. Устанавливаем slacker и VK_api:
$ pip install slacker $ pip install vk_api
Создаем базовый файл Slack-Bot.py в любом редакторе кода и начинаем писать нашего бота.
Импортируем нужные библиотеки:
from slacker import Slacker import vk_api
Авторизуемся по token в Slack:
slack = Slacker('Полученный ранее API token')
Авторизуемся в VK.com:
login, password = 'Login', 'pass' vk_session = vk_api.VkApi(login, password) try: vk_session.authorization() except vk_api.AuthorizationError as error_msg: print(error_msg) return vk = vk_session.get_api()
А теперь научим нашего бота получить информацию со стены групп Вконтакте:
man_id = str(-29534144) #id группа, с которой будем брать посты и комментарии postidlist = vk.wall.get(owner_id=man_id, count=1, offset=0) #получаем последний пост со стены a = str(postidlist['items'][0]['id']) #получаем id поста в виде цифры и записываем response = vk.wall.getComments(owner_id=man_id, post_id=a, count=1, sort='desc', offset=0) #Получаем последний комментарий в последнем посте со стены
По стандарту ответ приходит в виде массива, чтобы вытащить текст, надо выбрать интересующие нас строки:
b = response['items'][0]['text'] #вытаскиваем из ответа только текст
Теперь полученный текст отправляем ботом в Slack (параметр #vk означает комнату куда бот отправить сообщение):
slack.chat.post_message('#vk', 'Новый комментарий: ' + b) #отправляем сообщение с текстом в Slack
Так мы получили базовый функционал по получению комментариев со стены групп Вконтакте и отправки их в комнаты Slack.
Логика работы скрипта следующая:
1. Авторизуемся в Slack и Вконтакте;
2. Запрашиваем у выбранной группы последний пост;
3. Получаем из поста последний комментарий;
4. Отправляем комментарий в Slack.
Можно модифицировать бота и расширить его функционал, добавив ему проверку стены группы с определенной периодичностью и отправлять новые комментарии в Slack.
Итоговый код работающего бота:
from slacker import Slacker import vk_api import time slack = Slacker('Вставить token Slack bot') def main(): login, password = 'login', 'pass' vk_session = vk_api.VkApi(login, password) try: vk_session.authorization() except vk_api.AuthorizationError as error_msg: print(error_msg) return vk = vk_session.get_api() while True: #зацикливаем man_id = str(-29534144) #id группы с которой будем брать посты и комментарии postidlist = vk.wall.get(owner_id=man_id, count=1, offset=0) #получаем последний пост a = str(postidlist['items'][0]['id']) #получаем id поста в виде цифры и записываем time.sleep(5) ts = 10 bts = 10 while ts == bts: #сравниваем два числа времени комментариев, цикл выполняется до тех пор, пока цифры равны. response = vk.wall.getComments(owner_id=man_id, post_id=a, count=1, sort='desc', offset=0) #Получаем последний комментарий ts = str(response['items'][0]['date']) #запрашиваем время комментария time.sleep(5) #ожидание 5 секунд response = vk.wall.getComments(owner_id=man_id, post_id=a, count=1, sort='desc', offset=0) bts = str(response['items'][0]['date']) print('новых комментариев нет ' + ts + bts) time.sleep(5) #если время у комментариев разное цикл прекращается response = vk.wall.getComments(owner_id=man_id, post_id=a, count=1, sort='desc', offset=0) # получаем комментарий со стены b = response['items'][0]['text'] #вытаскиваем из него только текст slack.chat.post_message('#vk', 'Новый комментарий: ' + b) #отправляем сообщение с текстом в Slack и повторяем цикл if __name__ == '__main__': main()
Полный код можно посмотреть тут. Спасибо за внимание.
ссылка на оригинал статьи https://habrahabr.ru/post/281597/
Добавить комментарий