itd-api 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -43,7 +43,7 @@ const itd = new ItdClient({ storage: new FileTokenStorage('./.itd-session.json')
43
43
  await itd.posts.create((p) => p.content('привет').attach('./photo.jpg'));
44
44
  ```
45
45
 
46
- Готовые примеры — в папке [`examples/`](./examples).
46
+ Готовые примеры — в папке [`examples/`](./examples/README.md).
47
47
 
48
48
  ---
49
49
 
@@ -133,17 +133,17 @@ new ItdClient({
133
133
  });
134
134
  ```
135
135
 
136
- В Node таким источником может быть [`itd-api-turnstile`](./turnstile) — отдельный пакет,
136
+ В Node таким источником может быть [`@itd-api/turnstile`](./turnstile/README.md) — отдельный пакет,
137
137
  который поднимает браузер и приносит токен. Отдельный он намеренно: тянет за собой Playwright
138
138
  и требует графической оболочки, а нужен далеко не всем — с сохранённой сессией до входа
139
139
  по паролю дело обычно вообще не доходит.
140
140
 
141
141
  ```sh
142
- npm i itd-api-turnstile playwright
142
+ npm i @itd-api/turnstile playwright
143
143
  ```
144
144
 
145
145
  ```ts
146
- import { createTurnstileSolver } from 'itd-api-turnstile';
146
+ import { createTurnstileSolver } from '@itd-api/turnstile';
147
147
 
148
148
  new ItdClient({
149
149
  storage: new FileTokenStorage('./.itd-session.json'),
@@ -358,6 +358,60 @@ await stream.connect();
358
358
 
359
359
  ---
360
360
 
361
+ ## Статус сервисов
362
+
363
+ `itd.platform.status()` отдаёт состояние платформы и историю доступности за 90 суток.
364
+ Авторизация не нужна, ответ кэшируется сервером на минуту.
365
+
366
+ ```ts
367
+ import { statusDays } from 'itd-api';
368
+
369
+ const status = await itd.platform.status();
370
+
371
+ status.overall_status; // 'operational' | 'degraded' | 'downtime'
372
+ status.services.map((s) => s.current_status);
373
+
374
+ const auth = status.services.find((s) => s.id === 'auth');
375
+ auth?.uptime_90d; // 97.92
376
+ auth?.last_checked; // '2026-07-23T23:14:25Z'
377
+
378
+ const days = auth ? statusDays(auth) : []; // 90 элементов, [0] — сегодня
379
+ days[0]?.uptime; // 100
380
+ days[0]?.lines; // [{ t: 'down', text: 'недоступен 6 мин (12:00–12:06)' }]
381
+ ```
382
+
383
+ Поле `days` приходит объектом с числовыми ключами, и сутки без данных сервер пропускает —
384
+ `statusDays()` разворачивает его в массив, где пропуски равны `null`. Строки в `lines`
385
+ готовы к показу как есть: длительность и границы интервала отдельными полями не приходят,
386
+ время в них московское, тогда как `date_key` суток нарезан по UTC.
387
+
388
+ ### Сервисы платформы
389
+
390
+ Статус живёт на отдельном домене — `статус.итд.com`. Такие домены описываются как сервисы:
391
+ у каждого своё имя, хост, заголовки и признак публичности. Запрос выбирает сервис
392
+ полем `service`.
393
+
394
+ ```ts
395
+ const itd = new ItdClient({
396
+ services: {
397
+ pb: {
398
+ baseUrl: 'https://pbapi.xn--d1ah4a.com',
399
+ headers: { Referer: 'https://pixel.xn--d1ah4a.com/' },
400
+ },
401
+ },
402
+ });
403
+
404
+ await itd.request({ method: 'GET', service: 'pb', path: '/api/pixel-info', query: { x: 1, y: 2 } });
405
+ ```
406
+
407
+ То же самое после создания клиента — `itd.defineService({ name, baseUrl, headers, auth })`;
408
+ базовый URL сервиса отдаёт `itd.serviceBaseUrl(name)`.
409
+
410
+ У каждого сервиса своя очередь `rateLimit`: лимит частоты сервер считает по хосту, поэтому
411
+ `429` от статуса не тормозит основной API и наоборот.
412
+
413
+ ---
414
+
361
415
  ## Ошибки
362
416
 
363
417
  Обе формы ошибок API сведены к одному классу:
@@ -397,6 +451,7 @@ const itd = new ItdClient({
397
451
  // Заголовки латиницей: кириллица в них запрещена самим HTTP.
398
452
  userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36', // по умолчанию itd-api/<версия>; false — не слать
399
453
  deviceId: '3f2a…-uuid', // по умолчанию заводится сам и живёт в сессии
454
+ services: { pb: 'https://pbapi.xn--d1ah4a.com' }, // домены сервисов платформы, см. ниже
400
455
  logger: true, // токены и пароли в логах маскируются
401
456
  hooks: {
402
457
  onRequest: (ctx) => console.log(ctx.method, ctx.path),
@@ -456,25 +511,34 @@ rateLimit: { retryDelays: [1000, 5000, 30_000, 60_000, 90_000] } // по умо
456
511
  Поэтому в браузерном приложении укажите в `baseUrl` адрес своего прокси. В Node, Bun,
457
512
  Deno и React Native ограничение не действует.
458
513
 
514
+ Исключение — `itd.platform.status()`: страница статуса отдаёт
515
+ `Access-Control-Allow-Origin: *`, и этот метод работает из браузера напрямую.
516
+
459
517
  ### Прокси (HTTP/SOCKS5)
460
518
 
461
519
  Чтобы направить запросы клиента через прокси, возьмите `fetch` из пакета
462
- [`itd-api-proxy`](./proxy):
520
+ [`@itd-api/proxy`](./proxy/README.md):
463
521
 
464
522
  ```sh
465
- npm i itd-api-proxy
523
+ npm i @itd-api/proxy
466
524
  ```
467
525
 
468
526
  ```ts
469
527
  import { ItdClient } from 'itd-api';
470
- import { proxyFetch } from 'itd-api-proxy';
528
+ import { proxyFetch } from '@itd-api/proxy';
471
529
 
472
- const itd = new ItdClient({ fetch: proxyFetch('socks5://127.0.0.1:1080') });
530
+ const fetch = proxyFetch('socks5://127.0.0.1:1080');
473
531
  // http://…, https://…, socks5://… — можно с user:pass@
532
+ const itd = new ItdClient({ fetch });
533
+
534
+ // …работа…
535
+
536
+ await itd.close();
537
+ await fetch.close(); // закрывает пул соединений
474
538
  ```
475
539
 
476
540
  Через тот же `fetch` пойдут авторизация, cookie, очередь, повторы и поток уведомлений.
477
- Только для Node/Bun/Deno. Подробности — в [README пакета](./proxy).
541
+ Только для Node/Bun/Deno. Подробности — в [README пакета](./proxy/README.md).
478
542
 
479
543
  ---
480
544
 
@@ -485,19 +549,19 @@ const itd = new ItdClient({ fetch: proxyFetch('socks5://127.0.0.1:1080') });
485
549
 
486
550
  ```ts
487
551
  import { ItdClient } from 'itd-api';
488
- import { crypt } from 'itd-api-crypto';
552
+ import { crypt } from '@itd-api/crypto';
489
553
 
490
554
  const itd = new ItdClient({ auth: token });
491
555
  itd.use(crypt());
492
556
  ```
493
557
 
494
- ### `itd-api-crypto` — скрытые сообщения
558
+ ### `@itd-api/crypto` — скрытые сообщения
495
559
 
496
- [Отдельный пакет](./crypto): прячет текст в невидимых символах внутри обычного поста.
560
+ [Отдельный пакет](./crypto/README.md): прячет текст в невидимых символах внутри обычного поста.
497
561
  Читатель видит обложку, а тот, у кого подключён плагин, получает спрятанное отдельным полем.
498
562
 
499
563
  ```sh
500
- npm i itd-api-crypto
564
+ npm i @itd-api/crypto
501
565
  ```
502
566
 
503
567
  ```ts
@@ -517,7 +581,7 @@ post.secret?.text; // 'секретный текст'
517
581
 
518
582
  Шифра два: `invisible` — невидимые символы с обложкой, `beecrypt` — видимый текст из букв
519
583
  `жъЖЪ`. Подробности, ограничения и то, как подключить свой шифр, — в
520
- [README пакета](./crypto).
584
+ [README пакета](./crypto/README.md).
521
585
 
522
586
  ### Свой плагин
523
587
 
@@ -576,7 +640,7 @@ declare module 'itd-api' {
576
640
  | `itd.files` | загрузка медиа |
577
641
  | `itd.hashtags` · `itd.search` | хэштеги, трендовые, глобальный поиск |
578
642
  | `itd.reports` · `itd.verification` | жалобы, заявка на верификацию |
579
- | `itd.subscription` · `itd.platform` | подписка, способы оплаты, анонсы |
643
+ | `itd.subscription` · `itd.platform` | подписка, способы оплаты, анонсы, статус сервисов |
580
644
  | `itd.realtime()` | поток уведомлений |
581
645
  | `itd.use()` | плагины: обёртки вокруг запроса и ответа |
582
646
  | `itd.request()` | произвольный запрос, если метода ещё нет |