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}