пишем чат бота для вконтакте на python с помощью longpoll / хабр

Описание задачи и пути решения

Мне потребовалось найти VK-группы в заданном городе по нескольким ключевым словам, чтобы запустить на них рекламу. Эти группы нужно было где-то сохранить, чтобы не искать каждый раз по новой.

По каждой группе мне важна следующая информация:

  • id — чтобы использовать в рекламе;
  • name — чтобы оценить подходит группа или нет (Например, для ключевого слова «ремонт» может быть ремонт квартир или ремонт машин);
  • members_count — чтобы оценить размер группы;
  • contacts — чтобы получить список id пользователей, на которых не следует давать рекламу;
  • группы должны быть отсортированы по отношению дневной посещаемости к количеству пользователей — чтобы не использовать группы, которые никто не посещает.

Сначала, я начал искать группы используя стандартный поиск. Но это оказалось очень не быстро. На пятой группе я призадумался о более быстром способе.

Установка Python 3.7.3 на Windows.

Установка не занимает много времени и умений. Переходим на официальный сайт

Установка PyCharm и его настройка.

Переходим на сайт 

Создание проекта и установка библиотеки VK_API

В Pycharm выбираем: File -> New Project и создаем новый проект, выбрав необходимые настройки:

Пишем чат бота для ВКонтакте на python с помощью longpoll / Хабр

Теперь создаем новый файл, назовем его

new.py

, так как Python использует расширение

.py 

(английскими буквами, не путайте) расширение указывать не обязательно.

Пишем чат бота для ВКонтакте на python с помощью longpoll / Хабр

Пишем наш первый самый простой код:

print("Привет :)")

И нажав правой кнопкой мыши по файлу, выбираем: Run ‘new’

Пишем чат бота для ВКонтакте на python с помощью longpoll / Хабр

Все работает. Теперь нам нужно установить библиотеку vk_api, для этого открываем терминал прямо в PyCharm и пишем команду:

pip install vk_api

Пишем чат бота для ВКонтакте на python с помощью longpoll / Хабр

Installing collected packages: urllib3, chardet, idna, certifi, requests, enum34, six, vk-apiRunning setup.py install for vk-api … doneSuccessfully installed certifi-2022.6.16 chardet-3.0.4 enum34-1.1.6 idna-2.8 requests-2.22.0 six-1.12.0 urllib3-1.25.3 vk-api-11.4.0

Если в конце видите такой текст, библиотека успешно установлена, можно импортировать ее в проект и писать первый код:

Запуск скрипта используя LongPoll VK.

Для начала настроим наше сообщество.

Создаем ключ

Пишем чат бота для ВКонтакте на python с помощью longpoll / Хабр

Копируем ключ и вставляем его в наш скрипт:

Вместо ‘

your_group_token

‘ указываем ключ сообщества

Вместо ‘

your_group_id

‘ указываем ID нашего сообщества

Теперь переходим во вкладку Long Poll APIи включаем его
Пишем чат бота для ВКонтакте на python с помощью longpoll / Хабр
Далее, обязательно включаем тип событий, это частая ошибка при создании ботов, забыв включить события, бот не будет работать! Выбираем все что есть.
Пишем чат бота для ВКонтакте на python с помощью longpoll / Хабр
Пишем чат бота для ВКонтакте на python с помощью longpoll / Хабр
Давайте покинем сообщество и снова вступим в него:
Пишем чат бота для ВКонтакте на python с помощью longpoll / Хабр
В консоли мы сразу увидели последние события. Немного добавим строк в наш код, и научим отвечать наше сообщество сообщением в ЛС на одно из событий:

Импортируем:

from vk_api.utils import get_random_id

После:

Разница между CallBack API и LongPoll

И все же в чем разница между CallBack API и Long Poll API? А разница есть и она большая.

Когда Вы используете CallBack API, ВК сам отправляет Вам происходящее событие на сервер, нам остается только получить его и обработать, у Long Poll API все наоборот, ВК ничего не отправляет, а хранит все события у себя на серверах, Вам нужно самому их получать и обрабатывать, Long Poll API подходит для высоко нагруженных проектов, в идеале советуем использовать оба типа получения событий.

kissing_heart

Разработка ботов на заказ, любой сложности, обращаться:

Android (java)

Еще одна официальная библиотека, на этот раз — для Android. Написана на Java и позволяет сильно упростить работу с API ВКонтакте из этого языка.

Пример отправки запроса:

request.executeWithListener(new VKRequestListener() {
   @Override
   public void onComplete(VKResponse response) {
       //Do complete stuff
   }
   @Override
   public void onError(VKError error) {
       //Do error stuff
   }
   @Override
   public void onProgress(VKRequest.VKProgressType progressType,
                                    long bytesLoaded,
                                    long bytesTotal)
   {
       //I don't really believe in progress
   }
   @Override
   public void attemptFailed(VKRequest request, int attemptNumber, int totalAttempts) {
       //More luck next time
   }
});

Golang

Как ни странно, была написана обёртка для VK API и на языке Go. Так же, как и остальные, она доступна на Github. Hello World на ней выглядит так:

Ios (objective c)

Официальная библиотека от ВКонтакте, предназначенная для написания приложений под iOS. Написана на Objective-C.

Пример кода с отправкой запроса:

Node.js

Node-vkapi — современная библиотека для JavaScript, основанная на промисах. Она доступна так же в npm:

npm install node-vkapi --only=prod --save

Вот пример кода, который публикует текст на стену пользователя с помощью node-vkapi:

Python и longpoll vk, или как запустить скрипт вк и настроить python, для новичков

Статьи / Python

Пишем чат бота для ВКонтакте на python с помощью longpoll / Хабр

Это новый вид статьи, в котором мы не будем говорить про PHP, многим python превосходит php, а для начинающих он покажется проще. Данная статья будет содержать в себе следующие шаги:

1. Установка Python 3.7.3 на Windows.2. Установка PyCharm и его настройка.3. Создание проекта и установка библиотеки VK_API4. Запуск скрипта используя LongPoll VK.5. Разница между CallBack API и LongPoll

Windows phone (c#)

Последняя в этом списке официальная разработка: написанная на C# базовая библиотека для разработки на WP, похожая по функциональности на свои аналоги под Android и iOS.

Отправка запроса на список друзей:

Авторизация

vk_session = vk_api.VkApi(token='#ВСТАВЬ СЮДА ТОКЕН ГРУППЫ СО ВСЕМИ РАЗРЕШЕНИЯМИ')

Авторизовались как группа. Важно создать такой токен, который будет разрешать отправку, прием, обработку сообщений и, в принципе, все что нам захочется.

Внимание

… переменные

key, serverts

необходимо заполнить. Эти переменные нужны для установки связи с сервером VK. Чтобы узнать эти переменные, а они у всех свои, нужно

авторизованным

перейти на сайт

и во вкладке «Пример запроса» ввести ID своей группы.

random_id — это случайный id сообщения, который в новых версиях VK_API теперь обязателен.

chat_id — это идентификатор беседы, из которой пришел event или иначе говоря сообщение.

if ‘Клавиатура’ in str(event):

Графический или web интерфейс

Если будет такой запрос, то можно добавить графический или веб интерфейс и обработку ошибок. Для своих внутренних нужд, я вряд ли буду это делать. Но, если будет такой запрос, то почему бы и нет.

***

Пишите в комментариях, какое ещё развитие программы вы хотели бы видеть.

Как использовать vk api в python

Реализация описанного выше алгоритма на Python-е оказалась проще, чем я ожидал. От начала программирования до рабочей версии программы прошло около 40 минут. Получается, если бы я сразу начал программировать, то всё получилось бы быстрее часа на два.

Для реализации взял первую попавшуюся библиотеку для работы с VK в Python-е. Установил её следующей командой:

Как использовать vk api через браузер

Для работы с VK API через браузер, прежде всего, необходимо получить так называемый access_token.

Делается это очень просто. Нужно просто указанный ниже код вставить в адресную строку браузера.

Как оно работает?

Всё очень просто, в vk api есть такая штука, называется

работает она так:

Long Polling — это технология, которая позволяет получать данные о новых событиях с помощью «длинных запросов». Сервер получает запрос, но отправляет ответ на него не сразу, а лишь тогда, когда произойдёт какое-либо событие (например, придёт новое сообщение), либо истечёт заданное время ожидания.

Говоря русским языком, мы отправляем на сервер запрос, а он в свою очередь тыкает вконтакте если там произойдёт что либо, например, нам придёт сообщение он бежит и говорит об этом нам. От этого и будем плясать.

Классическое консольное приложение

Задавать параметры в коде программы вполне приемлемый способ для программиста. Однако, для простого пользователя — это слишком. Не мудрено ненароком испортить программу. Поэтому лучше реализовать передачу параметров через командную строку, как в классическом консольном приложении.

Кнопки

Теперь объявим пару функций для кнопок, которые наш бот в будущем будет выдавать по требованию. К ним мы обратимся вскоре ещё раз.

keyboard = VkKeyboard(one_time=True)
keyboard.add_button('Привет', color=VkKeyboardColor.NEGATIVE)
keyboard.add_button('Клавиатура', color=VkKeyboardColor.POSITIVE)
keyboard.add_line()
keyboard.add_location_button()
keyboard.add_line()
keyboard.add_vkpay_button(hash="action=transfer-to-group&group_id=183415444")

Контакты в отдельный файл

Контакты групп часто нужны, чтобы не показывать на них рекламу. Для этого нужно собрать id всех пользователей из контактов в отдельный файл. В текущей реализации это придётся делать вручную. Между тем добавить такой функционал совсем несложно и займёт минут 15.

Метод database.getcities

Этот метод я использовал, чтобы получить код (id) города, в котором искать нужные мне группы. Привожу для примера свой запрос. Вам нужно будет поменять ключ доступа access_token и город q на свой.

Метод groups.getbyid

Этот метод я использовал, чтобы получить список групп города соответствующих запросу со всеми необходимыми по условию данными. Пример запроса ниже.

Метод groups.search

Этот метод я использовал, чтобы получить id групп соответствующих запросу по ключевому слову. В нижеприведённом примере нужно будет заменить аргументы access_token, city_id и q на соответствующие ваши.

Нюансы

Дело в том, что в одной программе нельзя одновременно запустить бота для ответов на ЛС и для работы в беседе, поскольку для этого используются два разных модуля longpool и как только запускается прослушивание longpool-ом на канале «ЛС»(Личные Сообщения) прослушивание другого канала, т.е. чата недоступно, пока не завершится первый процесс прослушивания. Проще говоря задачи могут выполняться исключительно последовательно, а не параллельно. Поэтому в целом коде я деактивирую часть с ЛС, заключив ее в ”’ кавычки.

Теперь импортируем то же самое, но для ЛС.

Lslongpoll = VkLongPoll(vk_session)
Lsvk = vk_session.get_api()

Прием-отправка сообщений из беседы

А теперь будем слушать longpool на предмет новых сообщений.

event

— переменная в которой будет храниться само сообщение и некоторые данные о нем.

Пути развития программы

Программа полностью выполняет свою задачу. Но это не значить, что её нельзя сделать лучше. Я здесь вижу несколько направлений развития.

Расширение функционала

По мере необходимости можно расширять функционал программы. Например, добавить возможность извлекать пользователей — членов групп и делать их пересечение. Строить списки пользователей, которые состоят в 2-х группах и тому подобное. Пока такой необходимости не было, но если понадобится, то дописать код будет гораздо быстрее, чем делать всё вручную.

С чего начать?

Начнем с

установки

необходимых

библиотек

. Естественно открываем cmd.exe ( в некоторых случаях может понадобиться запустить от имени администратора) и прописываем туда следующее:

pip install vkpip install vk_api

Мы установили две библиотеки для работы нашего Python-а с сервисом VK.

Теперь запускаем IDLE и начинаем писать код.

import vk_api, vk
from vk_api.keyboard import VkKeyboard, VkKeyboardColor
from vk_api.utils import get_random_id

Объясняю: импортируем установленные ранее библиотеки и модули для работы с ними.

Ссылки на примеры и документацию


Документация по VK api

На этом я с вами попрощаюсь. Хорошего кодинга.

Часть с личными сообщениями

Теперь отпишем вторую часть для ЛС без особых подробностей.

Похожее:  Single sign-on на omniauth и rails / Хабр

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

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