# Использование REST API

У сервиса Nextbot уже реализована отправка результатов по REST API через функциональность Custom API. Зачем же тогда использовать вариант с **Python Script**?

Этот способ даёт больше гибкости в настройке. Например:

* Использование переменных в URL — когда в зависимости от ответа пользователя нужно отправлять данные на разные эндпоинты вашего API.
* Необходимость отправки **JSON с массивом**.
* Из полученного ответа нужно извлечь только определённые поля, а весь ответ не требуется.
* Нужно использовать методы **PUT** и **DELETE**, помимо стандартных **GET** и **POST**.

**Пример**

<figure><img src="/files/G1mhTt6QgMSzUcIBOX4A" alt="" width="563"><figcaption></figcaption></figure>

Допустим, у агента есть функция с параметрами, и, например, вы хотите отправить следующий JSON:

```json
{
    "event_py": {
        "event_type": "event_type"
    },
    "details": [
        {
            "date": "date",
            "venue": "venue",
            "start_time": "start_time",
            "city": "city",
            "duration": "event_duration_hours"
        }
    ],
    "contact_info": {
        "name": "name",
        "phone": "phone_number"
    }
}
```

Для теста был создан эндпоинт на mock-сервисе:\
`https://eventorganizer.free.beeceptor.com/event/create`\
принимающий **POST-запрос с JSON**.

**Работа с Python Script**

При включении отправки через Python Script в окно кода автоматически вставляется шаблон, способный отправлять **GET-запрос** на публичный API и парсить ответ.

В верхней части кода будет блок комментариев, где указаны все доступные параметры через словарь `args`:

{% code fullWidth="false" %}

```python
# Системные поля в словаре args:
# args["dateStringCreatedDialog"] - Дата/время начала (текст)
# args["dateUonCreatedDialog"] - Дата/время начала (под UON)
# args["dateStringUseFunction"] - Дата/время функции (текст)
# args["dateUonUseFunction"] - Дата/время функции (под UON)
# args["link"] - Ссылка на диалог
# args["messenger"] - Мессенджер
# args["linkAdAvito"] - Ссылка на объявление Авито
# args["locationAvito"] - Локация Авито
# args["linkDialogAvito"] - Ссылка на диалог Авито
# args["linkDialogInMessenger"] - Ссылка на диалог в мессенджере
# args["nameUser"] - Имя в мессенджере
# args["userId"] - ID пользователя
# args["linkWidget"] - Ссылка на сайт с виджетом
# args["phoneNumberWhatsapp"] - Номер телефона из WhatsApp
# args["linkInUserMessanger"] - Ссылка на пользователя в мессенджере
# args["agentHash"] - ID агента
# args["platformIdSalebot"] - ID платформы Salebot
# args["userImageLinks"] - Ссылки на изображения пользователя
# args["lastUserImageLink"] - Последняя ссылка на изображение пользователя
# args["bitrixEntityId"] - ID сущности в Bitrix24
# args["bitrixToken"] - Токен доступа Bitrix24
# args["bitrixContactFirstName"] - Имя контакта в Bitrix24
# args["bitrixContactLastName"] - Фамилия контакта в Bitrix24
# args["bitrixPhoneNumber"] - Номер телефона контакта в Bitrix24
# args["bitrixContactEmail"] - Email контакта в Bitrix24
# args["bitrixEntityLink"] - Ссылка на сделку/лида в Bitrix24
# args["amoToken"] - Токен доступа amoCRM
# args["amoDealId"] - ID сделки в amoCRM
# args["amoContactFirstName"] - Имя контакта в amoCRM
# args["amoContactLastName"] - Фамилия контакта в amoCRM
# args["amoPhoneNumber"] - Номер телефона контакта в amoCRM
# args["amoContactEmail"] - Email контакта в amoCRM
# args["amoDealLink"] - Ссылка на сделку в amoCRM
# args["avitoProAccountName"] - Имя аккаунта в Avito Pro
# args["telegramStartParams"] - Переменные из запроса telegram /start
# args["fullDialog"] - Полный диалог
```

{% endcode %}

## Пользовательские переменные в `args`

Если у агента созданы пользовательские переменные, в этом же словаре `args` будут доступны и они.

Пример структуры:

```python
# Пользовательские переменные агента в args["variables"]["agent"]:
# args["variables"]["agent"]["Unique_Agent_ID"] - ID Агента: Уникальный ID Агента (тип: string)

# Пользовательские переменные диалога в args["variables"]["dialog"]:
# args["variables"]["dialog"]["ClientName"] - Имя Клиента: Переменная для имени клиента (тип: string)
# args["variables"]["dialog"]["Order_ID"] - Номер заказа: Номер заказа (тип: number)
```

Их можно использовать прямо при формировании `payload`:

```python
agent_vars = args.get("variables", {}).get("agent", {})
dialog_vars = args.get("variables", {}).get("dialog", {})

payload = {
    "agent_id": agent_vars.get("Unique_Agent_ID", ""),
    "client_name": dialog_vars.get("ClientName", ""),
    "order_id": dialog_vars.get("Order_ID", 0)
}
```

<figure><img src="/files/2HvOwtPZ6kDLa1uNP8qV" alt=""><figcaption></figcaption></figure>

Скопируйте весь код из поля "Код функции", откройте ChatGPT, вставьте код и попросите составить POST-запрос на:

`https://eventorganizer.free.beeceptor.com/event/create`

с использованием нужного JSON.

<details>

<summary>Пример запроса для ChatGPT</summary>

<pre data-overflow="wrap" data-full-width="false"><code><strong>есть среда restricted python: import использовать нельзя но есть подключенные библиотеки и пример кода.
</strong>
# Доступные параметры в словаре args:
# args["event_type"] - тип мероприятия (тип: string) [возможные значения определены в enum]
# args["date"] - дата (тип: string)
# args["start_time"] - время начала, формат даты - ISO 8601(YYYY-MM-DDTHH:mm) (тип: string)
# args["city"] - город (тип: string) [возможные значения определены в enum]
# args["venue"] - место проведения (тип: string)
# args["event_duration_minutes"] - продолжительность мероприятия в минутах (тип: integer)
# args["name"] - имя (тип: string)
# args["phone_number"] - номер телефона (тип: string)
# args["event_duration_hours"] - продолжительность мероприятия в часах (тип: string)

# Системные поля в словаре args:
# args["dateStringCreatedDialog"] - Дата/время начала (текст)
# args["dateUonCreatedDialog"] - Дата/время начала (под UON)
# args["dateStringUseFunction"] - Дата/время функции (текст)
# args["dateUonUseFunction"] - Дата/время функции (под UON)
# args["link"] - Ссылка на диалог
# args["messenger"] - Мессенджер
# args["linkAdAvito"] - Ссылка на объявление Авито
# args["locationAvito"] - Локация Авито
# args["linkDialogAvito"] - Ссылка на диалог Авито
# args["nameUser"] - Имя в мессенджере
# args["linkWidget"] - Ссылка на сайт с виджетом
# args["phoneNumberWhatsapp"] - Номер телефона из WhatsApp
# args["linkInUserMessanger"] - Ссылка на пользователя в мессенджере
# args["agentHash"] - ID агента
# args["platformIdSalebot"] - ID платформы Salebot

# Доступные возможности:
# Математика: abs, round, pow, sum, max, min, divmod, math (модуль)
# Типы данных: bool, int, float, str, chr, ord, bin, oct, hex
# Структуры: dict, list, tuple, set, frozenset, len, sorted, reversed, any, all
# Итерация: range, enumerate, zip, iter, next, filter, map
# Операторы присваивания: +=, -=, *=, /=, //=, %=, **=, &#x3C;&#x3C;=, >>=, &#x26;=, ^=, |=
# HTTP: requests.get(), requests.post(), requests.put(), requests.delete()
# JSON: json.loads(), json.dumps()
# Кодирование: base64 (модуль) - для кодирования/декодирования в base64
# Хеширование: hashlib (модуль) - для создания хешей (md5, sha1, sha256 и др.)
# Работа с CSV: csv (модуль) - для чтения/записи CSV файлов
# Структуры данных: collections (модуль) - Counter, defaultdict, deque и др.
# Функциональное программирование: itertools, functools (модули)
# Регулярные выражения: re (модуль)
# Дата и время: datetime (модуль), time (модуль), dateutil (модуль)
# Случайные числа: random (модуль)
# Статистика: statistics (модуль)
# URL обработка: urllib.parse (модуль)
# Логирование: debug() - для отладочных сообщений

# Пример использования логирования
debug("Начало выполнения функции")
debug(f"Получены аргументы: {args}")

# Пример HTTP-запроса с логированием (используем публичный API JSONPlaceholder)
try:
    debug("Отправка HTTP запроса к JSONPlaceholder API...")
    response = requests.get("https://jsonplaceholder.typicode.com/posts/1")
    response.raise_for_status()
    data = response.json()
    debug(f"Получен ответ от API: {data}")
except requests.RequestException as e:
    debug(f"Ошибка при выполнении запроса: {str(e)}")
    result = {"status": "error", "message": str(e)}
else:
    debug("Запрос выполнен успешно")
    result = {
        "status": "success",
        "title": data.get("title"),
        "body": data.get("body")
    }

# Пример обработки данных с логированием
try:
    debug("Начало обработки данных")
    # Пример обработки полученных данных
    processed_data = {
        "post_info": f"Заголовок: {result.get('title', '')}",
        "word_count": len(result.get('body', '').split())
    }
    debug(f"Данные обработаны: {processed_data}")
except Exception as e:
    debug(f"Ошибка при обработке данных: {str(e)}")
    raise

# Результат выполнения функции необходимо сохранить в переменную result
# Результат может быть словарем, списком, строкой или числом
debug("Формирование результата")
result = {
    "status": "success",
    "message": "Функция выполнена успешно",
    "processed_data": processed_data,
    "input_args": args
}
debug("Выполнение функции завершено")


можешь на основе этого кода написать отправку post запроса на URL https://eventorganizer.free.beeceptor.com/event/create
с отправкой JSON в таком формате:

{
    "event_py": {
        "event_type": "event_type"
    },
    "details": [
        {
            "date": "date",
            "venue": "venue",
            "start_time": "start_time",
            "city": "city",
            "duration": "event_duration_hours"
        }
    ],
    "contact_info": {
        "name": "name",
        "phone": "phone_number"
    }
}
</code></pre>

</details>

**Код, сгенерированный ChatGPT:**

```python
debug("Начало выполнения функции")
debug(f"Получены аргументы: {args}")

# Формируем JSON для отправки
payload = {
    "event_py": {
        "event_type": args.get("event_type", "")
    },
    "details": [
        {
            "date": args.get("date", ""),
            "venue": args.get("venue", ""),
            "start_time": args.get("start_time", ""),
            "city": args.get("city", ""),
            "duration": args.get("event_duration_hours", "")
        }
    ],
    "contact_info": {
        "name": args.get("name", ""),
        "phone": args.get("phone_number", "")
    }
}

debug(f"Формированный JSON: {payload}")

# Отправляем POST-запрос
try:
    debug("Отправка HTTP POST запроса...")
    response = requests.post("https://eventorganizer.free.beeceptor.com/event/create", json=payload)
    response.raise_for_status()
    result = response.json()
    debug(f"Ответ от сервера: {result}")
except requests.RequestException as e:
    debug(f"Ошибка при выполнении запроса: {str(e)}")
    result = {"status": "error", "message": str(e)}

debug("Выполнение функции завершено")
```

Тестрование

Запустите тест

<figure><img src="/files/uSPj8nWwdkw6rhF7PeUI" alt=""><figcaption></figcaption></figure>

Код выполнился — теперь проверим, пришло ли сообщение на наш эндпоинт.

<figure><img src="/files/s60EN0ZU7G59hM4CajZe" alt="" width="146"><figcaption></figcaption></figure>

Протестируем работу функции в диалоге

<figure><img src="/files/b9JfnZmym5lbvDN1r8tC" alt=""><figcaption></figcaption></figure>

Откройте мониторинг эндпоинта

<figure><img src="/files/9XJvSL4WYXE5bP3fSrUS" alt="" width="145"><figcaption></figcaption></figure>

Убедитесь, что JSON успешно доставлен


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.nextbot.ru/functional/functions/sending-result/python/ispolzovanie-rest-api.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
