Создание полноценного Viberbot на Django 2 и Viber REST API. Часть первая — Webhook
Установка Webhook для работы bot на viber и отправка первого POST запроса к backend мессенджера
Опираясь на свой опыт разработки под Viber и множество неоднозначных мнений, публикую цикл статей по созданию и запуску viberbot. Для понимая полной картины в целом, будем работать с чистым REST API VIBER, без каких либо оберток.
Радиовайбер показал себя слишком нестандартно, поэтому мы будем создавать классический диалоговый бот (коих много тысяч развелось в telegram).
Параллельно увидим все недостатки и преимущества botviber и поймем: чему в России легче быть — botviber VS bottelegram, главные отличия бот разработки этих платформ.
Статья больше расcчитана на новичков, кто не успел разобраться с REST API Viber.
В течение месяца по 1–2 tutorial в неделю кто захочет, тот научиться создавать боты на мессенджере Viber, c личной админ-панель, инструментами рассылки bulk-messages, без каких либо конструкторов и платформ. Также создадим minilanding-page (как у телеграм-ботов) для поиска и продвижения вашего бота.
Я рекомендую параллельно изучать Django, кто еще не начал, и особенностей его работы в develop и production режимах.
Не хватает бота — тогда начнем:
1. Установим и запустим Django >= 2.1 и Python >=3.6.
создадим приложение myviberbot стандартной командой менеджера Django:
python manage.py startapp myviberbot
не забываем внести его в файл settings.py в этот раздел:
# Фрагмент базового файла settings.py
DEBUG = True
ALLOWED_HOSTS = ['*']
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myviberbot', # указываем название вашего приложения
]
#
Допустим я привязал свой HTTPS домен и хочу установить webhook для viber-bot по адресу:
yourdomain.ru/webhook2020 — А вы меняйте yourdomain.ru на свой домен разумеется.
И обработку всех событий будем вести в функции def trx_bot () из myviberbot.views —, но о ней далее…
В первую очередь внесём соответствующие поправки в файл urls.py в листинге его полное содержимое:
# urls.py
from django.contrib import admin
from django.urls import path
from myviberbot.views import trx_bot
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('webhook2020', trx_bot), #url адрес нашего проекта - webhook2020,
# укажите свой, желательно посложнее
]
Если сильно не углубляться в тонкости Django — тут, в коде выше, мы направили абсолютно все запросы (request) по адресу webhook2020 в функцию trx_bot, которая расположена в папке проекта myviberbot в файле views.py. Рассмотрим его ниже.
# views.py из проекта myviberbot
from django.shortcuts import HttpResponse
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def trx_bot(request):
if request.method == "POST":
viber = json.loads(request.body.decode('utf-8'))
if viber['event'] == 'webhook':
print(viber)
print("Webhook успешно установлен") # - печатаем сообщение в
# консоль об успешном соотвещ событии установки webhook
return HttpResponse(status=200)
else:
print("Это не Webhook - пробуй еще раз, или используй POSTMAN")
return HttpResponse(status=500)
return HttpResponse(status=200)
После получения 200 ОК от нас — сервера backend viber готовы с нами работать.
Вы увидите сообщение которые пришло вам в месседжер в чат вашего бота (Функция диалога добавлен или Chat 1to1 added)
Но как отправить POST-запрос к backend Viber или установить Webhook — этот вопрос волнует многих, кто привык работать с telegram, методом get, но ничего страшного — внимательно читаем дальше:
2. Я уверен что к этому моменту, вы уже получили токен бота тут и развернули приложение django на хостинге (VDS или Shared) или в локальной среде (в этом случае поможет временный туннель ngrok),
a) Если тестируем проект на локальной машине, то командой менеджера стартуем его:
python manage.py runserver
После успешного старта — привязываем ngrok.
б) А способов запуска на хостинге ну очень много — лично я использую passenger на beget. В случае с beget, ставьте версию контейнера с php5.6 не выше — это совет от begetовцев.
Итак — Приложение запустилось — ставим webhook
Кто умеет использовать POSTMAN плагин для Chrome — может пропустить следующий абзац, и послать POST для webhook прямо из браузера.
Мы же создадим файл на локальной машине с любым названием например sethook.py, не забывая про библиотеку requests (pip install requests)
#sethook
import requests
import json
auth_token = 'xxxxxxxxx-ttttttttttttttttt-wwwwwwwwwwww' # тут ваш токен полученный в начале #п.2
hook = 'https://chatapi.viber.com/pa/set_webhook'
headers = {'X-Viber-Auth-Token': auth_token}
sen = dict(url='https://yourdomain.ru/webhook2020',
event_types = ['unsubscribed', 'conversation_started', 'message', 'seen', 'delivered'])
# sen - это body запроса для отправки к backend серверов viber
#seen, delivered - можно убрать, но иногда маркетологи хотят знать,
#сколько и кто именно принял и почитал ваших сообщений, можете оставить)
r = requests.post(hook, json.dumps(sen), headers=headers)
# r - это пост запрос составленный по требованиям viber
print(r.json())
# в ответном print мы должны увидеть "status_message":"ok" - и это значит,
# что вебхук установлен
Запускаем его командой с рабочего каталога:
python sethook.py
Вот и Всё! Webhook установлен методом POST. Вы видите сообщение которое пришло вам в чат (Функция диалога добавлена), а это значит что webhook установлен.
Продолжение следует…
В следующей статье мы разберем event[«conversation_started»], для первичного контакта с пользователями и инициализации интерактива с ними, вы узнаете что ваш viberbot знает обо всех пользователях и чего он не знает.
(Создание полноценного Viberbot на Django 2 и Viber REST API. Часть вторая — Сonversation_started)
Материалы:
Документация viber REST API
Django версии 2.2
Радиовайбер-минилендинг