itd-api 0.0.7 → 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,6 +511,35 @@ 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
+
517
+ ### Прокси (HTTP/SOCKS5)
518
+
519
+ Чтобы направить запросы клиента через прокси, возьмите `fetch` из пакета
520
+ [`@itd-api/proxy`](./proxy/README.md):
521
+
522
+ ```sh
523
+ npm i @itd-api/proxy
524
+ ```
525
+
526
+ ```ts
527
+ import { ItdClient } from 'itd-api';
528
+ import { proxyFetch } from '@itd-api/proxy';
529
+
530
+ const fetch = proxyFetch('socks5://127.0.0.1:1080');
531
+ // http://…, https://…, socks5://… — можно с user:pass@
532
+ const itd = new ItdClient({ fetch });
533
+
534
+ // …работа…
535
+
536
+ await itd.close();
537
+ await fetch.close(); // закрывает пул соединений
538
+ ```
539
+
540
+ Через тот же `fetch` пойдут авторизация, cookie, очередь, повторы и поток уведомлений.
541
+ Только для Node/Bun/Deno. Подробности — в [README пакета](./proxy/README.md).
542
+
459
543
  ---
460
544
 
461
545
  ## Плагины
@@ -465,19 +549,19 @@ Deno и React Native ограничение не действует.
465
549
 
466
550
  ```ts
467
551
  import { ItdClient } from 'itd-api';
468
- import { crypt } from 'itd-api-crypto';
552
+ import { crypt } from '@itd-api/crypto';
469
553
 
470
554
  const itd = new ItdClient({ auth: token });
471
555
  itd.use(crypt());
472
556
  ```
473
557
 
474
- ### `itd-api-crypto` — скрытые сообщения
558
+ ### `@itd-api/crypto` — скрытые сообщения
475
559
 
476
- [Отдельный пакет](./crypto): прячет текст в невидимых символах внутри обычного поста.
560
+ [Отдельный пакет](./crypto/README.md): прячет текст в невидимых символах внутри обычного поста.
477
561
  Читатель видит обложку, а тот, у кого подключён плагин, получает спрятанное отдельным полем.
478
562
 
479
563
  ```sh
480
- npm i itd-api-crypto
564
+ npm i @itd-api/crypto
481
565
  ```
482
566
 
483
567
  ```ts
@@ -497,7 +581,7 @@ post.secret?.text; // 'секретный текст'
497
581
 
498
582
  Шифра два: `invisible` — невидимые символы с обложкой, `beecrypt` — видимый текст из букв
499
583
  `жъЖЪ`. Подробности, ограничения и то, как подключить свой шифр, — в
500
- [README пакета](./crypto).
584
+ [README пакета](./crypto/README.md).
501
585
 
502
586
  ### Свой плагин
503
587
 
@@ -556,7 +640,7 @@ declare module 'itd-api' {
556
640
  | `itd.files` | загрузка медиа |
557
641
  | `itd.hashtags` · `itd.search` | хэштеги, трендовые, глобальный поиск |
558
642
  | `itd.reports` · `itd.verification` | жалобы, заявка на верификацию |
559
- | `itd.subscription` · `itd.platform` | подписка, способы оплаты, анонсы |
643
+ | `itd.subscription` · `itd.platform` | подписка, способы оплаты, анонсы, статус сервисов |
560
644
  | `itd.realtime()` | поток уведомлений |
561
645
  | `itd.use()` | плагины: обёртки вокруг запроса и ответа |
562
646
  | `itd.request()` | произвольный запрос, если метода ещё нет |