python

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

  • суббота, 16 апреля 2016 г. в 03:13:39
https://habrahabr.ru/post/281597/
  • Python
  • API


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

Полный код можно посмотреть тут. Спасибо за внимание.