SMeetMini Apps

SMeet Mini Apps

Эксплуатация

За чем следить и что делать, когда мини-приложение уже работает: лимиты, отвечающие 429, пауза, отвечающая maintenance, окно, которое не может достучаться до вашей страницы, и ключи, которые пора сменить.

Лимиты#

ЧтоЛимит
Открытие окна10 в минуту на человека; 50 в секунду на мини-приложение
Коды входа (authorize())60 в минуту на человека
Обмен и проверка сессий50 в секунду на ключ, 200 в секунду на мини-приложение
Результаты боту (submitToBot())1 в секунду и 20 в минуту на человека в мини-приложении; 10 в секунду на мини-приложение; 20 в секунду на владельца
Один результат16 КиБ JSON
Сообщение моста64 КиБ; 20 запросов в секунду на страницу
Запрос к API автора64 КиБ
Тестировщики20 на мини-приложение
Ключи2 действующих на среду

При превышении страница получает RATE_LIMITED, а ваш сервер 429 RATE_LIMITED с retry_after. Результат ждёт в очереди бота не больше 7 дней, как любое событие; бот, не получивший его за это время, его теряет.

Платформа может задать другие лимиты одному мини-приложению: открытия, коды входа человека в нём, вызовы вашего сервера на ключ и на мини-приложение, результаты на мини-приложение и результаты в минуту на человека в нём; и другой общий поток результатов всем мини-приложениям одного владельца. Лимиты человека во всех мини-приложениях вместе, один результат в секунду на человека и общие лимиты платформы одинаковы для всех мини-приложений.

Лимиты установки#

Тот, кто ведёт установку SMeet, задаёт умолчания в окружении сервиса ботов. Скорость означает число запросов в секунду или в минуту, запас (burst) означает целое число запросов разом. Лимиты, которые администратор платформы задаёт одному мини-приложению или одному владельцу, заменяют только умолчания своей группы; пустой набор возвращает умолчания.

ПеременнаяПо умолчаниюЧтоДля кого задаётся
BOTS_MINIAPPS_LIMITS_LAUNCHESPERSECONDPERAPP, BOTS_MINIAPPS_LIMITS_BURSTLAUNCHESPERAPP50, 50открытия в секунду на мини-приложениеодно мини-приложение
BOTS_MINIAPPS_LIMITS_CODESPERMINUTEPERPERSONINAPP60коды входа в минуту на человека в одном мини-приложенииодно мини-приложение
BOTS_MINIAPPS_LIMITS_AUTHORCALLSPERSECONDPERKEY, BOTS_MINIAPPS_LIMITS_BURSTAUTHORCALLSPERKEY50, 50вызовы API автора в секунду на ключодно мини-приложение
BOTS_MINIAPPS_LIMITS_AUTHORCALLSPERSECONDPERAPP, BOTS_MINIAPPS_LIMITS_BURSTAUTHORCALLSPERAPP200, 200вызовы API автора в секунду на мини-приложениеодно мини-приложение
BOTS_MINIAPPS_LIMITS_SUBMISSIONSPERMINUTEPERPERSON20результаты в минуту на человека в одном мини-приложенииодно мини-приложение
BOTS_MINIAPPS_LIMITS_SUBMISSIONSPERSECONDPERAPP, BOTS_MINIAPPS_LIMITS_BURSTSUBMISSIONSPERAPP10, 10результаты в секунду на мини-приложениеодно мини-приложение
BOTS_MINIAPPS_LIMITS_SUBMISSIONSPERSECONDPEROWNER, BOTS_MINIAPPS_LIMITS_BURSTSUBMISSIONSPEROWNER20, 20результаты в секунду всех мини-приложений одного владельцаодин владелец
BOTS_MINIAPPS_LIMITS_LAUNCHESPERMINUTEPERPERSON10открытия в минуту на человека, все мини-приложения вместевся установка
BOTS_MINIAPPS_LIMITS_CODESPERMINUTEPERPERSON60коды входа в минуту на человека, все мини-приложения вместевся установка
BOTS_MINIAPPS_LIMITS_SUBMISSIONSPERSECONDPERPERSON1результаты в секунду на человека в одном мини-приложениився установка
BOTS_MINIAPPS_LIMITS_LAUNCHESPERSECOND, BOTS_MINIAPPS_LIMITS_AUTHORCALLSPERSECOND, BOTS_MINIAPPS_LIMITS_SUBMISSIONSPERSECOND200, 1000, 100открытия, вызовы API автора и результаты в секунду, все мини-приложения вместевся установка

Ошибки и что делать#

ГдеКодЧто делать
СтраницаNOT_READY от connect()окно показывает экран ошибки; человек повторит там
СтраницаLAUNCH_CLOSEDостановиться; SMeet сам объяснит человеку причину
СтраницаMAINTENANCEсообщить, что приложение временно недоступно; сохранить черновик
СтраницаCODE_EXPIRED, NETWORKснова вызвать метод
СтраницаQUEUE_FULL, RATE_LIMITEDсохранить черновик и его requestId; повторить позже. RATE_LIMITED после трёх нажатий Отмена подряд действует, пока человек не откроет приложение заново (Ошибки)
СерверINVALID_CREDENTIALSключ неверен или отозван; исправить настройки, не повторять
СерверAPP_MISMATCH, ENVIRONMENT_MISMATCHключ принадлежит другому приложению или среде
СерверCODE_*страница входит заново
СерверACCESS_DENIED, checkSession с active: falseчеловек сейчас не может пользоваться приложением; показать почему, по reason
СерверTEMPORARILY_UNAVAILABLE, RATE_LIMITED, 502, 503, 504повторить тот же запрос с тем же ключом через retry_after
СерверMINI_APPS_MAINTENANCE, reason: maintenanceплатформа на паузе; повторить позже
БотACCESS_REVISION_CONFLICT, BOT_STOPPED_OR_BLOCKEDразговор изменился или закончился: не отправлять заново

Все коды: мост, API автора, Bot API.

Диагностика#

Диагностика на экране мини-приложения в «Мои боты» показывает проверки обоих адресов (домен и встраивание) и числа за последние семь дней по UTC, включая сегодняшний, для рабочей и тестовой версии:

СтрокаЧто считает
Открытияоткрытые окна
Страницы, сообщившие о готовностистраницы, вызвавшие ready()
Страницы, не успевшие сообщить о готовностистраницы, не вызвавшие ready() за 15 секунд
Запрет показа во фрейместраницы, не подключившиеся за 15 секунд после загрузки, например при запрете встраивания (Когда окно показывает ошибку)
Входыкоды входа, которые обменял ваш сервер
Результаты, отправленные ботурезультаты, которые приняла очередь бота
Запросы сверх лимитовзапросы, отклонённые с RATE_LIMITED

Под таблицей отказы по кодам: коды, с которыми SMeet отказал человеку в открытии, коде входа или результате, и коды, которые ваш сервер получил от API автора. Людей числа не называют. Числа окон, входов и результатов берутся из последней почасовой свёртки, отказы и запросы сверх лимитов из последней минуты. Пока нет данных означает, что все числа нулевые.

Экран читает числа как diagnostics мини-приложения: from и to означают дни периода по UTC в виде YYYY-MM-DD; opens, ready, readyTimeouts, embedBlocked, logins, submissions и rateLimited имеют вид {"production": n, "test": n}; refusals имеет вид {"production": {"CODE": n}, "test": {"CODE": n}}.

Иконка в каталоге#

Каталог показывает иконку всем, со входом и без, по адресу https://messenger.scrile.com/graphql/image-thumbnails/mini-app-icons/<appId>/<размер>: PNG размером 48, 64, 96, 128, 192 или 256 пикселей (96, если размер не указан). Адрес отвечает только для опубликованного мини-приложения публичного пространства SMeet и только для иконки PNG, JPEG, GIF или WebP; на всё остальное, в том числе на иконку SVG, он отвечает 404, и каталог показывает первую букву названия. Новая иконка сохраняет адрес, поэтому браузеры могут показывать прежнюю ещё минуту; мини-приложение на паузе, заблокированное или снятое с публикации теряет иконку там в течение минуты. Внутри SMeet экран согласия показывает иконку той версии, которую человек открывает, в том числе тестовой, а профиль бота показывает иконку опубликованной версии.

Смена ключей#

У среды до двух действующих ключей, поэтому ключ меняется без перерыва:

  1. Выпустите второй ключ в разделе Ключи вашего сервера. Он показывается один раз; поместите его в окружение сервера.
  2. Перезапустите или переразверните сервер с новым ключом и проверьте, что вход работает.
  3. Отзовите старый ключ. С этого момента он получает 401 INVALID_CREDENTIALS.

Сессии, созданные старым ключом, действуют до своего истечения. Если ключ мог утечь, отзовите его сразу, даже до развёртывания нового: вход до этого не работает, но данные людей в безопасности. Токен бота отдельный и меняется в «Моих ботах» (Управление ботом).

Пауза и удаление#

  • Приостановить мини-приложение останавливает его: никто не может его открыть, а открытые окна закрываются. Возобновить мини-приложение возвращает его. Приостановленное приложение нельзя отправить на проверку.
  • Удалить мини-приложение окончательно. Открытые окна закрываются на всех устройствах, ключи вашего сервера перестают работать, тестировщики теряют доступ, а результаты, которые бот ещё не получил, отменяются. Бот и его чаты остаются.
  • Приложение, заблокированное SMeet, удалить нельзя, а новое приложение для того же бота создаётся заблокированным. Письмо о блокировке называет причину; вопросы присылайте на support@scrile.com.

Пауза платформы#

SMeet может приостановить мини-приложения или ботов для обслуживания. В это время:

  • страница получает MAINTENANCE на свои вызовы, а новые окна не открываются;
  • exchangeLaunchCode отвечает 503 MINI_APPS_MAINTENANCE с retry_after 30;
  • checkSession отвечает active: false, reason: maintenance;
  • revokeSession продолжает работать.

Сохраняйте черновики и их requestId, сообщайте человеку, что приложение временно недоступно, и давайте повторить позже. У SMeet ничего не теряется: уже принятые результаты ждут в очереди бота.

Когда окно показывает ошибку#

Окно пишетЧто произошлоЧто проверить
«Приложение не отвечает или запрещает встраивание»страница не подключилась за 15 секунд после начала загрузкизаголовок frame-ancestors, ответ адреса 2xx без перенаправления, SDK в <head> страницы
«Приложение не отвечает»страница подключилась, но не вызвала ready() за 15 секундвызывать ready(), как только нарисован первый экран, до медленных запросов
«Страница ушла с <домен> или не отвечает»страница ушла на другой origin или перестала отвечать больше чем на 2 секундыссылки на другие сайты через openExternalLink; никакой долгой синхронной работы на странице

Первые два экрана предлагают Повторить (первый ещё Открыть в браузере без входа); третий предлагает Вернуться в приложение. Человек может также выбрать Перезагрузить в меню.

Идентификаторы запросов#

Каждый ответ API автора несёт X-Request-Id, а каждая ошибка ещё и request_id в теле. Пишите его в журнал вместе с методом и кодом и указывайте, когда пишете на support@scrile.com. Ответ прокси SMeet (429, 413) приходит с пустым request_id.

Журналы#

Коды входа, verifier, токены сессий, ключи, секреты попыток и тела, в которых они есть, никогда не попадают в журнал, ни ваш, ни библиотеки. Пишите метод, путь без строки запроса, статус, код и request_id. Данным форм людей место в вашей базе данных, а не в журналах.