Исходящие вебхуки изначально инициализируются ИЗ Битрикс24. Суть классических описал в статье>. Но если мы зайдем в раздел Роботы в CRM, Задачах... то тоже увидим там робота Исходящий вебхук в разделе Другие. В этой истории робот при срабатывании отправит http-запрос на указанный в нем url, а на этом адресе на сервере у вас уже должно быть нечто, что примет этот get-запрос и как-то обработает. В нашем случае поднимем такой обработчик на python. Будем использовать относительно простой и распространенный фреймворк Flask с минимальным кол-вом кода для наглядности.
1. Пример инфраструктуры для обработчика вебхука на python.
2. Принимаем запрос с Битрикса о смене стадии.
3 . Принимаем параметры в запросе о данных в портале.
1. Пример инфраструктуры для обработчика вебхука на python
Чтобы мы могли относительно полноценно настроить взаимодействие Битрикс24 и нашего обработчика в части принятия исходящих вебхуков с роботов, нам понадобиться домен и инфраструктура с питон-вебокружением, взаимодействующая с этим доменом. В качестве последней реальные пацаны арендуют и настраивают отдельные вирт.машины на Linux, мы же ограничимся крайне доступным хостингом Jino, хорошо подходящим для небольших изысканий в деплое питон-проектов примерно за 5 руб. в день)
1.1 Домен. В нашем случае используем домен example.runpython.ru с подключенным там бесплатным SSL-сертификатом от Let's Encrypt.
1.2 Хостинг. Настройку работы Flask-приложений на этом хостинге в рамках статьи подробно описывать не буду, есть мануалы, плюс, позже отдельно опишу. У нас в разделе Хостинг уже должны быть подключены 2 услуги:
- Поддержка веб-приложений, услуга, которая дает возможность работы с Python.
- Поддержка SSH - коннект по SSH для настройки веб-окружения, установки библиотек, того же Фласка.
В настройках веб-сервера укажем интерпретатор питона версии 3.10
Разворачиваем на этом домене обработчик на Фласке
В содержании файла main.py абсолютно стандартный классический код:
from flask import Flask, url_for, request, render_template
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, RUNPYTHON!"
if __name__ == "__main__":
app.run(debug=True)
И логично, что зайдя в браузере по адресу https://example.runpython.ru/ мы увидим текст Hello, RUNPYTHON!:
Т.е. мы уже подняли простейший обработчик запроса. Правда без параметров. Вот и робот в Битрикс24 просто создаст такой же запрос, постучавшись на указанный адрес. Правда он постучится методом Post.
2. Принимаем запрос с Битрикса о смене стадии
Для этого:
- создадим некоторый отдельный url, который укажем в роботе;
- когда вызывается этот url надо придумать, что будет происходить, какое-то действие. Будем просто сохранять в txt файлик дату/время этого вызова и произвольный текс.
Пишем функцию для фласка, в начале не забыв импортировать from datetime import datetime:
@app.route("/outhookfromb24/", methods=['POST', 'GET'])
def outhookfromn24():
with open('wh_saver.txt', 'a', ) as f:
f.write(f"{datetime.now()} Вызвали этот адрес: https://example.runpython.ru/outhookfromb24/ \r")
return "Outhookfromb24"
Т.е. при вызове адреса https://example.runpython.ru/outhookfromn24/ у нас в браузере покажется текст Outhookfromn24, а вот в файлик wh_saver.txt на хостинге упадет указанный текст. Укажем 2 метода обращения к данной странице, GET-для браузера, Post - для Битрикс24. Файлик сам будет создан при первом запросе урла:
Текст для сохранения исправим на "А теперь вызывали с Битрикс24" и указываем наш урл в роботе сделок на второй стадии:
Если другая сделка или эта же будет снова приходить на эту стадию, срабатывать робот вебхук, отправлять такое событие в обработчик.
3 . Принимаем параметры в запросе о данных в портале
Что должен бы был делать наш обработчик при таком вызове - ограничивается только нашей фантазией. Но гораздо интереснее сразу передавать в запросе какие-то параметры сделки. Пусть это будет id сделки.
Функция обработки усложнится не сильно:
@app.route("/outhookfromb24_params/<int:id>/", methods=['POST'])
def outhookfromn24_params(id):
with open('wh_saver.txt', 'a', ) as f:
f.write(f"{datetime.now()} С параметрами ID={str(id)} \r")
return "Outhookfromb24"
Оставили только пост-метод, в урл добавили параметр и выносим его сохранение в файл.
Новый адрес должен появиться и в вебхуке:
И теперь обогащенные данные лежат в нашем мини-логе:
В реальных кейсах принимается большее число параметров, не только айди. Но принцип работы с ними может быть тем же. После вызова нашего урла и получении данных из Битрикс24 такой файлик скорее выполняет роль логирования, а на это навешивается своя бизнес-логика. Например, мы получили айди сделки, пришедшей на нашу стадию, можем запросить больше данных по ней, направив Входящий вебхук>> с методом crm.deal.get.