# Python

{% hint style="success" %}
Если нужна разработка скрипта под вашу задачу - то обращайтесь к [нам](https://nextbot.bitrix24site.ru/dev/)
{% endhint %}

## Основная информация

{% hint style="warning" %}
Для использования Python Script необходимо приобрести подписку уровня **Бизнес**.

Вызов Python Script тарифицируется следующим образом

* 0.01 botcoin за вызов - при выключенном режиме отладки
* 0.05 botcoin за вызов - при включенном режиме отладки
  {% endhint %}

Функция может выполнять Python-скрипты для различных задач, например: отправка запросов по [REST API](https://doc.nextbot.ru/functional/functions/sending-result/python/ispolzovanie-rest-api), [чтение или запись в Google Таблицы](https://doc.nextbot.ru/functional/functions/sending-result/python/podklyuchenie-i-rabota-s-google-tablicam) и т.д.

<figure><img src="https://2593311972-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fef2EBU68XAlye1NtG8DF%2Fuploads%2FhMcIusFToZZBelaqTJuA%2F%7B46564135-1818-4DD8-AE56-2D1545AC9DA1%7D.png?alt=media&#x26;token=e9071795-be36-4c8a-9a4e-00935399e388" alt=""><figcaption></figcaption></figure>

Используется **RestrictedPython**, доступны только встроенные библиотеки. Подключение сторонних библиотек через `import` отключено.

**Доступные возможности:**

{% code fullWidth="false" %}

```python
# Математика: 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
# Операторы присваивания: +=, -=, *=, /=, //=, %=, **=, <<=, >>=, &=, ^=, |=
# 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() - для отладочных сообщений
```

{% endcode %}

**Работа с аргументами**

Параметры функции доступны в скрипте через словарь `args`.<br>

<figure><img src="https://2593311972-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fef2EBU68XAlye1NtG8DF%2Fuploads%2FbSaa98GIkZvdttwTYhiw%2Fimage.png?alt=media&#x26;token=86d88f3d-4d2c-4ebf-a14c-0605e0468aea" alt="" width="563"><figcaption></figcaption></figure>

Например, если у вас в функции есть переменная `event_type`, вы можете передать её значение в скрипт следующим образом:

```python
event_type = args.get("event_type", "")
```

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

Если у агента созданы пользовательские переменные, они тоже передаются в `Python Script`.

Они доступны в словаре `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)
```

На практике удобнее сначала получить оба словаря, а потом обращаться к нужным ключам:

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

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

Такой подход особенно удобен, если вы хотите передавать пользовательские переменные в `Custom API`, CRM или использовать их в собственной логике внутри скрипта.

**Обязательная переменная `result`**

В скрипте обязательно должна быть переменная `result`.\
Содержимое этой переменной будет доступно вашему ИИ-ассистенту. Пример:

```python
result = {'status': 'success',
          'data': received_data # например массив с полученными данными
          }
```

В этом случае ИИ-ассистент получит результат выполнения функции и доступ к данным.

***

## Тестирование кода

Вы можете протестировать код перед запуском.\
Если необходимо — включите режим отладки и нажмите "Сохранить".

{% hint style="info" %}
В режиме отладки выводится больше логов. Всё, что обёрнуто в `debug()`, будет отображаться в журнале выполнения.

Тестирование кода также тарифицируется.
{% endhint %}

Чтобы протестировать код:

нажмите "Тестировать код" и прокрутите страницу вниз

1. Нажмите **"Тестировать код"**

<figure><img src="https://2593311972-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fef2EBU68XAlye1NtG8DF%2Fuploads%2FhMcIusFToZZBelaqTJuA%2F%7B46564135-1818-4DD8-AE56-2D1545AC9DA1%7D.png?alt=media&#x26;token=e9071795-be36-4c8a-9a4e-00935399e388" alt=""><figcaption></figcaption></figure>

1. Прокрутите страницу вниз
2. В разделе **"Тестовые аргументы"** укажите необходимые значения переменных функции<br>

   <figure><img src="https://2593311972-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fef2EBU68XAlye1NtG8DF%2Fuploads%2F9ou7xiJ6xo0XPQKJMSqc%2Fimage.png?alt=media&#x26;token=9258b0a2-19a9-45c8-8857-ca10d8c6cee2" alt=""><figcaption></figcaption></figure>
3. Нажмите "Запустить тест".

<figure><img src="https://2593311972-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fef2EBU68XAlye1NtG8DF%2Fuploads%2FwrSCLD76dGPnu67aB7QX%2Fimage.png?alt=media&#x26;token=57f854ba-3aa3-400f-a64c-4af773ce38f4" alt=""><figcaption><p>Результат с включенным режимом отладки</p></figcaption></figure>

<figure><img src="https://2593311972-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fef2EBU68XAlye1NtG8DF%2Fuploads%2FYfDC1j6n4f1uKZ3vwEr3%2Fimage.png?alt=media&#x26;token=cd78b168-9065-4d51-91a3-d98827eaf7e2" alt=""><figcaption><p>Результат без режима отладки</p></figcaption></figure>
