Расширяя базовые возможности 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()
Полный код можно посмотреть тут. Спасибо за внимание.
Автор: alexhouse