Найти тему
automatization24

Обрабатываем Исходящие вебхуки Битрикс24 из роботов на Питоне

Оглавление

Исходящие вебхуки изначально инициализируются ИЗ Битрикс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.

-3

1.2 Хостинг. Настройку работы Flask-приложений на этом хостинге в рамках статьи подробно описывать не буду, есть мануалы, плюс, позже отдельно опишу. У нас в разделе Хостинг уже должны быть подключены 2 услуги:

  • Поддержка веб-приложений, услуга, которая дает возможность работы с Python.
  • Поддержка SSH - коннект по SSH для настройки веб-окружения, установки библиотек, того же Фласка.

В настройках веб-сервера укажем интерпретатор питона версии 3.10

-4

Разворачиваем на этом домене обработчик на Фласке

-5

В содержании файла 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!:

-6

Т.е. мы уже подняли простейший обработчик запроса. Правда без параметров. Вот и робот в Битрикс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. Файлик сам будет создан при первом запросе урла:

-7

-8

Текст для сохранения исправим на "А теперь вызывали с Битрикс24" и указываем наш урл в роботе сделок на второй стадии:

-9
-10

Если другая сделка или эта же будет снова приходить на эту стадию, срабатывать робот вебхук, отправлять такое событие в обработчик.

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"

Оставили только пост-метод, в урл добавили параметр и выносим его сохранение в файл.

Новый адрес должен появиться и в вебхуке:

-11

И теперь обогащенные данные лежат в нашем мини-логе:

-12

В реальных кейсах принимается большее число параметров, не только айди. Но принцип работы с ними может быть тем же. После вызова нашего урла и получении данных из Битрикс24 такой файлик скорее выполняет роль логирования, а на это навешивается своя бизнес-логика. Например, мы получили айди сделки, пришедшей на нашу стадию, можем запросить больше данных по ней, направив Входящий вебхук>> с методом crm.deal.get.