django

Создание полноценного Viberbot на Django 2 и Viber REST API. Часть первая — Webhook

  • среда, 5 февраля 2020 г. в 00:24:55
https://habr.com/ru/post/486826/
  • Python
  • Программирование
  • Django
  • API
  • Аналитика мобильных приложений


Установка 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
Радиовайбер-минилендинг