Как написать чат-бота для vk.com за 3 минуты

К сожалению, на данный момент нет хороших библиотек на Python2, для того, чтобы быстро создать чат-бота. Ниже я покажу, как легко можно написать примитивного чат бота для VK, используя API VK.


Статья написана для новичков, чтобы показать, что ничего сложного в написании ботов на Python нет.


Авторизация


Нам понадобится библиотека vk_api. Авторизоваться в вк можно двумя способами:
— Как пользователь
— Как сообщество


В первом случае надо будет ввести логин и пароль. Во втором случае в группе надо включить "Сообщения сообщества" и создать ключ доступа к API:


image


image


Авторизация в две строчки:


import time
import vk_api
vk = vk_api.VkApi(login = 'login', password = 'password')
#vk_api.VkApi(token = 'a02d...e83fd') #Авторизоваться как сообщество
vk.auth()

Отправка сообщений


Теперь напишем короткую функцию, которая отправляет сообщение выбранному человеку.


P.S. Сообщество может отправлять сообщения только ранее писавшим пользователям.


def write_msg(user_id, s):
    vk.method('messages.send', {'user_id':user_id,'message':s})

В vk.method мы можем вызывать любой метод из VK API и передавать параметры в виде словаря.


В данном случае мы вызываем метод messages.send и в качестве параметров передаем id пользователя и текст сообщения.


Прием сообщений


Отлично! Отправлять сообщения мы научились, осталось научиться их принимать. Для этого нам нужен метод messages.get.


Несколько параметров, на которые стоит обратить внимание:


1) out — если этот параметр равен 1, сервер вернет исходящие сообщения.
2) count — количество сообщений, которое необходимо получить.
3) time_offset — максимальное время, прошедшее с момента отправки сообщения до текущего момента в секундах.
4) last_message_id — идентификатор сообщения, полученного перед тем, которое нужно вернуть последним (при условии, что после него было получено не более count сообщений)


values = {'out': 0,'count': 100,'time_offset': 60}
vk.method('messages.get', values)

В нашем случае этот метод вернет все полученные сообщения за последние 60 сек, если их конечно было меньше 100, а если больше, то последние 100.


В итоге мы получаем список items:


{u'count': 3441,
 u'items': [{u'body': u'\u041f\u0438\u0448\u0435\u043c \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0432\u043a!',
   u'date': 1491934484,
   u'id': 7387,
   u'out': 0,
   u'read_state': 0,
   u'title': u' ... ',
   u'user_id': 23107592},
  {u'body': u'\u041f\u0440\u0438\u0432\u0435\u0442 \u0425\u0430\u0431\u0440!',
   u'date': 1491934479,
   u'id': 7386,
   u'out': 0,
   u'read_state': 0,
   u'title': u' ... ',
   u'user_id': 23107592}]}

Если объяснять простыми словами, то items — это то, что можно выделить в диалоге.


image


Финальный аккорд, делаем вечный цикл, где на каждое сообщение будем отвечать "Привет, Хабр!".


while True:
    response = vk.method('messages.get', values)
    if response['items']:
        values['last_message_id'] = response['items'][0]['id']
    for item in response['items']:
            write_msg(item[u'user_id'],u'Привет, Хабр!')
    time.sleep(1)

Чат-бот готов.


P.S. Мы запоминаем параметр last_message_id, чтобы в следующий раз обрабатывать только новые сообщения.


Полный код
# -*- coding: utf-8 -*-
import time
import vk_api
vk = vk_api.VkApi(login = 'login', password = 'password')
#vk_api.VkApi(token = 'a02d...e83fd') #Авторизоваться как сообщество
vk.auth()
values = {'out': 0,'count': 100,'time_offset': 60}

def write_msg(user_id, s):
    vk.method('messages.send', {'user_id':user_id,'message':s})

while True:
    response = vk.method('messages.get', values)
    if response['items']:
        values['last_message_id'] = response['items'][0]['id']
    for item in response['items']:
            write_msg(item[u'user_id'],u'Привет, Хабр!')
    time.sleep(1)

Получилось 17 строк кода. Успехов!


UPD 17.09.18:
К сожалению в новой версии (5.80) VK API был убран метод 'messages.get' и данная статья потеряла актуальность. Теперь для создания ботов используйте систему longpoll. Пример на модуле vk_api для Python вы можете найти тут.

Поделиться публикацией
Комментарии 16
    –3
    Все хорошо, но не осилил куда вставлять данный код. Можно было бы хотя бы на нужную инструкцию по пользованию API VK, раз для новичков.
      0
      1) Установить Python 2 или Anaconda для Python 2
      2) Установить библиотеку vk_api. Для этого в командной строке надо ввести
      pip install vk_api
      3) Создать текстовый файл, вставить в него полный код и назвать, например, bot_vk.py
      4)В командной строке написать python <путь к файлу>. Например:
      python /home/bot_vk.py
        0
        Спасибо, будем разбираться)
          –2
          А ещё установить pip
      0
      интересно только одно, почему python2?
        0
        Да, вы верно заметили. Данный код будет работать и на python2 и на python3.
          0
          Спустя пол года я понял, что ошибся. На python3 такой бот работать не будет, так как библиотека vk_api поддерживает только python2
        0
        А почему не lopngpool? Вот пример для новичков.
          0
          Спасибо, я его не видел) Еще есть LOLBOT для VK, новичкам тоже можно ознакомиться.
          0
          Установил библиотеку, создал файл, написал в командной строке путь к файлу, а что дальше должно произойти? Просто открывается сам файл с кодом и более ничего не происходит. Делаю в первый раз, сложный процесс, однако…
            0
            Если вы все сделали правильно, не забыли вставить свой логин и пароль, то после команды python <путь к файлу> скрипт должен запуститься и чат бот начать работать. При этом сам файл с кодом не должен открываться.
            0
            Всё сделал правильно на этот раз, но пишет, что не пройдена двухфакторная аутентификация. Приходит код, но я не понимаю, куда его вставлять…
              0
              скажите, плиз, что за библиотека vk_api?
              эта https://github.com/python273/vk_api/wiki?
                0
                да
                0
                vk_api.VkApi(token = 'a02d...e83fd') #Авторизоваться как сообщество
                

                при таком подходе auth() валится с ошибкой LoginRequired('Login is required to auth'). Указание auth(token_only=True) не помогает

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое