01Что такое источник данных
Источник данных: это веб-адрес, который вы сохраняете один раз. Когда зритель запускает команду, которая на него ссылается, бот обращается к этому адресу, извлекает одно значение из ответа и произносит его в чате. Погода, игровая статистика, длина очереди на вашем собственном сервере: если это отвечает по https и возвращает JSON или текст, команда может это прочитать.
PrincessBarney !weather
ItsBagelBot Сейчас в Монреале 21°C.
За этой строкой стоит обычная пользовательская команда. Её ответ, как он введён в редакторе:
Сейчас в Монреале {urlfetch:weather}°C.
Токен называет источник, а не значение. Место, откуда бот берёт значение, сохранено в самом источнике
в виде пути: адреса внутри ответа. Ответ это здание, current это этаж,
temperature_2m это дверь. Запишите всё с точками, и получится
current.temperature_2m. Третий раздел делает эти клики за вас, и аналогия на этом
заканчивает свою работу.
02Добавьте источник из редактора команд
Всё происходит в разделе Команды, в редакторе, который открывается рядом со списком ваших команд.
- Поставьте курсор там, где будет значение
Откройте команду, нажмите в Ответ и оставьте курсор на том месте предложения, где должно стоять значение.
- Откройте палитру
Под ответом, рядом с метками
{user}и{args}, есть плашка Источник данных. - Создайте новый
+ Новый источник данных открывает окно Добавить источник данных: «Укажите веб-API, получите один реальный ответ, затем нажмите на значение, которое хотите показать в чате.»
- Назовите его и вставьте адрес
Отображаемое имя нужно для вас. Оно автоматически превращается в Имя источника данных, то есть слово, которое попадает в токен: «Строчные буквы, цифры и подчёркивания. Используется внутри {urlfetch:name}.» Затем Веб-адрес: https, до 512 символов.
- Получите один реальный ответ
Получить пример вызывает ваш API по-настоящему, примерно раз в 10 секунд. Если ответ приходит в виде, который окно не умеет читать, нажмите или вставьте ответ вручную и вставьте ответ сами.
- Нажмите на значение, затем добавьте источник
Ответ превращается в дерево под подсказкой «Нажмите на значение, которое хотите показать в чате.» Нажмите
temperature_2m, и окно покажет Показывается current.temperature_2m. Добавить источник сохраняет всё, а строка в палитре вставляет{urlfetch:weather}на место курсора.
Добавить источник данных
Укажите веб-API, получите один реальный ответ, затем нажмите на значение, которое хотите показать в чате.
Строчные буквы, цифры и подчёркивания. Используется внутри {urlfetch:name}.
Нажмите на значение, которое хотите показать в чате.
- 01 Отображаемое имя: это то, что вы видите в списках. Оно автоматически превращается в имя источника данных ниже.
- 02 Имя источника данных: это слово в токене: строчные буквы, цифры и подчёркивания, до 32 символов.
- 03 Веб-адрес: https, абсолютный, до 512 символов. Бот отправляет его ровно так, как введено, каждый раз.
- 04 «Получить пример» делает настоящий запрос к вашему API. Примерно один тест каждые 10 секунд.
- 05 Нажатие на значение сохраняет его путь в источнике. «Использовать весь ответ» переключает на обычный текст.
Когда источник создан, та же плашка показывает его в списке. Каждый сохранённый источник отображает свой путь, так что два погодных канала можно различить с первого взгляда, а нажатие на строку вставляет токен туда, где был курсор.
Вставить переменную
- 01 Плашка «Источник данных» стоит вместе с метками токенов под полем «Ответ», рядом со «Счётчиком».
- 02 Каждая строка показывает путь, сохранённый в источнике, или «Обычный текст», если выводится весь ответ.
- 03 «+ Новый источник данных» открывает окно, не теряя команду, которую вы пишете.
03Выбор значения
Вот то же дерево, что и в панели управления, с теми же правилами. Кликабельны только значения; ветка вроде current содержит другие вещи, поэтому не может завершать путь. Измените ответ слева, и дерево следует за ним. Это самый быстрый способ порепетировать со своим API до сохранения чего-либо.
Сохранено в источнике
Токен, который вы вводите
Путь, написанный в токене
Чат покажетобрезано здесь, 100 байт
Режим обычного текста вообще не использует путь. Бот очищает ответ и показывает его первые 100 байт.
| Правило | Что это значит |
|---|---|
| Точки между шагами | current.temperature_2m открывает current, затем достаёт из него temperature_2m. |
| Списки используют голые цифры | items.0.name указывает на первый элемент. Квадратные скобки не входят в грамматику. |
| Глубина | До 8 шагов. Дальше дерево отказывает в значении: «Глубже 8 уровней. Выберите что-нибудь ближе к началу.» |
| Каждый шаг | Буквы, цифры, подчёркивание и дефис, до 64 символов каждый. |
| Конец пути | Указывает на значение: текст, число, true или false. Остановка на объекте, списке или пустом поле считается сломанным источником данных, и чат показывает ваш |default или сам токен, если его нет. |
| Путь внутри токена | Имеет приоритет над сохранённым в источнике. {urlfetch:weather.current.wind_speed_10m} читает другое значение по тому же адресу. |
| Имя | Без учёта регистра. {URLFETCH:Weather} и {urlfetch:weather} указывают на один и тот же источник. |
| Значение | Очищается, обрезается, затем режется по 100 байтам, прежде чем попасть в чат. |
{urlfetch:weather} на current.temperature_2m для
!weather, затем напишите
{urlfetch:weather.current.wind_speed_10m} в !wind.
Тот же источник, тот же бюджет из 20 источников данных, два разных ответа.04API, которым нужен ключ
Некоторым API нужен ключ, прежде чем они ответят. Добавьте его один раз в Настройках, в панели Ключи API: метку до 32 символов, чтобы потом его узнавать, и сам секрет, до 512 символов, затем Добавить ключ. В подсказке на самой панели всё сказано предельно ясно: «Ключи API, которые ваши источники данных отправляют с каждым запросом. Пользователи с общим доступом могут использовать их, но никогда не увидят их значения.»
Секрет шифруется до записи и больше никогда не показывается. Вам остаются метка и последние 4 символа, чтобы отличить два ключа, когда вы меняете один из них. Когда у источника данных есть ключ, бот отправляет его в заголовке Authorization: Bearer при каждом запросе, а сам адрес остаётся чистым.
В окне «Добавить источник данных» выберите ключ в поле Ключ API. «Ключ не требуется» подходит для большинства публичных API. Если сохранённых ключей пока нет, поле говорит «Ключей API пока нет. Добавьте ключ в Настройках, затем выберите его здесь.», а ссылка Открыть ключи API ведёт в Настройки.
05Лимиты и задержки
Цифры ниже действуют в эксплуатации. Кэш вы заметите первым: ответ, который бот уже получил, повторно используется 30 секунд, поэтому команда, запущенная 40 раз за минуту, всё равно обращается к вашему API только дважды.
| Лимит | Значение |
|---|---|
| Источников данных на канал | 20. |
| Источников данных в одном ответе | 3. Редактор отказывается сохранить четвёртый. |
| Веб-адрес | Только https, абсолютный, до 512 символов. |
| Отклоняемые адреса | IP-адреса в виде литералов, localhost и всё, что заканчивается на .local или .internal. Проверяется при сохранении и при каждом запросе. |
| Размер ответа | Бот читает до 1 МиБ ответа, измеряется после распаковки. |
| Размер примера | Редактор показывает дерево только для примера читаемого текста размером до 128 КБ. Больший или нечитаемый ответ даёт «API ответил, но его ответ не удалось прочитать автоматически. Вставьте его ниже вручную.» Вставленный пример больше 128 КБ даёт «Этот пример превышает 128 КБ. Вставьте более короткий.» |
| Тип содержимого | application/json или text/*. |
| Таймауты | API получает 2,5 секунды, сервис запросов 3 секунды, а бот перестаёт ждать через 3,5 секунды. |
| Кэш | Хороший ответ хранится 30 секунд. Отказ, например 404 или путь, который ничего не нашёл, хранится 15 секунд. Сбой не кэшируется. |
| Запросов на канал | 6 в минуту, по всем вашим источникам данных. |
| Запросов на источник данных | 30 в минуту. |
| Запросов на хост API | 120 в минуту, с учётом всех каналов, которые указывают на этот хост. |
| Перенаправления | До 3 переходов, каждый остаётся на https. |
| Хост, который постоянно падает | Пять ошибок транспорта подряд, и этот хост отдыхает 60 секунд. |
| «Получить пример» | Примерно один тест каждые 10 секунд: «Слишком много тестов. Каждый вызывает настоящий API. Подождите около 10 секунд и попробуйте снова.» |
- Запросов, которые реально получает ваш API
- 2 в минуту
- Отданы из кэша на 30 секунд
- 10 в минуту
- Отклонено лимитом 6 в минуту
- 0 в минуту
Такие запуски вместо значения ничего не выводят, либо выводят ваш запасной вариант.
Кэш существует ради вашей квоты API. Без него один рейд исчерпал бы месячный лимит запросов за один вечер, и все остальные каналы, указывающие на тот же хост, это бы почувствовали.
06Что показывает чат при сбое
Команда никогда не замолкает из-за источника данных. Остаток фразы всё равно уходит, а значение остаётся пустым, если только вы не написали запасной вариант после вертикальной черты: {urlfetch:weather|недоступно} выведет «недоступно», когда получение не удалось. Источник, который приостановлен, отсутствует или не может выдать значение, работает так же: чат и таймеры показывают значение |default токена. Без |default чат выводит токен как есть, как его ввели, поэтому голый {urlfetch:weather} в чате означает «проверьте этот источник данных».
| Что произошло | Что показывает чат |
|---|---|
| API отказал, ограничил вас, вернул ошибку, ответил дольше, чем бот ждёт, путь ничего не нашёл, или сообщение является повтором более старого | Ничего вместо значения или текст вашего |запасного варианта. |
| Источник приостановлен, отсутствует, никогда не был сохранён или не смог выдать значение | Текст вашего |запасного варианта. Без него токен выводится как есть: {urlfetch:weather}. |
PrincessBarney!weather
ItsBagelBotСейчас в Монреале °C.
Ваш ключ отклонён или эндпоинт отклонил запрос. Проверьте в панели управления, и вы получите тот же вердикт: «API отклонил запрос. Проверьте URL и выберите нужный ключ в поле «Ключ API», если этот API его требует.»
Достигнут лимит: 6 запросов в минуту для канала, 30 для этого источника данных или 120 в минуту для этого API во всех каналах. Ничего не сломано, и со следующей минутой всё снова заработает.
Бот ждёт 3,5 секунды, а затем говорит без значения. Обычная причина: медленный API под нагрузкой.
Путь был правильным, но в ответе по нему ничего не нашлось, обычно потому, что API переименовал поле. Откройте источник, получите пример и заново нажмите на значение.
У приостановленного или отсутствующего источника нечего раскрывать. Токен с |default показывает это значение по умолчанию. Токен без |default, как этот, выводится как введён. Панель управления сообщает об этом, когда источник не может выдать значение: «Этот источник данных не смог выдать значение. Пока это так, в чате отображается значение |default токена, если оно задано, иначе {urlfetch:name} как введено. Проверьте веб-адрес и ключ API, затем снова нажмите «Получить пример».»
Три источника данных в одном ответе: это лимит редактора, и он отказывается сохранить четвёртый. Бот держит собственный потолок на восьми и выводит каждый токен сверх него как есть, как этот.
{urlfetch:weather|недоступно}. Тогда медленный API прочитается как «недоступно», а не как дыра в предложении.Если что-то пошло не так
| Что вы видите | Что это значит | Что делать |
|---|---|---|
| API отклонил запрос. Проверьте URL и выберите нужный ключ в поле «Ключ API», если этот API его требует. | API отклонил проверку: неверный или отсутствующий ключ, либо неверный адрес. | Проверьте веб-адрес. Если API требует ключ, добавьте его в Настройках в разделе «Ключи API», выберите в поле «Ключ API» и проверьте снова. |
| Превышен лимит запросов. Подождите немного и повторите тест. | Достигнут лимит запросов. | Подождите минуту и повторите тест. |
| API вернул ошибку. Чат ничего не выводит, если только у токена нет |default: {urlfetch:имя|default}. | API ответил ошибкой. | Проверьте состояние API или добавьте запасной вариант после вертикальной черты. |
| Время ожидания API истекло. Чат ничего не выводит, если только у токена нет |default: {urlfetch:имя|default}. | API ответил дольше, чем бот ждёт. | Попробуйте ещё раз и добавьте запасной вариант после вертикальной черты. |
| Этот источник данных не смог выдать значение. Пока это так, в чате отображается значение |default токена, если оно задано, иначе {urlfetch:name} как введено. Проверьте веб-адрес и ключ API, затем снова нажмите «Получить пример». | Источник приостановлен, либо его путь или адрес не дают значения. | Возобновите источник, если он приостановлен. Иначе исправьте адрес или ключ, получите пример и заново нажмите на значение. |
| Сервис запросов не ответил. Попробуйте ещё раз через минуту. | Сервис, который обращается к вашему API, не ответил вовремя. | Подождите немного и повторите тест. |
| API ответил, но его ответ не удалось прочитать автоматически. Вставьте его ниже вручную. | Ответ не является читаемым текстом или превышает 128 КБ. | Нажмите «или вставьте ответ вручную» и вставьте настоящий ответ сами. |
| Это некорректный JSON. Исправьте его, и дерево появится здесь. | Вставленный пример не является JSON. | Вставьте ответ заново, от первой фигурной скобки до последней. |
| Этот пример превышает 128 КБ. Вставьте более короткий. | Вставленный пример слишком велик для дерева. | Вставьте меньший фрагмент ответа. |
| Слишком много тестов. Каждый вызывает настоящий API. Подождите около 10 секунд и попробуйте снова. | «Получить пример» разрешает примерно один тест каждые 10 секунд. | Подождите 10 секунд. |
| Вы достигли лимита в 20 источников данных для вашего канала. Удалите один, чтобы освободить место. | В канале хранится 20 источников данных. | Удалите источник, который вы больше не используете. |
| Источник данных с именем «name» уже существует. | Другой источник уже использует это имя. | Выберите другое имя или измените существующий источник. |
| Сообщение таймера может ссылаться не более чем на 3 различных полученных значения ({urlfetch:…}). | Сообщения таймеров ограничены 3 источниками данных. | Укажите меньше источников в сообщении таймера. |
| Голый {urlfetch:name} в чате | Источник приостановлен, отсутствует или не может выдать значение, а у токена нет |default. Токены сверх лимита на одно сообщение тоже остаются голыми. | Откройте команду, проверьте, что имя совпадает с сохранённым источником, и возобновите его, если он приостановлен. Добавьте |default, чтобы чат показывал запасной вариант. |
07Чего источник не сделает
-
Адрес фиксируется при сохранении.
{args}и{user}внутри веб-адреса остаются без изменений, поэтому зритель не может направить запрос на ваш API. -
Запросы выполняются методом
GET, а заголовки задавать не вам. Единственный, который добавляет бот, этоAuthorization: Bearer, и только если у источника есть ключ. - Токены раскрываются в ответах пользовательских команд, после проверок прав, эфира и кулдауна, а также в сообщениях таймеров, при каждом срабатывании. Сообщение таймера может ссылаться не более чем на 3 разных источника данных. Счётчики не трогают токен.
- Повторно воспроизведённое сообщение чата никогда не запрашивает данные дважды. Если бот перечитывает старое событие, чат получает пустое место (или ваш запасной вариант), а не второй вызов вашего API.
- Частные и локальные адреса отсекаются с обоих концов: при сохранении и снова во время запроса.
{urlfetch:weather} в предложении, а
{urlfetch:weather.current.wind_speed_10m} сразу после него: два значения,
один запрос, один запрос из вашей квоты.