itd-sdk-js 1.0.0
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/.cookies.example +1 -0
- package/.env.example +45 -0
- package/API_REFERENCE.md +237 -0
- package/README.md +85 -0
- package/examples/README.md +65 -0
- package/examples/auto-refresh.js +63 -0
- package/examples/basic-usage.js +54 -0
- package/examples/quick-start.js +326 -0
- package/examples/user-friendly.js +79 -0
- package/package.json +57 -0
- package/src/auth.js +126 -0
- package/src/client.js +920 -0
- package/src/comments.js +256 -0
- package/src/files.js +59 -0
- package/src/hashtags.js +101 -0
- package/src/notifications.js +215 -0
- package/src/posts.js +480 -0
- package/src/reports.js +97 -0
- package/src/search.js +86 -0
- package/src/token-storage.js +66 -0
- package/src/users.js +416 -0
package/.cookies.example
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
refresh_token=YOUR_REFRESH_TOKEN_HERE; __ddg1_=...; is_auth=1; __ddgid_=...; __ddgmark_=...; __ddg5_=...; __ddg2_=...; ddg_last_challenge=...; __ddg9_=...; __ddg8_=...; __ddg10_=...
|
package/.env.example
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# ============================================
|
|
2
|
+
# ITD SDK - Конфигурация
|
|
3
|
+
# ============================================
|
|
4
|
+
# Скопируйте этот файл в .env и заполните своими данными
|
|
5
|
+
# cp .env.example .env
|
|
6
|
+
|
|
7
|
+
# ============================================
|
|
8
|
+
# Access Token (JWT) - ОБЯЗАТЕЛЬНО
|
|
9
|
+
# ============================================
|
|
10
|
+
# JWT токен для авторизации запросов
|
|
11
|
+
# Получите из браузера:
|
|
12
|
+
# 1. Откройте итд.com в браузере и войдите
|
|
13
|
+
# 2. Откройте DevTools (F12) → Network
|
|
14
|
+
# 3. Найдите запрос POST /api/v1/auth/refresh
|
|
15
|
+
# 4. Скопируйте accessToken из ответа
|
|
16
|
+
# 5. Вставьте сюда
|
|
17
|
+
#
|
|
18
|
+
# ВАЖНО: Токен автоматически обновляется при использовании refresh_token из .cookies
|
|
19
|
+
ITD_ACCESS_TOKEN=your_access_token_here
|
|
20
|
+
|
|
21
|
+
# ============================================
|
|
22
|
+
# Базовый URL
|
|
23
|
+
# ============================================
|
|
24
|
+
# URL сайта итд.com (IDN домен)
|
|
25
|
+
# Обычно не нужно менять
|
|
26
|
+
ITD_BASE_URL=https://xn--d1ah4a.com
|
|
27
|
+
|
|
28
|
+
# ============================================
|
|
29
|
+
# User-Agent
|
|
30
|
+
# ============================================
|
|
31
|
+
# User-Agent для HTTP запросов
|
|
32
|
+
# Имитирует реальный браузер
|
|
33
|
+
# Обычно не нужно менять
|
|
34
|
+
ITD_USER_AGENT=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
|
|
35
|
+
|
|
36
|
+
# ============================================
|
|
37
|
+
# Прокси (опционально)
|
|
38
|
+
# ============================================
|
|
39
|
+
# Если используете прокси (например, V2RayN, Clash и т.д.)
|
|
40
|
+
# Раскомментируйте и укажите адрес прокси
|
|
41
|
+
#
|
|
42
|
+
# Формат: http://127.0.0.1:10808
|
|
43
|
+
#
|
|
44
|
+
# ВАЖНО: Должен быть HTTP CONNECT proxy, не SOCKS
|
|
45
|
+
# ITD_PROXY=http://127.0.0.1:10808
|
package/API_REFERENCE.md
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# API Reference — итд.com (Node.js SDK)
|
|
2
|
+
|
|
3
|
+
Техническое руководство по методам и настройке библиотеки для работы с API сайта `итд.com`.
|
|
4
|
+
|
|
5
|
+
## Настройка проекта
|
|
6
|
+
|
|
7
|
+
### 1. Переменные окружения (.env)
|
|
8
|
+
|
|
9
|
+
Создайте файл `.env` в корне проекта и укажите следующие параметры:
|
|
10
|
+
|
|
11
|
+
- `ITD_ACCESS_TOKEN` — ваш JWT токен.
|
|
12
|
+
- `ITD_BASE_URL` — `https://xn--d1ah4a.com`.
|
|
13
|
+
- `ITD_USER_AGENT` — строка User-Agent из браузера.
|
|
14
|
+
|
|
15
|
+
### 2. Файл .cookies
|
|
16
|
+
|
|
17
|
+
Для работы автоматического обновления токена создайте файл `.cookies` в корне проекта. Скопируйте содержимое заголовка `Cookie` из любого сетевого запроса к сайту в браузере и вставьте в этот файл.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Авторизация и сессии
|
|
22
|
+
|
|
23
|
+
### Инициализация клиента
|
|
24
|
+
|
|
25
|
+
JavaScript
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
import { ITDClient } from './src/client.js';
|
|
29
|
+
import dotenv from 'dotenv';
|
|
30
|
+
|
|
31
|
+
dotenv.config();
|
|
32
|
+
|
|
33
|
+
const client = new ITDClient();
|
|
34
|
+
client.setAccessToken(process.env.ITD_ACCESS_TOKEN);
|
|
35
|
+
client.auth.isAuthenticated = true;
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Автоматическое обновление (Refresh Token)
|
|
39
|
+
|
|
40
|
+
При получении ошибки `401 Unauthorized` клиент автоматически обращается к эндпоинту `/api/v1/auth/refresh`, используя данные из `.cookies`. В случае успеха новый токен сохраняется в `.env`, обновляются куки, и исходный запрос повторяется.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Методы API: Посты
|
|
45
|
+
|
|
46
|
+
### createPost(text, imagePath?)
|
|
47
|
+
|
|
48
|
+
Создает новый пост. При указании `imagePath` файл предварительно загружается через `/api/files/upload`, после чего ID файла прикрепляется к посту.
|
|
49
|
+
|
|
50
|
+
- **Параметры**: `text` (string), `imagePath` (string, опционально).
|
|
51
|
+
|
|
52
|
+
### getPost(postId)
|
|
53
|
+
|
|
54
|
+
Запрашивает данные конкретного поста.
|
|
55
|
+
|
|
56
|
+
- **Возвращает**: Объект с контентом, автором и вложенными комментариями.
|
|
57
|
+
|
|
58
|
+
### getPosts(username, limit, sort, cursor, tab, type, filter)
|
|
59
|
+
|
|
60
|
+
Универсальный метод получения списков постов.
|
|
61
|
+
|
|
62
|
+
- **Параметры**:
|
|
63
|
+
- `username` — имя пользователя (null для общей ленты).
|
|
64
|
+
- `limit` — количество записей (default: 20).
|
|
65
|
+
- `sort` — `new`, `old`, `popular`, `trending`, `recent`.
|
|
66
|
+
- `tab` — `popular`, `following` или null.
|
|
67
|
+
- `cursor` — идентификатор для пагинации.
|
|
68
|
+
|
|
69
|
+
### Прочие методы постов
|
|
70
|
+
|
|
71
|
+
- `getFeedPopular(limit, cursor)` — лента популярных постов. Возвращает `{ posts: [], pagination: {} }`.
|
|
72
|
+
- `getFeedFollowing(limit, cursor)` — лента подписок. Требует авторизацию. Возвращает `{ posts: [], pagination: {} }`.
|
|
73
|
+
- `getPostsList(username?, limit?)` — упрощенный метод, возвращает только массив постов (без pagination).
|
|
74
|
+
- `editPost(postId, newContent)` — редактирование текста. Возвращает обновленный объект поста.
|
|
75
|
+
- `deletePost(postId)` — удаление поста. Возвращает `boolean`.
|
|
76
|
+
- `pinPost(postId)` — закрепление записи. Возвращает `boolean`.
|
|
77
|
+
- `repost(postId, comment?)` — репост (нельзя репостнуть себя). Возвращает объект репоста.
|
|
78
|
+
- `likePost(postId)` **/** `unlikePost(postId)` — управление лайками. Возвращают `{ liked: boolean, likesCount: number }`.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Методы API: Комментарии
|
|
83
|
+
|
|
84
|
+
### getComments(postId, limit, sort)
|
|
85
|
+
|
|
86
|
+
Получает дерево комментариев к посту.
|
|
87
|
+
|
|
88
|
+
- **Параметры**: `postId`, `limit`, `sort` (`popular`, `new`, `old`).
|
|
89
|
+
|
|
90
|
+
### addComment(postId, text, replyToCommentId?)
|
|
91
|
+
|
|
92
|
+
Добавляет новый комментарий или ответ на существующий.
|
|
93
|
+
|
|
94
|
+
### Управление комментариями
|
|
95
|
+
|
|
96
|
+
- `likeComment(commentId)` **/** `unlikeComment(commentId)` — лайки на комментарии.
|
|
97
|
+
- `deleteComment(commentId)` — удаление комментария.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Методы API: Профили и подписки
|
|
102
|
+
|
|
103
|
+
- `getMyProfile()` — данные текущего аккаунта (требует auth).
|
|
104
|
+
- `getUserProfile(username)` — публичный профиль любого пользователя.
|
|
105
|
+
- `updateProfile(bio, displayName?)` — изменение описания и имени.
|
|
106
|
+
- `getFollowers(username, page, limit)` — список подписчиков.
|
|
107
|
+
- `getFollowing(username, page, limit)` — список подписок.
|
|
108
|
+
- `followUser(username)` **/** `unfollowUser(username)` — подписка/отписка.
|
|
109
|
+
- `getUserClan(username)` — получение эмодзи-аватара пользователя.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Методы API: Уведомления и поиск
|
|
114
|
+
|
|
115
|
+
### getNotifications(limit, cursor, type?)
|
|
116
|
+
|
|
117
|
+
Список уведомлений с фильтрацией по типу (`reply`, `like`, `wall_post`, `follow`, `comment`).
|
|
118
|
+
|
|
119
|
+
### Прочие методы уведомлений
|
|
120
|
+
|
|
121
|
+
- `getNotificationsByType(type, limit, cursor)` — получение уведомлений конкретного типа.
|
|
122
|
+
- `markNotificationAsRead(notificationId)` — пометка прочитанным. Возвращает `{ success: true }`.
|
|
123
|
+
- `markAllNotificationsAsRead()` — пометка всех уведомлений (экспериментально).
|
|
124
|
+
- `getNotificationCount()` — счетчик непрочитанных сообщений. Возвращает `number`.
|
|
125
|
+
|
|
126
|
+
### Поиск и рекомендации
|
|
127
|
+
|
|
128
|
+
- `search(query, userLimit?, hashtagLimit?)` — универсальный поиск пользователей и хэштегов. Возвращает `{ users: [], hashtags: [] }`.
|
|
129
|
+
- `searchUsers(query, limit?)` — поиск только пользователей.
|
|
130
|
+
- `searchHashtags(query, limit?)` — поиск только хэштегов.
|
|
131
|
+
- `getTopClans()` — рейтинг кланов по количеству участников. Возвращает `{ clans: [{ avatar, memberCount }] }`.
|
|
132
|
+
- `getWhoToFollow()` — рекомендованные пользователи.
|
|
133
|
+
- `getTrendingHashtags(limit)` — список популярных тегов.
|
|
134
|
+
- `getPostsByHashtag(tagName, limit, cursor)` — поиск постов по тегу. Возвращает `{ posts: [], hashtag: {}, pagination: {} }`.
|
|
135
|
+
|
|
136
|
+
### Файлы и репорты
|
|
137
|
+
|
|
138
|
+
- `uploadFile(filePath)` — загрузка файла через `/api/files/upload`. Возвращает `{ id, url, filename, mimeType, size }`. Используется автоматически при создании поста с изображением.
|
|
139
|
+
- `report(targetType, targetId, reason?, description?)` — отправка репорта. `targetType`: `"post"`, `"comment"`, `"user"`. Возвращает `{ id, createdAt }`.
|
|
140
|
+
- `reportPost(postId, reason?, description?)` — репорт поста.
|
|
141
|
+
- `reportComment(commentId, reason?, description?)` — репорт комментария.
|
|
142
|
+
- `reportUser(userId, reason?, description?)` — репорт пользователя.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Вспомогательные методы (Helpers)
|
|
147
|
+
|
|
148
|
+
Методы для быстрого доступа к статистике без парсинга полных объектов:
|
|
149
|
+
|
|
150
|
+
### Посты
|
|
151
|
+
|
|
152
|
+
- `getTrendingPosts(limit, cursor)` — трендовые посты. Возвращает `{ posts: [], pagination: {} }`.
|
|
153
|
+
- `getRecentPosts(limit, cursor)` — недавние посты. Возвращает `{ posts: [], pagination: {} }`.
|
|
154
|
+
- `getMyPosts(limit, sort, cursor)` — свои посты. Требует авторизацию.
|
|
155
|
+
- `getUserLatestPost(username)` — последний пост пользователя. Возвращает объект поста или `null`.
|
|
156
|
+
- `getPostStats(postId)` — возвращает `{ likes: number, views: number, comments: number, reposts: number }` или `null`.
|
|
157
|
+
- `getPostLikesCount(postId)`, `getPostViewsCount(postId)`, `getPostCommentsCount(postId)` — получение отдельных счетчиков. Возвращают `number`.
|
|
158
|
+
|
|
159
|
+
### Пользователи
|
|
160
|
+
|
|
161
|
+
- `getMyClan()` — свой клан (эмодзи). Возвращает `string` или `null`.
|
|
162
|
+
- `getMyFollowersCount()`, `getMyFollowingCount()` — количество подписчиков/подписок. Возвращают `number`.
|
|
163
|
+
- `isFollowing(username)` — проверка наличия подписки на пользователя. Возвращает `boolean`.
|
|
164
|
+
|
|
165
|
+
### Комментарии
|
|
166
|
+
|
|
167
|
+
- `getTopComment(postId)` — получение самого популярного комментария поста. Возвращает объект комментария или `null`.
|
|
168
|
+
- `hasComments(postId)` — проверка наличия комментариев. Возвращает `boolean`.
|
|
169
|
+
|
|
170
|
+
### Уведомления
|
|
171
|
+
|
|
172
|
+
- `hasUnreadNotifications()` — проверка наличия непрочитанных уведомлений. Возвращает `boolean`.
|
|
173
|
+
- `getUnreadNotifications(limit, cursor)` — только непрочитанные уведомления. Возвращает `{ notifications: [], pagination: {} }`.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Структура данных
|
|
178
|
+
|
|
179
|
+
### Пагинация
|
|
180
|
+
|
|
181
|
+
Методы, возвращающие списки, используют курсорную пагинацию:
|
|
182
|
+
|
|
183
|
+
```javascript
|
|
184
|
+
const result = await client.getPosts('username', 20, 'new');
|
|
185
|
+
// result = { posts: [...], pagination: { limit: 20, nextCursor: "...", hasMore: true } }
|
|
186
|
+
|
|
187
|
+
// Следующая страница
|
|
188
|
+
if (result.pagination.hasMore) {
|
|
189
|
+
const nextPage = await client.getPosts('username', 20, 'new', result.pagination.nextCursor);
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Структура поста
|
|
194
|
+
|
|
195
|
+
```javascript
|
|
196
|
+
{
|
|
197
|
+
id: string,
|
|
198
|
+
content: string,
|
|
199
|
+
author: { id, username, displayName, avatar, verified },
|
|
200
|
+
attachments: [{ id, type, url, thumbnailUrl, width, height }],
|
|
201
|
+
likesCount: number,
|
|
202
|
+
commentsCount: number,
|
|
203
|
+
repostsCount: number,
|
|
204
|
+
viewsCount: number,
|
|
205
|
+
isLiked: boolean,
|
|
206
|
+
isReposted: boolean,
|
|
207
|
+
isOwner: boolean,
|
|
208
|
+
createdAt: string,
|
|
209
|
+
updatedAt?: string
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Структура комментария
|
|
214
|
+
|
|
215
|
+
```javascript
|
|
216
|
+
{
|
|
217
|
+
id: string,
|
|
218
|
+
content: string,
|
|
219
|
+
author: { id, username, displayName, avatar, verified },
|
|
220
|
+
likesCount: number,
|
|
221
|
+
repliesCount: number,
|
|
222
|
+
isLiked: boolean,
|
|
223
|
+
createdAt: string,
|
|
224
|
+
replies: [...], // Вложенные ответы
|
|
225
|
+
replyTo?: { id, username, displayName }
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Обработка ошибок
|
|
230
|
+
|
|
231
|
+
- **401 Unauthorized**: Ошибка авторизации. SDK инициирует автоматический рефреш токена через `/api/v1/auth/refresh`. Если рефреш не удался, проверьте `.cookies` файл.
|
|
232
|
+
- **429 Too Many Requests**: Превышен лимит запросов. Необходимо проверять заголовок `Retry-After` и делать паузу.
|
|
233
|
+
- **SESSION_REVOKED**: Сессия недействительна. Требуется ручное обновление `.cookies` из браузера.
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
**Последнее обновление документации**: 2026-01-27.
|
package/README.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# ITD-SDK-js
|
|
2
|
+
|
|
3
|
+
Неофициальная библиотека на Node.js для работы с API сайта [итд.com](http://итд.com). Упрощает написание ботов и скриптов: берет на себя авторизацию, поддержку сессий и предоставляет готовые методы для основных действий.
|
|
4
|
+
|
|
5
|
+
## Главное
|
|
6
|
+
|
|
7
|
+
- **Автоматический Refresh Token**: вам не нужно вручную обновлять `accessToken` в коде. SDK сам подхватит новый, если старый протух, используя данные из `.cookies`.
|
|
8
|
+
- **34 готовых метода**: от получения статистики постов до проверки подписок и работы с кланами.
|
|
9
|
+
- **Минимум зависимостей**: работает на `axios` и `dotenv`.
|
|
10
|
+
|
|
11
|
+
## Установка
|
|
12
|
+
|
|
13
|
+
Bash
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
npm install
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Настройка
|
|
21
|
+
|
|
22
|
+
1. Создайте `.env` на основе `.env.example`.
|
|
23
|
+
2. Вставьте свой `ITD_ACCESS_TOKEN` (его можно вытащить из Network в DevTools).
|
|
24
|
+
3. Для работы авто-обновления сессии создайте файл `.cookies` и вставьте туда строку `Cookie` из любого запроса к сайту в браузере.
|
|
25
|
+
|
|
26
|
+
Подробный гайд по настройке лежит в [API_REFERENCE.md](API_REFERENCE.md).
|
|
27
|
+
|
|
28
|
+
## Примеры
|
|
29
|
+
|
|
30
|
+
### Базовые запросы
|
|
31
|
+
|
|
32
|
+
JavaScript
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
import { ITDClient } from './src/client.js';
|
|
36
|
+
import dotenv from 'dotenv';
|
|
37
|
+
dotenv.config();
|
|
38
|
+
|
|
39
|
+
const client = new ITDClient();
|
|
40
|
+
client.setAccessToken(process.env.ITD_ACCESS_TOKEN);
|
|
41
|
+
client.auth.isAuthenticated = true;
|
|
42
|
+
|
|
43
|
+
// Получаем профиль и тренды
|
|
44
|
+
const myProfile = await client.getMyProfile();
|
|
45
|
+
const trending = await client.getTrendingPosts(10);
|
|
46
|
+
|
|
47
|
+
console.log(`Авторизован как: ${myProfile.username}`);
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Статистика и уведомления
|
|
52
|
+
|
|
53
|
+
JavaScript
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
// Простая проверка непрочитанных
|
|
57
|
+
if (await client.hasUnreadNotifications()) {
|
|
58
|
+
const list = await client.getUnreadNotifications(5);
|
|
59
|
+
console.log(list.notifications);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Статистика конкретного поста
|
|
63
|
+
const stats = await client.getPostStats('uuid-поста');
|
|
64
|
+
console.log(`${stats.likes} лайков, ${stats.views} просмотров`);
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Что умеет SDK
|
|
69
|
+
|
|
70
|
+
Весь список методов разбит по категориям в документации:
|
|
71
|
+
|
|
72
|
+
- **Посты**: тренды, поиск, создание, удаление, статистика.
|
|
73
|
+
- **Пользователи**: профили, счетчики подписок, клановые эмодзи.
|
|
74
|
+
- **Комментарии**: получение топов, ответы, проверка наличия.
|
|
75
|
+
- **Уведомления**: фильтрация только непрочитанных, отметка о прочтении.
|
|
76
|
+
|
|
77
|
+
Полное описание каждого метода — в **[API_REFERENCE.md](API_REFERENCE.md)**.
|
|
78
|
+
|
|
79
|
+
## Важно
|
|
80
|
+
|
|
81
|
+
Это неофициальный проект. Если разработчики сайта изменят структуру API или введут новую защиту, методы могут временно перестать работать. Используйте аккуратно и не спамьте запросами.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
**Документация:** [API_REFERENCE.md](API_REFERENCE.md) | **Примеры кода:** [examples/README.md](examples/README.md)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# 📚 Примеры использования
|
|
2
|
+
|
|
3
|
+
Примеры, демонстрирующие возможности и преимущества SDK.
|
|
4
|
+
|
|
5
|
+
## 🚀 Быстрый старт
|
|
6
|
+
|
|
7
|
+
**Для новичков:** Запустите `quick-start.js` - он содержит подробные комментарии и пошаговые объяснения.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
node examples/quick-start.js
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 📝 Основные примеры
|
|
14
|
+
|
|
15
|
+
### 1. `basic-usage.js` - Базовое использование
|
|
16
|
+
|
|
17
|
+
Показывает простоту работы с API через удобные методы.
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
node examples/basic-usage.js
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Что демонстрирует:**
|
|
24
|
+
- Получение профиля
|
|
25
|
+
- Работа с постами
|
|
26
|
+
- Использование удобных методов
|
|
27
|
+
|
|
28
|
+
### 2. `user-friendly.js` - Удобные методы
|
|
29
|
+
|
|
30
|
+
Демонстрирует преимущества user-friendly методов SDK.
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
node examples/user-friendly.js
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Что демонстрирует:**
|
|
37
|
+
- Проверка подписки одной строкой
|
|
38
|
+
- Получение статистики поста
|
|
39
|
+
- Работа с уведомлениями
|
|
40
|
+
- Получение клана пользователя
|
|
41
|
+
|
|
42
|
+
### 3. `auto-refresh.js` - Автоматическое обновление токена
|
|
43
|
+
|
|
44
|
+
Показывает, как SDK автоматически обновляет токен при истечении.
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
node examples/auto-refresh.js
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Что демонстрирует:**
|
|
51
|
+
- Автоматическое обновление токена
|
|
52
|
+
- Прозрачная работа с API
|
|
53
|
+
- Обработка ошибок
|
|
54
|
+
|
|
55
|
+
## 📖 Полная документация
|
|
56
|
+
|
|
57
|
+
Для полной документации всех методов см. **[API_REFERENCE.md](../API_REFERENCE.md)**
|
|
58
|
+
|
|
59
|
+
## ⚙️ Настройка перед запуском
|
|
60
|
+
|
|
61
|
+
1. Установите зависимости: `npm install`
|
|
62
|
+
2. Скопируйте `.env.example` в `.env` и заполните `ITD_ACCESS_TOKEN`
|
|
63
|
+
3. Создайте файл `.cookies` и вставьте туда cookies из браузера
|
|
64
|
+
|
|
65
|
+
Подробнее см. **[README.md](../README.md)**
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔄 Пример 3: Автоматическое обновление токена
|
|
3
|
+
*
|
|
4
|
+
* Демонстрирует, как SDK автоматически обновляет токен при истечении.
|
|
5
|
+
* Вы просто используете API - всё работает "из коробки"!
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { ITDClient } from '../src/client.js';
|
|
9
|
+
import dotenv from 'dotenv';
|
|
10
|
+
|
|
11
|
+
dotenv.config();
|
|
12
|
+
|
|
13
|
+
async function main() {
|
|
14
|
+
console.log('🔄 === Автоматическое обновление токена ===\n');
|
|
15
|
+
|
|
16
|
+
const client = new ITDClient();
|
|
17
|
+
|
|
18
|
+
// Устанавливаем токен (может быть уже истёкшим)
|
|
19
|
+
client.setAccessToken(process.env.ITD_ACCESS_TOKEN);
|
|
20
|
+
client.auth.isAuthenticated = true;
|
|
21
|
+
|
|
22
|
+
console.log('💡 SDK автоматически обновит токен при истечении!');
|
|
23
|
+
console.log(' Вы просто используете API - всё работает "из коробки"\n');
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
// Делаем несколько запросов
|
|
27
|
+
// Если токен истёк, SDK автоматически:
|
|
28
|
+
// 1. Обнаружит ошибку 401
|
|
29
|
+
// 2. Обновит токен через refresh endpoint
|
|
30
|
+
// 3. Повторит запрос
|
|
31
|
+
// Всё это происходит автоматически!
|
|
32
|
+
|
|
33
|
+
console.log('📝 Запрос 1: Получаю свой профиль...');
|
|
34
|
+
const profile = await client.getMyProfile();
|
|
35
|
+
console.log(` ✅ Успешно! Username: ${profile.username}\n`);
|
|
36
|
+
|
|
37
|
+
console.log('📝 Запрос 2: Получаю свои посты...');
|
|
38
|
+
const posts = await client.getMyPosts(5);
|
|
39
|
+
console.log(` ✅ Успешно! Найдено постов: ${posts.posts.length}\n`);
|
|
40
|
+
|
|
41
|
+
console.log('📝 Запрос 3: Получаю уведомления...');
|
|
42
|
+
const notifications = await client.getNotifications(5);
|
|
43
|
+
if (notifications) {
|
|
44
|
+
console.log(` ✅ Успешно! Найдено уведомлений: ${notifications.notifications.length}\n`);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
console.log('🎉 Все запросы выполнены успешно!');
|
|
48
|
+
console.log(' Токен обновлялся автоматически при необходимости.\n');
|
|
49
|
+
|
|
50
|
+
// Проверяем текущий токен
|
|
51
|
+
console.log('🔍 Текущий токен:');
|
|
52
|
+
console.log(` ${client.accessToken?.substring(0, 50)}...`);
|
|
53
|
+
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.error('❌ Ошибка:', error.message);
|
|
56
|
+
console.error('\n💡 Убедитесь, что:');
|
|
57
|
+
console.error(' 1. В .env указан ITD_ACCESS_TOKEN');
|
|
58
|
+
console.error(' 2. В .cookies есть refresh_token cookie');
|
|
59
|
+
console.error(' 3. Cookies не истекли');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
main();
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 📝 Пример 1: Базовое использование SDK
|
|
3
|
+
*
|
|
4
|
+
* Показывает простоту работы с API через удобные методы.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { ITDClient } from '../src/client.js';
|
|
8
|
+
import dotenv from 'dotenv';
|
|
9
|
+
|
|
10
|
+
dotenv.config();
|
|
11
|
+
|
|
12
|
+
async function main() {
|
|
13
|
+
console.log('📝 === Базовое использование SDK ===\n');
|
|
14
|
+
|
|
15
|
+
// Создаём клиент
|
|
16
|
+
const client = new ITDClient();
|
|
17
|
+
client.setAccessToken(process.env.ITD_ACCESS_TOKEN);
|
|
18
|
+
client.auth.isAuthenticated = true;
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
// Получаем свой профиль
|
|
22
|
+
console.log('👤 Получаю свой профиль...');
|
|
23
|
+
const profile = await client.getMyProfile();
|
|
24
|
+
console.log(` Имя: ${profile.displayName}`);
|
|
25
|
+
console.log(` Username: ${profile.username}`);
|
|
26
|
+
console.log(` Клан: ${profile.avatar}`);
|
|
27
|
+
console.log(` Подписчиков: ${profile.followersCount}`);
|
|
28
|
+
console.log();
|
|
29
|
+
|
|
30
|
+
// Получаем трендовые посты
|
|
31
|
+
console.log('🔥 Получаю трендовые посты...');
|
|
32
|
+
const trending = await client.getTrendingPosts(5);
|
|
33
|
+
console.log(` Найдено постов: ${trending.posts.length}`);
|
|
34
|
+
if (trending.posts.length > 0) {
|
|
35
|
+
const firstPost = trending.posts[0];
|
|
36
|
+
console.log(` Первый пост: ${firstPost.content?.substring(0, 50)}...`);
|
|
37
|
+
console.log(` Лайков: ${firstPost.likesCount}, Просмотров: ${firstPost.viewsCount}`);
|
|
38
|
+
}
|
|
39
|
+
console.log();
|
|
40
|
+
|
|
41
|
+
// Получаем свои посты
|
|
42
|
+
console.log('📄 Получаю свои посты...');
|
|
43
|
+
const myPosts = await client.getMyPosts(3);
|
|
44
|
+
console.log(` Моих постов: ${myPosts.posts.length}`);
|
|
45
|
+
myPosts.posts.forEach((post, i) => {
|
|
46
|
+
console.log(` ${i + 1}. ${post.content?.substring(0, 40)}... (${post.likesCount} лайков)`);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.error('❌ Ошибка:', error.message);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
main();
|