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.
@@ -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
@@ -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();