Пишемо бота 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 і деякі додаткові бібліотеки для роботи з 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()

Повний код можна подивитися тут. Дякую за увагу.

Джерело: Хабрахабр
  • avatar
  • 0

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.