API обслуживает две формы со страницы-приглашения https://claudia.lidz-agency.ru/andrew3/:
feed_wall — «Оставить фид на стене» (тёплые сообщения / поздравления)bug_report — «Проблемы с версией Андрея» (баг-репорты в шутку)Базовый URL: https://claudia.lidz-agency.ru/andrew3/api
Транспорт: JSON по HTTPS · кодировка UTF-8
CORS: только same-origin (api живёт на том же домене, что и сайт-приглашение).
?token=…) — расширенный вид.Админ-токен передаётся параметром строки запроса: ?token=<TOKEN>. Запросить токен — у Андрея.
Получить список всех сообщений в соответствующем хранилище. Сортировка — в порядке поступления (старые → новые).
| Параметр | Тип | Описание |
|---|---|---|
token | string, опц. | Админ-токен. При его наличии в ответ включаются служебные поля (ip, ua). |
200 OK{
"ok": true,
"items": [
{ "id": 1, "msg": "С днём, друг! 🎂", "ts": 1781123456 },
{ "id": 2, "msg": "Версия огонь, обнови жизнь!", "ts": 1781123512 }
],
"count": 2
}
С админ-токеном items содержит также поля ip, ua.
curl https://claudia.lidz-agency.ru/andrew3/api/feed curl "https://claudia.lidz-agency.ru/andrew3/api/feed?token=…"
Добавить новое сообщение. Используется самим сайтом-приглашением при отправке формы. Защита от спама — на стороне API.
| Поле | Тип | Описание |
|---|---|---|
msg | string, обяз. | Текст сообщения, до 240 символов (длиннее — обрезается). |
website | string, опц. | Honeypot. Должен оставаться пустым. Если заполнен — запрос тихо отбрасывается (бот). |
200 OK{ "ok": true, "id": 7 }
| Код | Случай | Тело |
|---|---|---|
| 400 | Невалидный JSON | {"ok":false,"err":"bad json"} |
| 400 | Пустое сообщение | {"ok":false,"err":"empty"} |
| 413 | Слишком большое тело (> 2KB) | {"ok":false,"err":"too big"} |
| 429 | Превышен rate-limit | {"ok":false,"err":"slow down"} |
curl -X POST https://claudia.lidz-agency.ru/andrew3/api/feed \
-H "Content-Type: application/json" \
-d '{"msg":"Огонь!"}'
Полная очистка хранилища (необратимо). Требует админ-токен.
| Параметр | Тип | Описание |
|---|---|---|
token | string, обяз. | Админ-токен. |
| Код | Случай | Тело |
|---|---|---|
| 200 | Очищено | {"ok":true,"cleared":"feed.json"} |
| 403 | Нет токена или неверный | {"ok":false,"err":"forbidden"} |
curl -X DELETE "https://claudia.lidz-agency.ru/andrew3/api/feed?token=…"
website — если бот его заполнит, сервер «принимает» сообщение с id=0, но в хранилище ничего не пишется.POST) с одного IP в 60-секундное окно (рассчитано на общий Wi-Fi с NAT — все гости с одного внешнего IP). Превышение — 429.msg (мягкое — длиннее обрезается). Тело запроса жёстко ограничено 2KB.\n, \r, \t) убираются.Готового websocket нет. Простая стратегия для проектора на празднике:
GET /feed (или /bug) раз в 3–5 сек.id с уже отображённым — новые анимировать «снизу вверх».~250 байт + ~50 байт на сообщение.Пример клиент-сайд:
let seenMax = 0;
async function tick() {
const r = await fetch('https://claudia.lidz-agency.ru/andrew3/api/feed', { cache: 'no-store' });
const { items = [] } = await r.json();
for (const it of items) {
if (it.id > seenMax) {
seenMax = it.id;
renderNewMessage(it); // подставь свой рендер
}
}
}
setInterval(tick, 3000);
tick();
| Поле | Тип | Описание |
|---|---|---|
id | int | Автоинкремент, уникален в рамках одного хранилища (feed / bug нумеруются отдельно). |
msg | string | Текст сообщения, до 240 символов. |
ts | int (unix-time) | Момент приёма сервером, секунды UTC. |
ip | string | IP отправителя. Возвращается только с админ-токеном. |
ua | string | User-Agent отправителя (до 200 символов). Только с админ-токеном. |
feed.json, bugs.json). Запись атомарная через временный файл.Андрей · @AnDnA · по техническим вопросам / для запроса токена.