Пишем бота Slack для получения комментариев из VK на Python

от автора

Расширяя базовые возможности 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *