Chatterino+

Chatterino+ public API v1

API для тех, кто хочет показывать в СВОЁМ чате (экранный чат для OBS, бот, расширение, клиент) то, что есть у подписчиков Chatterino+ PLUS: пейнты ников, бейдж PLUS и эффекты смайликов. Больше ничего API не даёт.

База: https://chat.eblo.id/api/v1. Только чтение, без ключей и входа. Ответы — JSON в UTF-8, Access-Control-Allow-Origin: *. Версия в адресе: несовместимые изменения выйдут как /api/v2, а /v1 продолжит работать. Новые поля в ответах могут появляться — неизвестные поля пропускайте.

Ошибки: {"error": "<код>", "message": "<текст>"} с HTTP-кодом 400/404/429/5xx. Пределы частоты — по IP; при превышении 429 и заголовок Retry-After. Список подписчиков скачивайте при запуске и держите в памяти, а изменения получайте по живому соединению — опрашивать API по таймеру не нужно.

Остальные адреса сайта chat.eblo.id — внутренние, для нашего собственного экранного чата. Они не часть API и чужим страницам не отвечают.

Содержание: Подписчики PLUS · Один подписчик · Пейнт · Живые изменения · Формат пейнта · Эффекты смайликов

Подписчики PLUS: GET /plus/roster

Все действующие подписчики одним ответом — вместе с их пейнтами и бейджем.

{
  "version": "3f9a1c0d2b7e4411",
  "users": [
    {"id": "47966045", "login": "nick", "badge": true, "paint": 42, "paint_v": 3}
  ],
  "paints": {
    "42": {"v": 3, "spec": {"type": "linear", "angle": 137, "stops": [[0, "#fcf9ff"], [1, "#9f73e6"]],
                             "shadows": [[0, 0, 8, "#9f73e6"]], "anim": {"kind": "slide", "speed": 3}}}
  },
  "badges": {
    "plus": {"title": "Chatterino+ PLUS",
             "urls": {"1x": "https://chat.eblo.id/chat/static/plus-badge-1x.png",
                      "2x": "https://chat.eblo.id/chat/static/plus-badge-2x.png",
                      "4x": "https://chat.eblo.id/chat/static/plus-badge-4x.png"}}
  }
}

Один подписчик: GET /plus/users/{login_or_id}

{"user": {…как в roster…}, "paint": {"id": 42, "v": 3, "spec": {…}} | null}. Не подписчик — 404. Кэш 60 с.

Пейнт: GET /plus/paints/{id}

{"id": 42, "v": 3, "spec": {…}}. Отдаются только пейнты, которые кто-то носит или которые опубликованы; отклонённые модерацией — 404. Кэш 5 мин.

Живые изменения: wss://chat.eblo.id/api/v1/plus/events

После подключения сервер присылает {"op": "hello", "version": "<версия списка>"}, затем на каждое изменение:

{"op": "user", "login": "nick", "user": {…} | null, "paint": {"id": 42, "v": 3, "spec": {…}} | null,
 "version": "<после>", "prev": "<до>"}

Формат пейнта (spec)

Градиент (type: linear | radial)

полезначение
angle0–360, как у CSS linear-gradient(<угол>deg) (у radial не используется)
stops2–16 пар [позиция 0..1, "#rrggbb"]
tiles1–6: сколько раз рисунок повторяется по длине (нет поля — 1)
repeatустаревшее: true без tiles означает 3 повтора
shadowsдо 3 теней [dx, dy, blur, "#rrggbb"]: dx/dy −4…4, blur 0–8
anim{"kind": "none" | "slide" | "spin" | "pulse", "speed": секунд на цикл} (нет поля или speed < 0,5 — 6 с)

Как рисовать, чтобы совпадало с Chatterino+ и сайтом PLUS:

Картинка (type: image)

полезначение
imgадрес webp (может быть анимированным)
fitcover (заполнить, по центру) | tile (по высоте ника, повтор вбок) | stretch (растянуть)
w, hразмеры картинки
anim1 — картинка анимированная
shadowsкак у градиента

Рядом с картинкой лежит лёгкое превью первого кадра — тот же адрес с .p.webp: показывайте его, пока грузится основная картинка. Не загрузилась — рисуйте ник обычным цветом.

Общее

Эффекты смайликов: GET /effects

Справочник модификаторов: кто их пишет, где они стоят, кому доступны и что делают. Кэш 1 ч.

{"effects": [
  {"code": "w!",       "provider": "bttv", "position": "before", "applies_to": "third_party", "case_sensitive": true, "effect": "wide"},
  {"code": "ffzSpin",  "provider": "ffz",  "position": "after",  "applies_to": "any", "requires": "ffz_supporter", "effect": "spin"},
  {"code": "+spin",    "provider": "plus", "position": "before", "applies_to": "third_party", "case_sensitive": false, "requires": "plus_subscriber", "effect": "spin"}
]}
полезначение
codeслово в сообщении
providerbttv | ffz | plus
positionbefore — слово стоит перед смайликом, after — после
applies_tothird_party — только смайлики 7TV/BTTV/FFZ (не Twitch), any — любые
case_sensitiveучитывать ли регистр букв
requiresнет поля — доступно всем; plus_subscriber — автор есть в /plus/roster; ffz_supporter — автор поддержал FFZ (список у FFZ, набор «Subwoofer Emote Effects»)
effectчто сделать со смайликом (ниже)

Значения effect: wide — растянуть вчетверо в ширину; grow_x — вдвое; flip_x, flip_y — отразить по горизонтали / вертикали; rotate_left, rotate_right — повернуть на 90°; no_space — поставить вплотную к предыдущему, без пробела; cursed — обесцветить и затемнить; party — перелив цветов; rainbow — бегущий оттенок; hyper — красный оттенок и мелкая тряска; shake — тряска; spin — вращение; jam — покачивание; bounce — подпрыгивание; slide — бегущая дорожка; arrive — въезжает; leave — уезжает. Несколько модификаторов на одном смайлике складываются; повороты и отражения — нет (действует один).

← Настройка экранного чата