itd-api 0.0.1 → 0.0.3
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 +57 -6
- package/dist/{chunk-QILCVTJI.cjs → chunk-3ODOEKQO.cjs} +354 -115
- package/dist/chunk-3ODOEKQO.cjs.map +1 -0
- package/dist/{chunk-76C65H5J.js → chunk-JIT55WDH.js} +347 -116
- package/dist/chunk-JIT55WDH.js.map +1 -0
- package/dist/{index-RzyK1gKg.d.cts → index-BCuk8jNA.d.cts} +220 -18
- package/dist/{index-RzyK1gKg.d.ts → index-BCuk8jNA.d.ts} +220 -18
- package/dist/index.cjs +94 -62
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/node.cjs +93 -61
- package/dist/node.d.cts +2 -2
- package/dist/node.d.ts +2 -2
- package/dist/node.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-76C65H5J.js.map +0 -1
- package/dist/chunk-QILCVTJI.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ for await (const post of itd.posts.iterate({ tab: FeedTab.Following })) {
|
|
|
37
37
|
import { ItdClient, FileTokenStorage } from 'itd-api/node';
|
|
38
38
|
|
|
39
39
|
const itd = new ItdClient({
|
|
40
|
-
auth: { email, password },
|
|
40
|
+
auth: { email, password, getTurnstileToken }, // вход требует капчи, см. ниже
|
|
41
41
|
storage: new FileTokenStorage('./.itd-session.json'),
|
|
42
42
|
});
|
|
43
43
|
|
|
@@ -55,7 +55,7 @@ await itd.posts.create((p) => p.content('привет').attach('./photo.jpg'));
|
|
|
55
55
|
```ts
|
|
56
56
|
new ItdClient({ auth: '<accessToken>' }); // разовый вызов
|
|
57
57
|
new ItdClient({ auth: { accessToken, refreshToken } }); // восстановить сессию
|
|
58
|
-
new ItdClient({ auth: { email, password } });
|
|
58
|
+
new ItdClient({ auth: { email, password, getTurnstileToken } }); // войти самому
|
|
59
59
|
new ItdClient({ auth: { getToken: () => vault.read() } }); // токен извне
|
|
60
60
|
```
|
|
61
61
|
|
|
@@ -65,6 +65,31 @@ new ItdClient({ auth: { getToken: () => vault.read() } }); // токен из
|
|
|
65
65
|
|
|
66
66
|
Отключить автоматику: `autoRefresh: false`, дальше `await itd.auth.refresh()` вручную.
|
|
67
67
|
|
|
68
|
+
### Капча обязательна при входе
|
|
69
|
+
|
|
70
|
+
`signIn`, `signUp` и `forgotPassword` требуют токен Cloudflare Turnstile. Полностью
|
|
71
|
+
автоматического входа по логину и паролю поэтому не бывает: капчу должен решить кто-то
|
|
72
|
+
снаружи, а библиотека принимает готовый токен.
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
import { TURNSTILE_SITE_KEY } from 'itd-api';
|
|
76
|
+
|
|
77
|
+
// в браузере — виджет Turnstile с этим ключом
|
|
78
|
+
turnstile.render('#captcha', {
|
|
79
|
+
sitekey: TURNSTILE_SITE_KEY,
|
|
80
|
+
callback: (turnstileToken) => itd.auth.signIn({ email, password, turnstileToken }),
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Токен одноразовый и живёт несколько минут. Долгоживущему боту передавайте не строку,
|
|
85
|
+
а источник — он спрашивается заново перед каждой попыткой входа:
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
new ItdClient({
|
|
89
|
+
auth: { email, password, getTurnstileToken: () => captchaSolver.solve() },
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
68
93
|
### Вход с кодом из письма
|
|
69
94
|
|
|
70
95
|
```ts
|
|
@@ -73,7 +98,18 @@ import { createInterface } from 'node:readline/promises';
|
|
|
73
98
|
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
74
99
|
|
|
75
100
|
await itd.auth.signInWithOtp({
|
|
76
|
-
email, password,
|
|
101
|
+
email, password, turnstileToken,
|
|
102
|
+
getOtp: () => rl.question('Код из письма: '),
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Сброс пароля
|
|
107
|
+
|
|
108
|
+
Идёт тем же потоком с кодом: `forgotPassword` возвращает `flowToken`, письмо приносит код.
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
await itd.auth.resetPasswordWithOtp({
|
|
112
|
+
email, turnstileToken, newPassword,
|
|
77
113
|
getOtp: () => rl.question('Код из письма: '),
|
|
78
114
|
});
|
|
79
115
|
```
|
|
@@ -87,9 +123,24 @@ await itd.auth.signInWithOtp({
|
|
|
87
123
|
| `FileTokenStorage` | `itd-api/node` | Node, Bun, Deno |
|
|
88
124
|
| `createTokenStorage({ get, set, clear })` | `itd-api` | своё: Redis, БД, AsyncStorage |
|
|
89
125
|
|
|
90
|
-
Refresh-токен приходит в cookie
|
|
91
|
-
собственный cookie-jar и сохраняет его вместе с сессией. В браузере
|
|
92
|
-
`credentials: 'include'`, в React Native cookie ведёт нативный слой.
|
|
126
|
+
Refresh-токен приходит в cookie `refresh_token`, а `fetch` вне браузера их не хранит —
|
|
127
|
+
библиотека ведёт собственный cookie-jar и сохраняет его вместе с сессией. В браузере
|
|
128
|
+
используется `credentials: 'include'`, в React Native cookie ведёт нативный слой.
|
|
129
|
+
|
|
130
|
+
Токен можно передать и строкой (`auth: { accessToken, refreshToken }`) — вне браузера
|
|
131
|
+
библиотека сама подставит его нужной cookie. В браузере так не выйдет: настоящая cookie
|
|
132
|
+
помечена `HttpOnly`, и из JS её не выставить.
|
|
133
|
+
|
|
134
|
+
Сервер выдаёт при каждом обновлении **новый** refresh-токен взамен прежнего, поэтому
|
|
135
|
+
сохранять сессию нужно после обновления, а не один раз при входе:
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
itd.on('tokens', async () => saveSomewhere(await itd.getSession()));
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Вместе с сессией хранится `deviceId` — идентификатор устройства из заголовка `X-Device-Id`.
|
|
142
|
+
Сервер различает по нему записи в списке сессий, поэтому при постоянном хранилище он
|
|
143
|
+
переживает перезапуск, а бот не плодит по новой сессии на каждый старт.
|
|
93
144
|
|
|
94
145
|
---
|
|
95
146
|
|