Rest Активити для Битрикс24 на Python "Пауза в секундах"

Rest Активити для Битрикс24 на Python "Пауза в секундах"

Что потребуется:

  • Портал б24 на который будем ставить приложение =)
  • Сервер на котором будет работать приложение на питоне, сервер понадобится для приема и обработки запросов от Б24.
    Для этого проекта я арендую виртуальный сервер на таймвеб -> https://timeweb.cloud/r/tx99429
  • На сервере развернем FaStapi https://fastapi.tiangolo.com/ и напишем обработчик который будет обеспечивать паузу
  • Подготовить файл для регистрации приложения
    • Приложение можно зарегистрировать разными способами, примеры описаны в официальной документации. Я возьму самый простой пример - Локальное приложение оно представляет из себя 1 html файл в архиве, загружаемый на портал в момент создания приложения

Подготовка файла для регистрации приложения

  • Возьмем архив локального приложения из примера
  • Дополним его методом для создания активити `bizproc.activity.add`
    ссылка на доку по этому методу
  • Упаковываем отредактированный файл в `.ZIP` архив и загружаем на портал

В итоге должно получится примерно вот так:


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Quick start. Local static application</title>
</head>
<body>
    <div id="name"></div>

    <script src="//api.bitrix24.com/api/v1/"></script>
    <script>
        BX24.init(function(){
            // Получение текущего пользователя
            BX24.callMethod('user.current', {}, function(res){
                var name = document.getElementById('name');
                name.innerHTML = res.data().NAME + ' ' + res.data().LAST_NAME;
                console.log(res.data());
            });

            // Добавление пользовательского действия в бизнес-процесс
            var activityData = {
                CODE: 'custom_activity_code', // Уникальный код вашего действия
                HANDLER: 'http://82.97.250.59/activity_pause/', // URL обработчика на который активти будет отправлять данные
                NAME: 'Пауза в секундах', // Название действия
                DESCRIPTION: 'Останавливает действие бизнес процесса на заданное кол-во секунд', // Описание действия
                PROPERTIES: {
                    StringParameter: { // Имя параметра
                        Name: "Пауза", // Название параметра для отображения
                        Description: "Сколько ждать в секундах", // Описание параметра
                        Type: "string", // Тип параметра
                        Required: "Y" // Параметр обязателен
                    }
                },
                RETURN_PROPERTIES: {
                    // Возвращаемые значения вашего действия, если они требуются
                    ResultString: {
                Name: "Результат ожидания",
                Description: "Результат выполенения дейтсвия",
                Type: "string"
            }

                }
            };

            BX24.callMethod('bizproc.activity.add', activityData, function(response){
                if(response.error())
                    console.error("Ошибка добавления активити: ", response.error());
                else
                    console.log("Активити успешно добавлено: ", response.data());
            });

            console.log('B24 SDK is ready!', BX24.isAdmin());
        });
    </script>
</body>
</html>

Замените в этом файле параметр `HANDLER` на урл своего обработчика

Подготовка сервера и установка FastApi

  • Арендуем сервер -> https://timeweb.cloud/r/tx99429
  • Заходим по ssh
  • Устанавливаем FastApi
  • Запускаем FastApi чтоб убедится что все работает
uvicorn main:app --reload --port 80 --host 82.97.250.108
Замените 89.97.250.108 на адрес своего хоста

Метод для обработки запросов из битрикса на стороне FastApi

Что делает метод:

  • Принимает запрос от Б24
  • Из запроса берет значение паузы
  • Засыпает на полученное из запроса кол-во секунд
  • Выходит из спячки и отправляет ответ в б24

Исполняемый файл должен выглядеть примерно вот так:

from fastapi import FastAPI, Request
from urllib.parse import parse_qs
import asyncio
import requests

app = FastAPI()

@app.post('/activity_pause/')
async def handler(request: Request):
    body = await request.body()
    body_str = body.decode('utf-8')
    
    parsed_body = parse_qs(body_str)
    pause = int(parsed_body['properties[StringParameter]'][0])
    await asyncio.sleep(pause)  # Пример использования asyncio

    params = {
        "auth": parsed_body['auth[access_token]'][0],
        "event_token": parsed_body['event_token'][0],
        # Пример использования parsed_body, полученного с помощью parse_qs
        "return_values": {
            "ResultString": f"Бп висел в паузе {pause} секунд",
        }
    }
    
    rest_api_url = parsed_body['auth[client_endpoint]'][0] + 'bizproc.event.send'
    response = requests.post(rest_api_url, json=params)  # Пример использования requests

    if response.status_code == 200:
        return {"message": "Результат успешно возвращен в БП"}
    else:
        return {"error": "Ошибка при возвращении результата в БП", "status_code": response.status_code}