Массовая рассылка писем с помощью Python – Алексей Лавриненко | Oleksiy Lavrynenko – PR, SMM, WEB

Прямая ссылка

Для прочих площадок используйте прямую ссылку на чат-бота. Она находится в аккаунте SendPulse, под названием бота:

В своем аккаунте SendPulse вы можете скопировать прямую ссылку на любого из ваших ботов
В своем аккаунте SendPulse вы можете скопировать прямую ссылку на любого из ваших ботов

Ссылку можно использовать в постах. Например, медицинский центр опубликовал пост с полезной памяткой и пригласил подписываться на рассылку ВКонтакте:

Пост в группе со ссылкой на рассылку
Пост в группе со ссылкой на рассылку

Или используйте ссылку в рекламном объявлении и собирайте в бота не только участников своей группы, а любых подходящих пользователей:

Пост с рекламой рассылки сообщений ВК
Пост с рекламой рассылки сообщений ВК

Ссылку можно использовать и вне ВК: например, в email рассылке или в других соцсетях.

Когда пользователь нажимает на такую ссылку, он переходит сразу в диалог с сообществом. Вот как это выглядит:

Переход в чат с сообществом по прямой ссылке

Обратите внимание — под окном набора сообщения есть большая синяя кнопка «Начать», и многие ваши пользователи захотят на нее нажать. Это кнопка запускает приветственную цепочку сообщений в чат-боте. Если вы не настраивали эту цепочку, то пользователь получит стандартное приветственное сообщение, которое заложено во всех ботов SendPulse:

Стандартное приветственное сообщение чат-ботов SendPulse
Стандартное приветственное сообщение чат-ботов SendPulse

Если вас устраивает такое приветствие — оставьте. Если нет — отредактируйте его по инструкции из нашей статьи о чат-ботах ВКонтакте.

Статья по теме. «Учимся создавать приветствие чат-бота. Важные правила и примеры из жизни».

Итак, мы подключили бота, по необходимости настроили его приветствие, собрали аудиторию. Теперь можно приступать к самой рассылке.

Заходим в нужного бота и нажимаем кнопку «Создать рассылку»:

Находим кнопку «Создать рассылку»
Находим кнопку «Создать рассылку»

Где взять аудиторию?

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

1. Призыв подписаться на сайте. У нас на блоге Вы можете лицезреть такой вариант. Мы обещаем вкусную полезность за Ваше согласие.

рассылка вк
Призыв подписаться на сайте

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

как сделать рассылку вконтакте
Призыв подписаться в сообществе

Лимиты вк в 2022 за сутки | tvoyvk.ru

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

Обзор популярных программ и сервисов для рассылки и продвижения в ВК

Программа для рассылки и продвижения в Telegram

Лимит постов в сутки на стены пользователей – 40 постов 

Лимит постов на стены сообществ за день – 100 постов 

Лимит комментариев в сутки к постам/видео – 100 комментариев 

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

Лимит личных сообщений не друзьям – 20 в 12 часов 

Лимит личных сообщений друзьям – 300 в сутки

Лимит сообщений в лички групп – точные лимиты неизвестны, но отправлять 100-150 в сутки с паузой в несколько минут реально

Лимит заявок в друзья – 100 заявок за 24 часа

Лимит на рассылку приглашений в группу – 40 человек

Лимит лайков – 500 в 12 часов 

Лимит участников в беседе – 500 человек

Лимит на создание бесед за день – 20 штук

Лимит загружаемой фотографии – 5 МБ 

Лимит на длину статуса – 140 знаков

Лимит длины комментария к посту – 280 знаков

Пауза между отправкой сообщений друзьям – от 30 секунд

Пауза при отправке не друзьям – от 2 минут

Пауза между отправкой постов на стены и комментарии в группы – от 1 минуты

Пауза при отправке заявок в друзья – от 10 минут

Пауза при инвайте в группу – от нескольких минут  

ВАЖНО!!!!!

Помните, что главные условия рассылки без бана в Вк – это лояльная аудитория, которая не будет жаловаться на спам, качественно отобранные группы без “злых” модераторов, хорошие аккаунты, разнообразные и ненавязчивые тексты и “белые” ссылки в сообщении, а также использование качественных прокси для ВК. При халатном подходе и игнорировании вышеперечисленного, никакое соблюдение лимитов Вк вас не спасет.

Полезные статьи по теме:

Многофункциональная программа для рассылки и продвижения ВКонтакте

Настройка и запуск рассылки сообщений в Телеграмме

Спам бот для рассылки в дискорд

Где купить прокси разных стран для обхода блокировок: мобильные 4G, LTE или анонимные ipv4

Сервисы рассылки

Рассылать сообщения вручную — очень долго. Лучше доверить эту работу специальным сервисам. Они не только помогут автоматизировать весь процесс, но и сведут к минимуму вероятность бана за счет персонализации сообщений и учета лимитов.

Senler — один из лучших и безопасных сервисов для массовой рассылки сообщений в ВК по списку своих подписчиков.

Основные функции сервиса: автосообщения, персонализация сообщений, планировщик рассылки, командный доступ, интеграция с ВК, статистика. Рассылку можно сделать целевой, обозначив, кто именно должен ее получить. Сервис так же подходит для создания чат-ботов с автоматической воронкой продаж.

Плюсы:

  • Простой и понятный интерфейс;
  • Активная служба поддержки;
  • 50 сообщений в день бесплатно;
  • Есть возможность командной работы;
  • Возможность прикрепить к сообщению документы, фото, видео, ссылки.

Минусы:

  • Рассылает сообщения только по тем, кто подписался на рассылку от сообщества.

📑 Как настроить рассылку в Senler:

  1. Зарегистрируйте кабинет на сайте;
  2. Авторизуйтесь через “ВКонтакте”;
  3. Нажмите кнопку “подключить сообщество”;
  4. Выберите нужное сообщество;
  5. Откройте вкладку “группы подписчиков”, нажмите “новая группа”;
  6. Укажите любое название группы для рассылки;
  7. Оформите внешний вид подписки (название, баннер, копка и т.п.);
  8. Создайте автосообщение или целевое письмо.

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

Цены: зависят от количества сообщений. Например, 2 000 сообщений в сутки — 300 рублей в месяц.

ArtSend — сервис массовой рассылки ВКонтакте с возможностью аналитики и автоворонки. Вы сможете не просто отправить сообщение, но и проверить, сколько человек его прочитали, и какие действия после этого предприняли (например, перешли по ссылке).

Из доп. функций: автолимиты, встроенная аналитика.

Плюсы:

  • Не ограничений по количеству сообщений;
  • Сервис одобрен ВК;
  • Возможность проанализировать отклик на каждое сообщение.

Минусы:

  • Нет шаблонов сообщений;
  • Подходит только для рассылки по подписчикам.

📑 Как настроить рассылку в ArtSend:

  1. Откройте сайт сервиса и нажмите “Попробовать бесплатно”, после “Установить ваше сообщество”;
  2. В разделе “Рассылки” кликните “Создать тему” и заполните все необходимые поля, чтобы оформить подписку на рассылку в сообществе (только после того как сформируется список подписавшихся на рассылку, ее можно будет запустить);
  3. Для настройки разовой рассылки кликните “Разовая рассылка” и заполните пустые поля.

Цены: зависят от периода оплаты. 500 рублей за месяц, 2 800 рублей за полгода, 5 000 рублей за год. Есть бесплатный тариф с ограниченным функционалом.

Gandy Mail — cервис массовых рассылок ВК. Позволяет добавить к любому сообщению фото, товары, документы, посты, статьи, видео, GIF, аудио. Есть около 10 шаблонов сообщений, и возможно запланировать рассылку на конкретное время.

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

Плюсы:

  • Возможность персонализировать сообщение;
  • Можно планировать отложенные сообщения;
  • Есть партнёрская программа.

Минусы:

  • Рассылка только по подписчикам.

📑 Как настроить рассылку в Gandy Mail:

  1. Откройте сервис, нажмите “Попробовать бесплатно”;
  2. Найдите раздел “Мои группы” и добавьте свой паблик;
  3. В разделе “Создание рассылок” укажите название рассылки, описание, текст сообщения.

Если возникнут сложности, обратитесь в службу поддержки за помощью.

Цены: 900 рублей в месяц. Пробный период — 3 дня.

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

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

Из дополнительных функций: интеграция с CRM, статистика, планировщик рассылки, приветственные сообщения, фильтры.

Плюсы:

  • Гибкая система оплаты;
  • Есть готовые шаблоны для рассылки;
  • Есть планировщик рассылки;
  • Подходит для создания чат-бота с цепочкой сообщений.

Минусы:

  • Риск бана аккаунта, с которого осуществляется рассылка;
  • Долгое ожидание ответы от службы поддержки;
  • Нужно строить бота в конструкторе;
  • Не самый удобный интерфейс.

📑 Как настроить рассылку в SendPulse:

  1. Подключите к сервису профиль ВК;
  2. Зайдите в раздел “Чат-боты”, пройдите авторизацию через ВК;
  3. Выберите сообщество, которое хотите подключить для рассылки сообщений;
  4. С помощью визуального конструктора, следуя инструкции, постройте чат-бота;
  5. Добавьте приветствие, цепочку сообщений по ключевым словам;
  6. Запустите бота.
Читайте также  Как создать вторую страницу в ВК на один номер? Можно ли сделать 2 страницы на 1 номер? Завести второй аккаунт без номера телефона

Цены: от 0.35 рублей за одно сообщение.

Сервис 2seller не просто рассылает сообщения, но и находит потенциальных клиентов в группах ВКонтакте. Каждый день он может рассылать до 5 700 сообщений. Через него можно рассылать информацию о скидках, ссылку на группу, рекламу с грамотно составленным УТП. Но при этом нужно иметь несколько аккаунтов, которые не жалко потерять. Ведь такая рассылка считается спамом.

Плюсы:

  • Рассылка по потенциальным клиентам;
  • Доступ к бесплатному мини-курсу по запуску рассылок;
  • Недорогое привлечение клиентов и подписчиков;
  • Есть рассылка по готовым базам пользователей под разные типы бизнеса.

Минусы:

  • Нет фиксированного тарифа;
  • Сложный интерфейс;
  • Не самый безопасный вариант, страницу могут заблокировать.

📑 Как настроить рассылку в 2seller:

  1. Зайдите на сайт и нажмите “Протестировать бесплатно”;
  2. Подтвердите доступ приложению;
  3. Выберите поиск: по своей базе, готовым базам, целевым группам;
  4. Подключите свой ВК-профиль;
  5. Напишите сообщение, которое нужно разослать, при необходимости прикрепите файл;
  6. Запустите рассылку.

Цены: стоимость одного лида от 5 до 20 рублей, сообщение — от 1 рубля. Пробного периода нет, но есть приветственные 30 рублей после регистрации для теста рассылки.

SocialSend — сервис для рассылки массовых сообщений через ВКонтакте. Есть возможность установить фильтр и отправлять сообщения только определённым подписчикам, например, женщинам до 30 лет, проживающим в Москве. Если автоматической отправки сообщений будет мало, можно создать чат-бота и прописать ему варианты ответа на сообщения с конкретными ключевыми запросами. Отличный вариант для создания полноценной автоворонки.

Из дополнительных функций: фильтры, интеграция с сервисом Втаргете, персонализация сообщений, внутренняя CRM система.

Плюсы:

  • Возможность отфильтровать подписчиков;
  • Понятный и удобный интерфейс;
  • Есть бесплатный тариф;
  • Работает с любым количеством подписчиков;
  • Можно создать чат-бота с цепочкой сообщений.

Минусы:

  • Иногда сообщения отправляются пользователям, отписавшимся от рассылки;
  • Подходит только для массовой рассылки по подписчикам.

📑 Как настроить рассылку в SocialSend:

  1. Зарегистрируйтесь в сервисе через профиль в ВК или по e-mail;
  2. Просмотрите обучающее видео и следуйте инструкции из него.

Цены: 5 000 сообщений бесплатно, далее от 90 рублей в месяц за 15 000 сообщений.

Функция беседа

Рассылку одного и того же текста избранным лицам создают при помощи беседы. Делается это следующим образом:

  1. зайдите на свою страничку в ВК и в левой колонке выберете «Сообщения»;
  2. в открывшемся окне нажмите сверху значок «плюс» или начало новой беседы. Здесь кликните на список друзей, которым отправляется текст;Функция беседа
  3. нажимая на них, справа появляются галочки, свидетельствующие о том, что человек выбран для беседы;
  4. сверху, в прямоугольниках, будут отображаться отмеченные участники. Если кого-то добавили по ошибке, удалите его с помощью крестика около имени или просто снять галочку;
  5. затем нажимаем «Создать беседу». После чего открывается окно, в шапке которого указано, сколько человек участвует в данной переписке.

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

Раньше было ограничение по количеству участников в чате: максимум 14 человек, затем лимит увеличивали, и с 2022 г. разрешено добавлять не более 250 друзей.

Создайте несколько чатов, если хочется поговорить или предупредить разный круг людей. Увы, но функции отправить сообщение сразу всем друзьям ВКонтакте не предусмотрено в целях борьбы со спамом.

Минус такого способа в том, что текст прочитают все участники. Если необходима отправка индивидуальных сообщений, то придется делать это вручную. Вставляйте в беседу открытку, чтобы поздравить с праздником. Групповое сообщение также создается через изображение. Для этого:

  1. Выберите необходимое фото и нажмите «Поделиться»;Вставляйте в беседу открытку
  2. В открывшемся окне, выбираем из списка пользователей и придумываем заголовок и текст.

Чат-бот для вконтакте на python на callback api

Чат-боты стали уже очень распространенным явлением, и появляются во всех мессенджерах ежедневно.

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

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

Для создания бота я использовал Python 3.5 (вероятно, подойдут и другие версии 3-го питона) и дополнительные библиотеки Flask и VK. Их надо будет установить. По установке Flask есть много статей на русском. Если у вас стоит Pycharm, то он, скорее всего, установился вместе с ним.

Начнем с самого API. Для нашего бота будем использовать Callback API, доступный для сообщений групп. Прежде всего, нам нужно создать или уже иметь группу ВКонтакте с подключенными сообщениями.

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

Для работы с Callback нужно иметь веб-сервер, который будет принимать запросы о каких-либо событиях от API, обрабатывать их и посылать ответные запросы. То есть мы напишем «сайт», который будет только отвечать на посылаемые ему запросы и посылать свои.

Поскольку пишем на питоне, самое простое, что можно использовать, — это хостинг для питона. Я пользовался бесплатным хостингом для Python. Там нужно зарегистрироваться, а затем создать приложение для питона 3.5 на Flask (создать можно в разделе Web). Будет создан начальный файл:

# A very simple Flask Hello World app for you to get started with...

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello from Flask!'

Единственная функция, которая сейчас есть в файле, отвечает за наполнение страницы по адресу, выданному при регистрации. Если перейти в браузере по адресу username.pythonanywhere.com (со своим ником), то можно увидеть только текст «Hello from Flask!».

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

Итак, БЛОК 1.
Для обработки запросов, посылаемых сайту, добавим в конце документа следующий код:

@app.route('/', methods=['POST'])
def processing():
    return 'xxxxxxxx'

Где вместо иксов подставляем «строку, которую должен вернуть сервер». Она указана в управлении группой в разделе Callback API.

Эта функция позволит нам подключить наш сайт для уведомлений к группе.

Теперь можем проверить работу. Только необходимо перезагрузить приложение. На хостинге после того, как файлы были изменены и сохранены, чтобы сайт стал работать с новыми данными, нужно его перезагрузить во вкладке Web. После добавления этого кода можем ввести соответствующий адрес username.pythonanywhere.com в строку адреса сервера в группе ВКонтакте и нажать «Подтвердить».

Должно появиться зеленое уведомление о том, что адрес сервера успешно подключен.

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

БЛОК 2
Можем переходить к следующему шагу. Добавим возможность писать сообщения от имени сообщества. Пришло время установить на хостинге библиотеку VK. В разделе Consoles запускаем bash-консоль и исполняем команду (или соответствующую для выбранной версии питона):

pip3.5 install --user vk

Как устанавливать модули описано

здесь

.

Изменим код нашей функции по обработке входящих запросов:

@app.route('/', methods=['POST'])
def processing():
    #Распаковываем json из пришедшего POST-запроса
    data = json.loads(request.data)
    #Вконтакте в своих запросах всегда отправляет поле типа
    if 'type' not in data.keys():
        return 'not vk'
    if data['type'] == 'confirmation':
        return confirmation_token
    elif data['type'] == 'message_new':
        session = vk.Session()
        api = vk.API(session, v='5.110')
        user_id = data['object']['message']['from_id']
        api.messages.send(access_token=token, user_id=str(user_id), message='Привет, я новый бот!', random_id=random.getrandbits(64))
        # Сообщение о том, что обработка прошла успешно
        return 'ok'

Сообщение о том, что обработка прошла успешно, нужно серверу ВКонтакте. Если произойдет ошибка, или придет какой-то иной ответ, сервер будет с некоторыми промежутками продолжать посылать уведомление о входящем сообщении (пока мы его не обработаем).

Структура входящего запроса, оповещающего о новом сообщении, такова:

{
    "type": "message_new",
    "object": {
        "message": {
            "date": 1592406781,
            "from_id": xxxxxxx,
            "id": 4636,
            "out": 0,
            "peer_id": xxxxxx,
            "text": "ыва",
            "conversation_message_id": 236,
            "fwd_messages": [],
            "important": false,
            "random_id": 0,
            "attachments": [],
            "is_hidden": false
        },
        "client_info": {
            "button_actions": [
                "text",
                "vkpay",
                "open_app",
                "location",
                "open_link"
            ],
            "keyboard": true,
            "inline_keyboard": true,
            "lang_id": 0
        }
    },
    "group_id": xxxxxxx,
    "event_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

Вконтакте передает нашему сайту несколько объектов: «type», «object», «group_id», а внутри «object» хранится информация о самом сообщении.

Все запросы можно посмотреть в документации ВКонтакте.

Также добавляем новые «import» в начало файла:

from flask import Flask, request, json
from settings import *
import vk
import random

Мы создали новый файл в этой же папке settings.py, в котором сохранены необходимые данные для входа:

token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
confirmation_token = 'xxxxxxxx'

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

Читайте также  Как понять, что вашу страницу ВК взломали

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

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

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

БЛОК 3
Если все прошло хорошо, и бот с вами поздоровался в ответ на ваше сообщение, переходим к следующему шагу. Вынесем все взаимодействие с библиотекой vk в другой файл, я назвал его vkapi:

import vk
import random

session = vk.Session()
api = vk.API(session, v='5.110')


def send_message(user_id, token, message, attachment=""):
    api.messages.send(access_token=token, user_id=str(user_id), message=message, attachment=attachment, random_id=random.getrandbits(64))

Пока там только одна функция и инициализация сессии ВКонтакте, потом добавим другие. Потенциально функция может также отправлять и вложения. Позже мы воспользуемся этой возможностью.

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

Файл «messageHandler.py»:

import vkapi

def get_answer(body):
   message = "Привет, я новый бот!"
   return message

def create_answer(data, token):
   user_id = data['from_id']
   message = get_answer(data['text'].lower())
   vkapi.send_message(user_id, token, message)

Осталось подключить наши новые файлы к основному. Изменяем функцию обработки запросов в главном файле:

@app.route('/', methods=['POST'])
def processing():
    data = json.loads(request.data)
    if 'type' not in data.keys():
        return 'not vk'
    if data['type'] == 'confirmation':
        return confirmation_token
    elif data['type'] == 'message_new':
        messageHandler.create_answer(data['object']['message'], token)
        return 'ok'

И добавляем соответствующий импорт в начало файла:

import messageHandler

Можем проверить, что у нас получилось, перезагрузив приложение.

БЛОК 4
Приступим к созданию команд. Создадим класс команд.

Файл «command_system.py»:

command_list = []

class Command:
   def __init__(self):
       self.__keys = []
       self.description = ''
       command_list.append(self)

   @property
   def keys(self):
       return self.__keys

   @keys.setter
   def keys(self, mas):
       for k in mas:
           self.__keys.append(k.lower())

   def process(self):
       pass

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

Поле description будем использовать для выдачи информации по командам бота. Функция process будет исполняться для формирования ответного сообщения.

Есть общий список, в который сохраняются все команды при их инициализации. Он находится снаружи класса. Этот список будем использовать для поиска команды, которую запросил пользователь своим сообщением.

Теперь создадим несколько команд для нашего бота. Для удобства загрузки будем помещать файлы, в которых инициализируем команды, в папку «commands».

Я создам несколько файлов, но можно и разместить команды и в одном файле

«hello.py»

import command_system

def hello():
   message = 'Привет, друг!nЯ новый чат-бот.'
   return message, ''

hello_command = command_system.Command()

hello_command.keys = ['привет', 'hello', 'дратути', 'здравствуй', 'здравствуйте']
hello_command.description = 'Поприветствую тебя'
hello_command.process = hello

«cat.py»

import command_system
import vkapi
import settings

def cat():
   # Получаем случайную картинку из паблика
   attachment = vkapi.get_random_wall_picture(-32022300, settings.access_token)
   message = 'Вот тебе котик :)nВ следующий раз я пришлю другого котика.'
   return message, attachment

cat_command = command_system.Command()

cat_command.keys = ['котик', 'кошка', 'кот', 'котенок', 'котяра', 'cat']
cat_command.description = 'Пришлю картинку с котиком'
cat_command.process = cat

Для команды, отправляющей котика, нам понадобится новый токен и новая функция и в файле «vkapi», которая возвращает случайную картинку со стены группы или пользователя. В данном случае будем получать случайную фотографию со стены паблика с котами.

Начнем с получения токена. Нам нужен сервисный ключ доступа. Для этого надо создать новое Standalone-приложение. Его можно создать по ссылке. Далее когда приложение будет создано, нужно перейти в его настройки и скопировать то, что находится в поле «Сервисный ключ доступа».
Это нужно внести в наш файл с токенами.
«settings.py»

token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
confirmation_token = 'xxxxxxxx'
access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

Теперь перейдем к созданию нового метода vkapi. Здесь немного расширяем спектр используемых методов API.

Этот метод выглядит так:

def get_random_wall_picture(group_id, token):
    max_num = api.photos.get(owner_id=group_id, album_id='wall', count=0, access_token=token)['count']
    num = random.randint(1, max_num)
    photo = api.photos.get(owner_id=str(group_id), album_id='wall', count=1, offset=num, access_token=token)['items'][0]['id']
    attachment = 'photo'   str(group_id)   '_'   str(photo)
    return attachment

Дописываем его в файл «vkapi». Также в начало файла «vkapi» надо добавить необходимый импорт:

import random

И последняя команда

«info.py»

import command_system

def info():
   message = ''
   for c in command_system.command_list:
        message  = c.keys[0]   ' - '   c.description   'n'
   return message, ''

info_command = command_system.Command()

info_command.keys = ['помощь', 'помоги', 'help']
info_command.desciption = 'Покажу список команд'
info_command.process = info

Окончательная иерархия файлов:

image
botFlask — главный файл, который принимает входящие запросы.

Теперь, когда мы описали команды, нужно позаботиться о том, чтобы наш лист команд был наполнен, и мы могли понять, к какой из команд обращался пользователь, так как список “command_list” заполняется только в момент запуска файлов с конкретными командами.

Мы будем автоматически запускать на исполнение все файлы из папки «commands» при запуске нашего бота.

Для этого в файле «messageHandler.py» дописываем функцию:

def load_modules():
   # путь от рабочей директории, ее можно изменить в настройках приложения
   files = os.listdir("mysite/commands")
   modules = filter(lambda x: x.endswith('.py'), files)
   for m in modules:
       importlib.import_module("commands."   m[0:-3])

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

Вызов этой функции добавляем в «create_answer». Теперь изменим функцию «get_answer» так, чтобы она вызывала соответствующий ответ.

Итоговый вид файла:

import vkapi
import os
import importlib
from command_system import command_list

def load_modules():
   # путь от рабочей директории, ее можно изменить в настройках приложения
   files = os.listdir("mysite/commands")
   modules = filter(lambda x: x.endswith('.py'), files)
   for m in modules:
       importlib.import_module("commands."   m[0:-3])

def get_answer(body):
    # Сообщение по умолчанию если распознать не удастся
    message = "Прости, не понимаю тебя. Напиши 'помощь', чтобы узнать мои команды"
    attachment = ''
    for c in command_list:
        if body in c.keys:
            message, attachment = c.process()
    return message, attachment

def create_answer(data, token):
   load_modules()
   user_id = data['from_id']
   message, attachment = get_answer(data['text'].lower())
   vkapi.send_message(user_id, token, message, attachment)

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

БЛОК 5
Дальнейшая часть статьи будет про одно улучшение, которое я считаю необходимым. Однако бот будет работать и без этого.

Приблизительное распознавание команд

Если пользователь допустил ошибку в одном символе, скорее всего, он имел в виду максимально похожую команду. Поэтому было бы хорошо, если бы наш бот все равно давал ответ, а не говорил «не понимаю тебя».

Для приблизительного распознавания будем использовать расстояние Дамерау-Левенштейна. Оно показывает, за сколько операций удаления, вставки, замены и перемещения символов можно перейти от одной строки к другой.

Алгоритм нахождения этого расстояния изложен, например, в Википедии.

Добавляем в файл “messageHandler.py” функцию:

def damerau_levenshtein_distance(s1, s2):
   d = {}
   lenstr1 = len(s1)
   lenstr2 = len(s2)
   for i in range(-1, lenstr1   1):
       d[(i, -1)] = i   1
   for j in range(-1, lenstr2   1):
       d[(-1, j)] = j   1
   for i in range(lenstr1):
       for j in range(lenstr2):
           if s1[i] == s2[j]:
               cost = 0
           else:
               cost = 1
           d[(i, j)] = min(
               d[(i - 1, j)]   1,  # deletion
               d[(i, j - 1)]   1,  # insertion
               d[(i - 1, j - 1)]   cost,  # substitution
           )
           if i and j and s1[i] == s2[j - 1] and s1[i - 1] == s2[j]:
               d[(i, j)] = min(d[(i, j)], d[i - 2, j - 2]   cost)  # transposition
   return d[lenstr1 - 1, lenstr2 - 1]

Она реализует алгоритм нахождения этого расстояния, при желании вы можете его изменить или улучшить.

По данным строкам она будет выдавать количество операций для преобразования одной в другую. Теперь изменим метод «get_answer»:

def get_answer(body):
   message = "Прости, не понимаю тебя. Напиши 'помощь', чтобы узнать мои команды"
   attachment = ''
   distance = len(body)
   command = None
   key = ''
   for c in command_list:
       for k in c.keys:
           d = damerau_levenshtein_distance(body, k)
           if d < distance:
               distance = d
               command = c
               key = k
               if distance == 0:
                   message, attachment = c.process()
                   return message, attachment
   if distance < len(body)*0.4:
       message, attachment = command.process()
       message = 'Я понял ваш запрос как "%s"nn' % key   message
   return message, attachment

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

На этом все, рабочий (на момент написания статьи) код выложен на гитхабе.

Надеюсь, эта статья немного облегчит вам жизнь, если вы решили создать своего бота для VK.

Понравилась статья? Поделиться с друзьями:
ТВОЙ ВК
Добавить комментарий

Adblock
detector