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_BURSTLAUNCHESPERAPP | 50, 50 | открытия в секунду на мини-приложение | одно мини-приложение |
BOTS_MINIAPPS_LIMITS_CODESPERMINUTEPERPERSONINAPP | 60 | коды входа в минуту на человека в одном мини-приложении | одно мини-приложение |
BOTS_MINIAPPS_LIMITS_AUTHORCALLSPERSECONDPERKEY, BOTS_MINIAPPS_LIMITS_BURSTAUTHORCALLSPERKEY | 50, 50 | вызовы API автора в секунду на ключ | одно мини-приложение |
BOTS_MINIAPPS_LIMITS_AUTHORCALLSPERSECONDPERAPP, BOTS_MINIAPPS_LIMITS_BURSTAUTHORCALLSPERAPP | 200, 200 | вызовы API автора в секунду на мини-приложение | одно мини-приложение |
BOTS_MINIAPPS_LIMITS_SUBMISSIONSPERMINUTEPERPERSON | 20 | результаты в минуту на человека в одном мини-приложении | одно мини-приложение |
BOTS_MINIAPPS_LIMITS_SUBMISSIONSPERSECONDPERAPP, BOTS_MINIAPPS_LIMITS_BURSTSUBMISSIONSPERAPP | 10, 10 | результаты в секунду на мини-приложение | одно мини-приложение |
BOTS_MINIAPPS_LIMITS_SUBMISSIONSPERSECONDPEROWNER, BOTS_MINIAPPS_LIMITS_BURSTSUBMISSIONSPEROWNER | 20, 20 | результаты в секунду всех мини-приложений одного владельца | один владелец |
BOTS_MINIAPPS_LIMITS_LAUNCHESPERMINUTEPERPERSON | 10 | открытия в минуту на человека, все мини-приложения вместе | вся установка |
BOTS_MINIAPPS_LIMITS_CODESPERMINUTEPERPERSON | 60 | коды входа в минуту на человека, все мини-приложения вместе | вся установка |
BOTS_MINIAPPS_LIMITS_SUBMISSIONSPERSECONDPERPERSON | 1 | результаты в секунду на человека в одном мини-приложении | вся установка |
BOTS_MINIAPPS_LIMITS_LAUNCHESPERSECOND, BOTS_MINIAPPS_LIMITS_AUTHORCALLSPERSECOND, BOTS_MINIAPPS_LIMITS_SUBMISSIONSPERSECOND | 200, 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 экран согласия показывает иконку той версии, которую человек открывает, в том числе тестовой, а профиль бота показывает иконку опубликованной версии.
Смена ключей#
У среды до двух действующих ключей, поэтому ключ меняется без перерыва:
- Выпустите второй ключ в разделе Ключи вашего сервера. Он показывается один раз; поместите его в окружение сервера.
- Перезапустите или переразверните сервер с новым ключом и проверьте, что вход работает.
- Отзовите старый ключ. С этого момента он получает
401 INVALID_CREDENTIALS.
Сессии, созданные старым ключом, действуют до своего истечения. Если ключ мог утечь, отзовите его сразу, даже до развёртывания нового: вход до этого не работает, но данные людей в безопасности. Токен бота отдельный и меняется в «Моих ботах» (Управление ботом).
Пауза и удаление#
- Приостановить мини-приложение останавливает его: никто не может его открыть, а открытые окна закрываются. Возобновить мини-приложение возвращает его. Приостановленное приложение нельзя отправить на проверку.
- Удалить мини-приложение окончательно. Открытые окна закрываются на всех устройствах, ключи вашего сервера перестают работать, тестировщики теряют доступ, а результаты, которые бот ещё не получил, отменяются. Бот и его чаты остаются.
- Приложение, заблокированное SMeet, удалить нельзя, а новое приложение для того же бота создаётся заблокированным. Письмо о блокировке называет причину; вопросы присылайте на support@scrile.com.
Пауза платформы#
SMeet может приостановить мини-приложения или ботов для обслуживания. В это время:
- страница получает
MAINTENANCEна свои вызовы, а новые окна не открываются; exchangeLaunchCodeотвечает503 MINI_APPS_MAINTENANCEсretry_after30;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. Данным форм людей место в вашей базе данных, а не в журналах.