API REST v2.0

Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.

Изменения (37)

просмотр истории страницы
[http://demo5.carbonsoft.ru/rest_api/v2/]

h2. Как выполнить запрос?

h3. Описание примеров

h5. IP в запросе
В API запросах описаныых в статье указан внутренний IP контейнера биллинга *169.254.80.82*. Доступ к нему есть только внутри сервера биллинга. Соответсвенно запросы необходимо выполнять из консоли.
Если вы хотите сделать запрос со стороннего ПК, то настройте доступ к API по [статье|API#Настройка доступа к API].

h5. Порт
API запросы выполняются к веб серверу биллинга по порту *8082*.

h5. Описание пайплана в примерах
Во многоих примерах кроме самого API запроса есть дополнительные команды. Разберём их на примере API запроса *Установить абонентам из папки с id 1354 статус с id 26*:
{code}
sqlexec "set list on; select id from abonents where parent_id=1354" \
| awk ' {print $2} ' | sed '/^$/d' | \
while read line; do curl -XPOST -d 'method1=objects.get&arg1={"id": '$line'}&method2=set_object_status&arg2={"status_id": "26"}' 'http://169.254.80.82:8082/rest_api/v2/Abonents/' -D -; done
{code}
# Сначала происходит выборка данных командой [sqlexec|Конструктор отчетов#Выполнение отчёта из консоли утилитой sqlexec]
{code}
sqlexec "set list on; select id from abonents where parent_id=1354"
{code}
# Так как отчёт может вернуть несколько столбцов, мы вибираем один или несколько нужных утилитой *awk*
{code}
awk ' {print $2} '
{code}
# Команда [sqlexec|Конструктор отчетов#Выполнение отчёта из консоли утилитой sqlexec] кроме отчёта возращает несколько пустых строк. Обрежем их утилитой *sed*, чтобы в запрос не попали пустые значения
{code}
sed '/^$/d'
{code}
# Отчёт вернёт несколько значений. Поэтому API запрос необходимо выполнить в цикле *while*. Данные в запрос будут переданы в переменной *$line*
{code}
while read line; do curl ... -D -; done
{code}
Можно считать несколько переменных одновоременно
{code}
while read line1 line2 line3; do curl ... -D -; done
{code}

h3. Как удобно выполнить большой запрос из консоли?
Подробно выполнение sql запроа в скрпитах описано в [статье|Конструктор отчетов#Выполнение запроса для использования в скриптах].
# Создайте *bash* скрипт
{code}
touch my_script.sh
{code}
# Запишите в него скрипт
{code}
#!/bin/bash

chroot /app/asr_billing/ /usr/local/bin/sqlexec "set list on; select id from abonents where parent_id=1354" \
| awk ' {print $2} ' | sed '/^$/d' | \
while read line; do curl -XPOST -d 'method1=objects.get&arg1={"id": '$line'}&method2=set_object_status&arg2={"status_id": "26"}' 'http://169.254.80.82:8082/rest_api/v2/Abonents/' -D -; done

exit 0
{code}
# Дайте права на исполнение
{code}
chmod 744 my_script.sh
{code}
# Запустит скрипт
{code}
./my_script.sh
{code}

h2. Примеры

Некоторые готовые примеры работы с API с помощью Python вы можете посмотреть здесь: [github|https://github.com/carbonsoft/rest_api_example]

{warning}
{warning:title=Очень Важно!}При выполнении API-запроса к серверу, происходит формирование задачи для изменения записей в БД, а не моментальное исполнение требуемых действий.
Поэтому, будьте внимательны, когда делаете запрос к большому количеству записей(массовое изменение NAS и т.д), требуется подождать некоторое время (10-30 минут) для завершения заданий, и после этого можете приступать к новым запросам. Иначе, могут возникнуть наложения действий со следующим запросом и начальный запрос выполнится некорректно. {warning}
{warning}

h3. Абоненты
curl -XPOST -d 'method1=objects.get&arg1={"id": "1360"}&method2=restore&arg2={}' 'http://169.254.80.82:8082/rest_api/v2/Abonents/' -D -
{code}
# h5. Задать абоненту с id 101 токен 123456 для отправки PUSH уведомления
{code}
curl -XPOST -d 'method1=objects.get&arg1={"id":"101"}&method2=set&arg2={"push_token":"123456"}&method3=save&arg3={}'' http://169.254.80.82:8082/rest_api/v2/Abonents/ -D -
{code}
# h5. Перерасчитать абонента начиная с выбранного периода (обязательно указывать первое число месяца\!)
Перерасчет абонента с ID 1392 с июня 2019 года
{code}curl -XPOST 'http://169.254.80.82:8082/rest_api/v2/Abonents/' -d 'method1=objects.get&arg1={"id":"1392"}&method2=set&arg2={"need_recalc":"2019-06-01"}&method3=save&arg3={}'{code}
Перерасчет абонента с ID 1368 с февраля 2026 года
{code}
curl -XPOST 'http://169.254.80.82:8082/rest_api/v2/Abonents/' -d 'method1=objects.get&arg1={"id":"1368"}&method2=recalc_service&arg2={"start_date":"2026-02-01","clear_blocks": true}'
{code}
# h5. Перерасчитать абонентов на тарифе с id 1405, начиная с выбранного периода (обязательно указывать первое число месяца\!)
{code}
{code}sqlexec "set list on; select id from abonents where tarif_id=1405" | awk ' {print $2} ' | sed '/^$/d' | while read line; do curl -XPOST -d 'method1=objects.get&arg1={"id":'$line'}&method2=set&arg2={"need_recalc":"2019-06-01"}&method3=save&arg3={}' 'method1=objects.get&arg1={"id":'$line'}&method2=recalc_service&arg2={"start_date":"2019-06-01"}' 'http://169.254.80.82:8082/rest_api/v2/Abonents/' -D -; done{code}
{code}
# h5. Перерасчитать абонента с удалением истории блокировок. Например, по абоненту с id *6034* за *сентябрь 2024*.
{code}
curl -XPOST 'http://169.254.80.82:8082/rest_api/v2/Abonents/' -d 'method1=objects.get&arg1={"id":"6034"}&method2=recalc_service&arg2={"start_date":"2024-09-01","clear_blocks": true}'
{code}
# h5. Получение данных об операторе, обслуживающем абонента
{code}curl -XPOST 'http://169.254.80.82:8082/rest_api/v2/Abonents/' -d 'method1=objects.filter&arg1={"id":1111}&fields=["operator"]'{code}
# h5. Установить всем учетным записям абонентов из папки 1358 nas c id 1115.
{code}
sqlexec "set list on; select id from users where abonent_id in (SELECT abonent_id FROM GLN_RECURSIVE_ABONENTS_GET(1358))" | awk ' {print $2} ' | sed '/^$/d' | while read line; do curl -XPOST -d 'method1=objects.get&arg1={"id":'$line'}&method2=set&arg2={"nas_id":"1115"}&method3=save&arg3={}' http://169.254.80.82:8082/rest_api/v2/Users/ -D -; done
sqlexec "set list on; SELECT u.id FROM GLN_RECURSIVE_ABONENTS_GET(1358) a JOIN users u on u.abonent_id=a.abonent_id" | grep -oP '\d+' | while read line; do curl -XPOST -d 'method1=objects.get&arg1={"id":'$line'}&method2=set&arg2={"nas_id":"1115"}&method3=save&arg3={}' http://169.254.80.82:8082/rest_api/v2/Users/ -D -; done
{code}
# h5. Установить всем абонентам из папки id 1386 пул ip-адресов с id 1003 и выдать новый ip-адрес из пула
# h5. Установить опцию "Привязать пользователей к этому NAS" для учетных записей абонентов, находящихся в папке с id 1358
{code}
sqlexec "set list on; select id from users where abonent_id in (SELECT abonent_id FROM GLN_RECURSIVE_ABONENTS_GET(1358))" | awk ' {print $2} ' | sed '/^$/d' | while read line; do curl -XPOST -d 'method1=objects.get&arg1={"id":'$line'}&method2=set&arg2={"nas_ip_lock":"1"}&method3=save&arg3={}' http://169.254.80.82:8082/rest_api/v2/Users/ -D -; done
sqlexec "set list on; SELECT u.id FROM GLN_RECURSIVE_ABONENTS_GET(1358) a JOIN users u on u.abonent_id=a.abonent_id" | grep -oP '\d+' | while read line; do curl -XPOST -d 'method1=objects.get&arg1={"id":'$line'}&method2=set&arg2={"nas_ip_lock": 1}&method3=save&arg3={}' http://169.254.80.82:8082/rest_api/v2/Users/ -D -; done
{code}
# h5. Отправить на оборудование актуальные состояния учетных записей:
curl -XPOST --url 'http://169.254.80.82:8082/rest_api/v2/Users/' --data 'method1=objects.all&arg1={}&method2=update&arg2={"modified":4}
{code}
# h5. Сброс сессии у учётной записи 1234:
{code}
curl -XPOST 'http://169.254.80.82:8082/rest_api/v2/EventsStackCompact/' -d 'method1=objects.create&arg1={"user_id": '1234',"cmd":"user_disconnect"}'
{code}
В скрипте управления session должна быть описана функция user_disconnect . В ней обычно уже есть CoA запрос.
h3. Блокировки абонента

# h5. Список абонентов блокировкой negbal, выводим логин и IP адерес.
{code}
{code}curl curl -XPOST -d 'method1=objects.filter&arg1={"abonent__deleted": 0, "abonent__abonent_id_abonentsblock__b_negbal": 1 }&method2=distinct&fields=["login", "ip"]' "http://169.254.80.82:8082/rest_api/v2/Users/" -D -{code}
# h5. Работа с блокировками абонентов и их историей
Получить ID текущих блокировок по балансу абонента с ID 1392
{code}curl -XPOST 'http://169.254.80.82:8082/rest_api/v2/AbonentsBlock/' -d 'method1=objects.filter&arg1={"abonent_id":1392,"b_negbal":1}&fields=["id"]'{code}
{code}
curl -XPOST 'http://169.254.80.82:8082/rest_api/v2/AbonentsBlock/' -d 'method1=objects.filter&arg1={"abonent_id":1392,"b_negbal":1}&fields=["id"]'
{code}
Снять блокировку с ID 243068
{code}curl -XPOST 'http://169.254.80.82:8082/rest_api/v2/AbonentsBlock/' -d 'method1=objects.get&arg1={"id":243068}&method2=delete'{code}
{code}
curl -XPOST 'http://169.254.80.82:8082/rest_api/v2/AbonentsBlock/' -d 'method1=objects.get&arg1={"id":243068}&method2=delete'
{code}
Получить ID блокировок абонента ID 1392 измененных с 1 по 30 июня 2019 года
{code}
{code}curl curl -XPOST 'http://169.254.80.82:8082/rest_api/v2/AbonentsBlockHistory/' -d 'method1=objects.filter&arg1={"abonent_id":1392,"b_negbal":1,"time_changed__range":["2019-06-01", "2019-06-30"]}&fields=["id"]'{code}
{code}
Получить ID блокировок абонента ID 1392 снятых с 1 по 30 июня 2019 года
{code}
{code}curl curl -XPOST 'http://169.254.80.82:8082/rest_api/v2/AbonentsBlockHistory/' -d 'method1=objects.filter&arg1={"abonent_id":1392,"b_negbal":1,"time_del__range":["2019-06-01", "2019-06-30"]}&fields=["id"]'{code}
{code}
Изменить запись в истории блокировок ID 118, установить время изменения и снятия на 1 июня 2019 года
{code}curl -XPOST 'http://169.254.80.82:8082/rest_api/v2/AbonentsBlockHistory/' -d 'method1=objects.get&arg1={"id":118}&method2=set&arg2={"time_changed":"2019-06-01 00:00:00","time_del":"2019-06-01 00:00:00"}&method3=save'{code}
{code}
curl -XPOST 'http://169.254.80.82:8082/rest_api/v2/AbonentsBlockHistory/' -d 'method1=objects.get&arg1={"id":118}&method2=set&arg2={"time_changed":"2019-06-01 00:00:00","time_del":"2019-06-01 00:00:00"}&method3=save'
{code}
# h5. Удалить историю блокировок
{code}
sqlexec -l "select ID from abonents_block_history where abonent_id=6034 and B_DATE between '2024-09-01 00:00:00' and '2024-09-30 23:59:59'" | awk ' {print $2} ' | sed '/^$/d' | while read line; do curl -XPOST "http://169.254.80.82:8082/rest_api/v2/AbonentsBlockHistory/" -d "method1=objects.get&arg1={\"id\":$line}&method2=delete&arg2={}" -D -; done
{code}

h3. Лицевой счёт
done
{code}
# h5. Настроить в услуге для [межоператорских расчетов|Взаиморасчеты между операторами, агентская схема телефонии и транзит] транк-группу
{code}curl -ss 'http://169.254.80.82:8082/rest_api/v2/UsersUsluga/' -d 'method1=objects.get&arg1={"pk":1610}&method2=set&arg2={"voip_operator_match_format":"Beeline"}'{code}
# h5. Изменить дату окончания работы услуги.
h3. Отчёты

# h5. Выполнение [отчёта|Конструктор отчетов] 1003 с параметром phone="+79222222222"
{code}
curl -XPOST -d 'method1=objects.get&arg1={"id":1003}&method2=get_data&arg2={"phone":"+79222222222"}' http://169.254.80.82:8082/rest_api/v2/AdminCustomReports/ -D -
{code}
# h5. Выполнение [отчёта|Конструктор отчетов] 250081 с параметрами даты за январь 2022 года
{code}
curl -XPOST -d 'method1=objects.get&arg1={"id":250081}&method2=get_data&arg2={"start":"2022-01-01 00:00:00.0000", "end":"2022-01-31 23:59:59.0000"} ' http://169.254.80.82:8082/rest_api/v2/AdminCustomReports/ -D -
{code}
* В отчёте [переменные|Конструктор отчетов#Фильтры данных (параметры полей формы)] должны быть объявлены на латинице.
* [Переменные|Конструктор отчетов#Фильтры данных (параметры полей формы)] должны быть произвольного типа.
{code}
':start$'