Skip to content

Управление абонентами

Абоненты (subscribers) — это конечные пользователи вашего IPTV-сервиса, которые получают доступ к просмотру телевизионных каналов. Система Catena обеспечивает гибкое управление абонентами, их подписками на пакеты каналов и контроль доступа.

Что такое абонент

Абонент в Catena — это учётная запись пользователя, который имеет доступ к просмотру каналов через подключённые пакеты.

Основные возможности:

  • Аутентификация по SMS — основной способ входа абонентов через код, отправленный на телефон
  • Управление подписками — подключение и отключение пакетов каналов
  • Контроль доступа — автоматическое управление доступом к каналам на основе подписок
  • Токены воспроизведения — уникальные токены для авторизации при просмотре
  • Мониторинг активности — отслеживание сеансов просмотра и активности абонентов

Типичный workflow:

  1. Создать учётную запись абонента с указанием телефона
  2. Подключить пакеты каналов к абоненту
  3. Абонент получает SMS с кодом для входа в приложение
  4. После входа абонент получает доступ ко всем каналам из своих пакетов
  5. Система автоматически управляет правами доступа на основе активных подписок

Основные параметры абонента

Технические параметры

Идентификатор абонента (Subscriber ID)

  • Автоматически генерируется при создании абонента
  • Формат: base64-кодированный Snowflake ID с заменой символов +/= на -_.
  • Пример: aKl9SW3AAAE.
  • Используется для программного доступа через API
  • Не редактируется после создания

ID портала (Portal ID)

  • Идентификатор портала, к которому принадлежит абонент
  • Автоматически устанавливается при создании
  • Абонент может получать доступ только к каналам и пакетам своего портала

Личные данные

Имя абонента (Name)

  • Отображаемое имя или идентификатор пользователя
  • Может быть ФИО, никнеймом или идентификатором из внешней системы
  • Используется для отображения в интерфейсе управления
  • Примеры: "Иван Петров", "user123", "Apartment 42"

Номер телефона (Phone)

  • Номер телефона абонента без кода страны
  • Используется для аутентификации через SMS — основного способа входа
  • Только цифры, без пробелов и специальных символов
  • Паттерн валидации: ^[0-9]*$
  • Примеры: 9161234567, 234567890

Код страны (Phone Country Code)

  • Код страны телефона без знака плюс
  • Используется вместе с полем phone для формирования полного номера
  • Только цифры
  • Паттерн валидации: ^[0-9]*$
  • Примеры: 7 (Россия), 1 (США), 44 (Великобритания)

Полный номер телефона формируется как: +{phoneCountryCode}{phone}

Пример: phoneCountryCode: "7" + phone: "9161234567" = +79161234567

Параметры доступа

Токен воспроизведения (Playback Token)

  • Уникальный токен для авторизации при воспроизведении видео
  • Генерируется автоматически системой
  • Используется streaming-сервером для проверки прав доступа
  • Передаётся в приложение после успешной аутентификации
  • Может быть регенерирован при необходимости

Список пакетов (Packages)

  • Массив идентификаторов пакетов каналов, к которым подключён абонент
  • Поле только для чтения — отображает текущие активные подписки
  • Обновляется автоматически при подключении/отключении пакетов
  • Определяет, к каким каналам абонент имеет доступ
  • Пример: ["pKl9SW3AAAE.", "bKl9SW3AAAE."]

Аутентификация абонентов

Вход по SMS (основной способ)

Catena использует аутентификацию через SMS как основной способ входа абонентов. Это обеспечивает:

  • Простоту использования — не нужно запоминать пароли
  • Безопасность — одноразовые коды, привязанные к телефону
  • Удобство — быстрая регистрация и вход
  • Защита от мошенничества — телефон как фактор аутентификации

Процесс входа по SMS:

  1. Абонент вводит номер телефона в приложении
  2. Система отправляет SMS с одноразовым кодом на указанный номер
  3. Абонент вводит код из SMS в приложении
  4. Система проверяет код и выдаёт токен доступа
  5. Абонент получает доступ к просмотру каналов из своих пакетов

Важно: Номер телефона является уникальным идентификатором абонента в системе. Убедитесь, что номера указаны корректно при создании учётных записей.

Автоматическое создание абонентов

Система может автоматически создавать учётные записи абонентов при первой попытке входа через SMS, если такая функция включена в настройках портала. Это позволяет реализовать самостоятельную регистрацию пользователей.

Создание абонента

Через веб-интерфейс

  1. Откройте раздел "Абоненты" в панели управления Catena
  2. Нажмите кнопку "Создать абонента"
  3. Заполните обязательные поля:

  4. Name — имя или идентификатор абонента

  5. Phone Country Code — код страны (например, 7 для России)
  6. Phone — номер телефона без кода страны

  7. Сохраните абонента

  8. Подключите пакеты через раздел управления подписками

После создания абонент получит уникальный ID и сможет войти в систему через SMS.

Через Management API

curl -X POST https://your-catena-domain.com/tv-management/api/v1/subscribers \
  -H "X-Auth-Token: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Иван Петров",
    "phoneCountryCode": "7",
    "phone": "9161234567"
  }'

Ответ:

{
  "subscriberId": "sKl9SW3AAAE.",
  "portalId": "pKl9SW3AAAE.",
  "name": "Иван Петров",
  "phoneCountryCode": "7",
  "phone": "9161234567",
  "playback_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "packages": []
}

Просмотр списка абонентов

Через веб-интерфейс

В разделе "Абоненты" отображается таблица со всеми абонентами портала:

  • Имя — имя или идентификатор абонента
  • Телефон — полный номер телефона
  • Пакеты — количество подключённых пакетов
  • Последняя активность — время последнего входа или просмотра
  • Статус — активен/заблокирован
  • Действия — кнопки редактирования, управления пакетами и удаления

Через Management API

Получить список всех абонентов:

curl -X GET https://your-catena-domain.com/tv-management/api/v1/subscribers \
  -H "X-Auth-Token: your-api-key"

Ответ:

{
  "subscribers": [
    {
      "subscriberId": "sKl9SW3AAAE.",
      "portalId": "pKl9SW3AAAE.",
      "name": "Иван Петров",
      "phoneCountryCode": "7",
      "phone": "9161234567",
      "playback_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
      "packages": ["pKl9SW3AAAE.", "bKl9SW3AAAE."]
    },
    {
      "subscriberId": "tKl9SW3AAAE.",
      "portalId": "pKl9SW3AAAE.",
      "name": "Мария Сидорова",
      "phoneCountryCode": "7",
      "phone": "9267654321",
      "playback_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
      "packages": ["pKl9SW3AAAE."]
    }
  ],
  "next": "cursor-for-next-page"
}

Пагинация:

curl -X GET "https://your-catena-domain.com/tv-management/api/v1/subscribers?cursor=cursor-for-next-page" \
  -H "X-Auth-Token: your-api-key"

Получение информации об абоненте

Через Management API

curl -X GET https://your-catena-domain.com/tv-management/api/v1/subscribers/sKl9SW3AAAE. \
  -H "X-Auth-Token: your-api-key"

Ответ: Аналогичен объекту subscriber из списка.

Редактирование абонента

Через веб-интерфейс

  1. Откройте список абонентов
  2. Найдите нужного абонента и нажмите кнопку "Редактировать"
  3. Измените параметры:

  4. Name — имя абонента

  5. Phone Country Code — код страны
  6. Phone — номер телефона

  7. Сохраните изменения

Примечание: При изменении номера телефона абонент должен будет пройти повторную аутентификацию по SMS с новым номером.

Через Management API

curl -X PUT https://your-catena-domain.com/tv-management/api/v1/subscribers/sKl9SW3AAAE. \
  -H "X-Auth-Token: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Иван Петрович Петров",
    "phoneCountryCode": "7",
    "phone": "9161234567"
  }'

Управление подписками на пакеты

Подключение пакета к абоненту

Через веб-интерфейс:

  1. Откройте карточку абонента
  2. Перейдите в раздел "Пакеты"
  3. Нажмите "Добавить пакет"
  4. Выберите пакет из списка доступных
  5. Подтвердите добавление

Абонент немедленно получит доступ ко всем каналам из добавленного пакета.

Через Management API:

curl -X POST https://your-catena-domain.com/tv-management/api/v1/packages-subscribers \
  -H "X-Auth-Token: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "subscriberId": "sKl9SW3AAAE.",
    "packageId": "pKl9SW3AAAE."
  }'

Ответ:

{
  "subscriberId": "sKl9SW3AAAE.",
  "packageId": "pKl9SW3AAAE.",
  "portalId": "pKl9SW3AAAE."
}

Отключение пакета от абонента

Через веб-интерфейс:

  1. Откройте карточку абонента
  2. Перейдите в раздел "Пакеты"
  3. Найдите пакет в списке активных
  4. Нажмите "Удалить"
  5. Подтвердите отключение

Абонент немедленно потеряет доступ ко всем каналам из отключённого пакета.

Через Management API:

curl -X DELETE https://your-catena-domain.com/tv-management/api/v1/packages-subscribers \
  -H "X-Auth-Token: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "subscriberId": "sKl9SW3AAAE.",
    "packageId": "pKl9SW3AAAE."
  }'

Массовое управление подписками

Для массового подключения или отключения пакетов используйте циклы или скрипты. Пример добавления пакета нескольким абонентам:

#!/bin/bash
SUBSCRIBERS=("sKl9SW3AAAE." "tKl9SW3AAAE." "uKl9SW3AAAE.")
PACKAGE_ID="pKl9SW3AAAE."

for SUBSCRIBER_ID in "${SUBSCRIBERS[@]}"; do
  curl -X POST https://your-catena-domain.com/tv-management/api/v1/packages-subscribers \
    -H "X-Auth-Token: your-api-key" \
    -H "Content-Type: application/json" \
    -d "{
      \"subscriberId\": \"$SUBSCRIBER_ID\",
      \"packageId\": \"$PACKAGE_ID\"
    }"
done

Удаление абонента

Через веб-интерфейс

  1. Откройте список абонентов
  2. Найдите абонента для удаления
  3. Нажмите кнопку "Удалить"
  4. Подтвердите удаление

Предупреждение: При удалении абонента:

  • Учётная запись будет полностью удалена
  • Все подписки на пакеты будут отменены
  • История просмотров сохранится для аналитики
  • Абонент потеряет доступ к просмотру каналов
  • Восстановление учётной записи будет невозможно

Через Management API

curl -X DELETE https://your-catena-domain.com/tv-management/api/v1/subscribers/sKl9SW3AAAE. \
  -H "X-Auth-Token: your-api-key"

Мониторинг активности абонентов

Просмотр сеансов воспроизведения

Catena автоматически регистрирует все сеансы просмотра каналов абонентами. Это позволяет отслеживать активность, популярность каналов и выявлять проблемы.

Получить сеансы конкретного абонента:

curl -X GET "https://your-catena-domain.com/tv-management/api/v1/play-sessions?subscriberId=sKl9SW3AAAE." \
  -H "X-Auth-Token: your-api-key"

Получить только активные сеансы:

curl -X GET "https://your-catena-domain.com/tv-management/api/v1/play-sessions?subscriberId=sKl9SW3AAAE.&active=true" \
  -H "X-Auth-Token: your-api-key"

Фильтрация по времени:

curl -X GET "https://your-catena-domain.com/tv-management/api/v1/play-sessions?subscriberId=sKl9SW3AAAE.&opened_at_gte=1714233600&opened_at_lt=1714320000" \
  -H "X-Auth-Token: your-api-key"

Ответ:

{
  "sessions": [
    {
      "sessionId": "sessKl9SW3AAAE.",
      "subscriberId": "sKl9SW3AAAE.",
      "channelId": "chKl9SW3AAAE.",
      "channelName": "sport1",
      "portalId": "pKl9SW3AAAE.",
      "openedAt": 1714233600,
      "closedAt": 1714237200,
      "active": false,
      "bytes": 5242880000,
      "ip": "192.168.1.100",
      "userAgent": "VLC/3.0.16"
    }
  ],
  "next": "cursor-for-next-page"
}

Журнал операций

Все изменения в учётных записях абонентов (создание, удаление, изменение подписок) записываются в журнал операций.

Получить операции по абоненту:

curl -X GET "https://your-catena-domain.com/tv-management/api/v1/operations?subscriberId=sKl9SW3AAAE." \
  -H "X-Auth-Token: your-api-key"

Фильтрация по типу операции:

curl -X GET "https://your-catena-domain.com/tv-management/api/v1/operations?subscriberId=sKl9SW3AAAE.&type=createPackageSubscriber" \
  -H "X-Auth-Token: your-api-key"

Ответ:

{
  "operations": [
    {
      "operationId": "opKl9SW3AAAE.",
      "type": "createSubscriber",
      "subscriberId": "sKl9SW3AAAE.",
      "portalId": "pKl9SW3AAAE.",
      "createdAt": "2024-10-16T10:00:00Z",
      "payload": {
        "name": "Иван Петров",
        "phone": "+79161234567"
      }
    },
    {
      "operationId": "opKl9SW3AAAB.",
      "type": "createPackageSubscriber",
      "subscriberId": "sKl9SW3AAAE.",
      "packageId": "pKl9SW3AAAE.",
      "portalId": "pKl9SW3AAAE.",
      "createdAt": "2024-10-16T10:05:00Z",
      "payload": {
        "packageId": "pKl9SW3AAAE."
      }
    }
  ],
  "next": "cursor-for-next-page"
}

Типичные сценарии использования

Создание нового абонента с базовым пакетом

Задача: Зарегистрировать нового абонента и подключить базовый пакет

Шаги:

  1. Создайте учётную запись абонента через API
  2. Получите subscriberId из ответа
  3. Подключите базовый пакет через API packages-subscribers
  4. Абонент получает SMS для входа в приложение
  5. После входа абонент видит каналы из базового пакета

Пример скрипта:

#!/bin/bash

# 1. Создаём абонента
RESPONSE=$(curl -s -X POST https://your-catena-domain.com/tv-management/api/v1/subscribers \
  -H "X-Auth-Token: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Новый абонент",
    "phoneCountryCode": "7",
    "phone": "9161234567"
  }')

# 2. Извлекаем ID абонента
SUBSCRIBER_ID=$(echo $RESPONSE | jq -r '.subscriberId')

# 3. Подключаем базовый пакет
curl -X POST https://your-catena-domain.com/tv-management/api/v1/packages-subscribers \
  -H "X-Auth-Token: your-api-key" \
  -H "Content-Type: application/json" \
  -d "{
    \"subscriberId\": \"$SUBSCRIBER_ID\",
    \"packageId\": \"basic-package-id\"
  }"

echo "Абонент создан с ID: $SUBSCRIBER_ID"

Апгрейд абонента на премиум пакет

Задача: Перевести абонента с базового на премиум пакет

Вариант 1: Добавить премиум к базовому

# Абонент получит доступ к каналам обоих пакетов
curl -X POST https://your-catena-domain.com/tv-management/api/v1/packages-subscribers \
  -H "X-Auth-Token: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "subscriberId": "sKl9SW3AAAE.",
    "packageId": "premium-package-id"
  }'

Вариант 2: Заменить базовый на премиум

# Сначала отключаем базовый
curl -X DELETE https://your-catena-domain.com/tv-management/api/v1/packages-subscribers \
  -H "X-Auth-Token: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "subscriberId": "sKl9SW3AAAE.",
    "packageId": "basic-package-id"
  }'

# Затем подключаем премиум
curl -X POST https://your-catena-domain.com/tv-management/api/v1/packages-subscribers \
  -H "X-Auth-Token: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "subscriberId": "sKl9SW3AAAE.",
    "packageId": "premium-package-id"
  }'

Интеграция с биллинговой системой

Задача: Автоматически управлять подписками на основе платежей

Концепция:

  1. Биллинговая система отслеживает платежи абонентов
  2. При успешной оплате биллинг вызывает API Catena для подключения пакета
  3. При окончании подписки биллинг отключает пакет через API
  4. Catena автоматически управляет доступом к каналам

Пример webhook от биллинга:

import requests

def on_payment_success(subscriber_phone, package_name):
    # 1. Найти абонента по телефону
    subscribers = requests.get(
        f"https://catena.example.com/tv-management/api/v1/subscribers",
        headers={"X-Auth-Token": "your-api-key"}
    ).json()

    subscriber = next(
        s for s in subscribers['subscribers']
        if f"+{s['phoneCountryCode']}{s['phone']}" == subscriber_phone
    )

    # 2. Подключить оплаченный пакет
    requests.post(
        "https://catena.example.com/tv-management/api/v1/packages-subscribers",
        headers={"X-Auth-Token": "your-api-key"},
        json={
            "subscriberId": subscriber['subscriberId'],
            "packageId": get_package_id(package_name)
        }
    )

def on_subscription_expired(subscriber_phone, package_name):
    # Аналогично, но через DELETE
    pass

Массовая миграция абонентов

Задача: Перенести абонентов из старой системы в Catena

Шаги:

  1. Экспортируйте данные абонентов из старой системы (CSV/JSON)
  2. Создайте скрипт массового импорта через API
  3. Создайте учётные записи в Catena
  4. Подключите соответствующие пакеты
  5. Оповестите абонентов о переходе на новую систему

Пример скрипта импорта:

import csv
import requests

API_URL = "https://catena.example.com/tv-management/api/v1"
API_KEY = "your-api-key"

def import_subscribers(csv_file):
    with open(csv_file, 'r') as f:
        reader = csv.DictReader(f)
        for row in reader:
            # Создать абонента
            response = requests.post(
                f"{API_URL}/subscribers",
                headers={"X-Auth-Token": API_KEY},
                json={
                    "name": row['name'],
                    "phoneCountryCode": row['country_code'],
                    "phone": row['phone']
                }
            )

            subscriber_id = response.json()['subscriberId']

            # Подключить пакеты
            for package_id in row['packages'].split(','):
                requests.post(
                    f"{API_URL}/packages-subscribers",
                    headers={"X-Auth-Token": API_KEY},
                    json={
                        "subscriberId": subscriber_id,
                        "packageId": package_id.strip()
                    }
                )

            print(f"Импортирован: {row['name']} ({subscriber_id})")

import_subscribers('subscribers.csv')

Лучшие практики

Управление номерами телефонов

Рекомендации:

  • Валидация при вводе — проверяйте формат номера до отправки в API
  • Уникальность — один номер телефона = один абонент
  • Международный формат — храните код страны и номер раздельно
  • Изменение номера — требуйте подтверждения через SMS на новый номер
  • Деактивация — при отключении номера оператором своевременно обновляйте данные

Безопасность

Защита токенов воспроизведения:

  • Не передавайте playback_token третьим лицам
  • Используйте HTTPS для всех API запросов
  • Регулярно обновляйте токены при подозрении на компрометацию
  • Логируйте попытки доступа с неверными токенами

Контроль доступа:

  • Ограничивайте количество одновременных сеансов на абонента
  • Отслеживайте подозрительную активность (разные IP, разные устройства)
  • Блокируйте абонентов при обнаружении мошенничества

Управление подписками

Рекомендации:

  • Плавный переход — предупреждайте об изменениях в подписках заранее
  • Автоматизация — интегрируйте с биллингом для автоматического управления
  • Бесплатные пакеты — используйте free packages в портале для демо-контента
  • Пробные периоды — временно подключайте премиум пакеты для trial
  • История изменений — используйте журнал операций для аудита

Коммуникация с абонентами

Когда отправлять уведомления:

  • При создании учётной записи
  • При изменении подписок
  • При окончании оплаченного периода
  • При изменении номера телефона
  • При блокировке доступа

Каналы коммуникации:

  • SMS — для кодов входа и критичных уведомлений
  • Email — для информационных рассылок (если есть в вашей системе)
  • Push-уведомления — через мобильное приложение
  • In-app сообщения — при входе в приложение

Устранение проблем

Абонент не может войти по SMS

Возможные причины:

  • Неверно указан номер телефона при регистрации
  • SMS не доставлена (проблемы оператора связи)
  • Код из SMS истёк
  • Номер телефона заблокирован в SMS-шлюзе

Решение:

  1. Проверьте номер телефона в учётной записи абонента
  2. Убедитесь, что формат номера корректен (+код_страны + номер)
  3. Проверьте логи SMS-шлюза на доставку сообщений
  4. Попробуйте отправить SMS повторно
  5. Если SMS не приходят — проверьте баланс SMS-шлюза и его настройки

Абонент не видит каналы

Возможные причины:

  • У абонента нет подключённых пакетов
  • Пакеты не содержат каналов
  • Токен воспроизведения устарел или недействителен
  • Технические проблемы со streaming-сервером

Решение:

  1. Проверьте список пакетов в поле packages абонента
  2. Убедитесь, что пакеты содержат каналы
  3. Проверьте, что каналы активны и работают
  4. Перегенерируйте playback_token если необходимо
  5. Проверьте логи streaming-сервера

Ошибки при подключении пакета

Возможные причины:

  • Пакет уже подключён к абоненту
  • Указан неверный packageId или subscriberId
  • Пакет и абонент принадлежат разным порталам
  • Пакет не существует или удалён

Решение:

  1. Проверьте текущие пакеты абонента через GET /subscribers/{id}
  2. Убедитесь, что ID пакета и абонента корректны
  3. Проверьте, что пакет существует через GET /packages/{id}
  4. Убедитесь, что portalId совпадает у пакета и абонента

Дубликаты номеров телефонов

Проблема: Попытка создать абонента с уже существующим номером

Решение:

  • API должен возвращать ошибку при создании дубликата
  • Перед созданием проверяйте наличие абонента с таким номером
  • Используйте UPDATE вместо CREATE для существующих абонентов
  • Реализуйте поиск по номеру телефона в вашем интерфейсе

См. также