jsonseo 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/LICENSE +21 -0
- package/README.md +510 -0
- package/dist/cjs/client.d.ts +71 -0
- package/dist/cjs/client.js +135 -0
- package/dist/cjs/common.d.ts +40 -0
- package/dist/cjs/common.js +2 -0
- package/dist/cjs/errors.d.ts +71 -0
- package/dist/cjs/errors.js +123 -0
- package/dist/cjs/http.d.ts +77 -0
- package/dist/cjs/http.js +307 -0
- package/dist/cjs/index.d.ts +9 -0
- package/dist/cjs/index.js +23 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/params.d.ts +361 -0
- package/dist/cjs/params.js +2 -0
- package/dist/cjs/responses.d.ts +352 -0
- package/dist/cjs/responses.js +2 -0
- package/dist/esm/client.d.ts +71 -0
- package/dist/esm/client.js +131 -0
- package/dist/esm/common.d.ts +40 -0
- package/dist/esm/common.js +1 -0
- package/dist/esm/errors.d.ts +71 -0
- package/dist/esm/errors.js +106 -0
- package/dist/esm/http.d.ts +77 -0
- package/dist/esm/http.js +302 -0
- package/dist/esm/index.d.ts +9 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/params.d.ts +361 -0
- package/dist/esm/params.js +1 -0
- package/dist/esm/responses.d.ts +352 -0
- package/dist/esm/responses.js +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/** Органический результат выдачи. */
|
|
2
|
+
export interface SearchResult {
|
|
3
|
+
/** Адрес страницы в выдаче. */
|
|
4
|
+
url: string;
|
|
5
|
+
/** Домен страницы. */
|
|
6
|
+
domain: string;
|
|
7
|
+
/** Заголовок результата. */
|
|
8
|
+
title: string;
|
|
9
|
+
/** Текст сниппета. */
|
|
10
|
+
passage: string;
|
|
11
|
+
/** Хлебные крошки результата. */
|
|
12
|
+
breadcrumbs?: string;
|
|
13
|
+
/** Тип документа: pdf, doc, xls. Отсутствует у обычных страниц. */
|
|
14
|
+
mime?: string;
|
|
15
|
+
/** Тот же тип полностью: application/pdf. */
|
|
16
|
+
mime_type?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Источник, на который опирается ответ нейросети. */
|
|
19
|
+
export interface AiAnswerSource {
|
|
20
|
+
/** Номер источника: им подписаны сноски у Яндекса и Bing. */
|
|
21
|
+
id: number;
|
|
22
|
+
url: string;
|
|
23
|
+
domain: string;
|
|
24
|
+
/** У Google обрезан многоточием — так его показывает сам Google. */
|
|
25
|
+
title?: string;
|
|
26
|
+
/** Только Яндекс. */
|
|
27
|
+
description?: string;
|
|
28
|
+
/** Сколько сносок ведёт на источник. Только Яндекс и Bing. */
|
|
29
|
+
citations?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Блок нейросети над выдачей: Алиса AI, AI Overview, Copilot. Приходит
|
|
33
|
+
* только при `ai: 1` и только если поисковик его показал.
|
|
34
|
+
*/
|
|
35
|
+
export interface AiAnswer {
|
|
36
|
+
/** Текст ответа; у Яндекса и Bing сноски — markdown-ссылки. */
|
|
37
|
+
markdown: string;
|
|
38
|
+
/** Источники. У Google список не отдаётся, если он пуст. */
|
|
39
|
+
sources?: AiAnswerSource[];
|
|
40
|
+
/** Только Яндекс: уточняющие вопросы под ответом. */
|
|
41
|
+
followUps?: string[];
|
|
42
|
+
}
|
|
43
|
+
/** Быстрая ссылка под текстом объявления. */
|
|
44
|
+
export interface AdSitelink {
|
|
45
|
+
/** Подпись ссылки. */
|
|
46
|
+
title: string;
|
|
47
|
+
/** Адрес, очищенный от кликовых меток. Приходит не всегда. */
|
|
48
|
+
url?: string;
|
|
49
|
+
/** Пояснение под ссылкой. Показывает только Яндекс. */
|
|
50
|
+
description?: string;
|
|
51
|
+
}
|
|
52
|
+
/** Рекламное объявление со страницы выдачи. */
|
|
53
|
+
export interface Ad {
|
|
54
|
+
/** Где стоял блок относительно органики. */
|
|
55
|
+
block: 'top' | 'bottom' | 'inline';
|
|
56
|
+
/** Место среди объявлений своего блока, с единицы. */
|
|
57
|
+
position: number;
|
|
58
|
+
/** Страница выдачи, на которой объявление нашлось. Нумерация с нуля, абсолютная. */
|
|
59
|
+
page: number;
|
|
60
|
+
/** Домен рекламодателя. */
|
|
61
|
+
domain: string;
|
|
62
|
+
/** Посадочная страница без меток. Нет, если адрес не вычислен. */
|
|
63
|
+
url?: string;
|
|
64
|
+
/** Адрес в том виде, в каком его показывают человеку. */
|
|
65
|
+
displayUrl?: string;
|
|
66
|
+
/** Заголовок объявления. */
|
|
67
|
+
title?: string;
|
|
68
|
+
/** Текст объявления. */
|
|
69
|
+
description?: string;
|
|
70
|
+
/** Чем поисковик пометил объявление: «Реклама», Sponsored, ArrowTop. */
|
|
71
|
+
label?: string;
|
|
72
|
+
/** Как объявление свёрстано. Только Яндекс. */
|
|
73
|
+
format?: 'text' | 'gallery';
|
|
74
|
+
/** Номер карусели, только у `format: 'gallery'`. Только Яндекс. */
|
|
75
|
+
group?: number;
|
|
76
|
+
/** Быстрые ссылки. */
|
|
77
|
+
sitelinks?: AdSitelink[];
|
|
78
|
+
}
|
|
79
|
+
/** Ответ органической выдачи — общий для Яндекса, Google и Bing. */
|
|
80
|
+
export interface SearchResponse {
|
|
81
|
+
/** Сколько страниц получено — ровно за них и списано. */
|
|
82
|
+
pages: number;
|
|
83
|
+
/** Выдача закончилась, повторять с большим `pages` незачем. */
|
|
84
|
+
exhausted: boolean;
|
|
85
|
+
/** Поиск остановлен доменом из `break_domain`. */
|
|
86
|
+
breakDomainHit: boolean;
|
|
87
|
+
/** Запрос после исправления поисковиком. */
|
|
88
|
+
query: string;
|
|
89
|
+
/** Запрос, как его отправил клиент. */
|
|
90
|
+
rawQuery: string;
|
|
91
|
+
/** Подпись региона выдачи, если поисковик её отдал. */
|
|
92
|
+
region?: string;
|
|
93
|
+
/** Только Google: почему часть результатов скрыта. */
|
|
94
|
+
filter_description?: string;
|
|
95
|
+
/** Только Яндекс: сколько нашлось, округлённо самим поисковиком. */
|
|
96
|
+
found?: number | null;
|
|
97
|
+
/** Только Яндекс: та же величина словами. */
|
|
98
|
+
found_human?: string;
|
|
99
|
+
/** Только Bing: фактический рынок выдачи. */
|
|
100
|
+
mkt?: string;
|
|
101
|
+
/** Только Bing: фактический язык интерфейса выдачи. */
|
|
102
|
+
lang?: string;
|
|
103
|
+
/** Только Яндекс: регион, в котором фактически выполнен поиск. */
|
|
104
|
+
lr?: number;
|
|
105
|
+
/** Адрес страницы выдачи в поисковике. */
|
|
106
|
+
url?: string;
|
|
107
|
+
results: SearchResult[];
|
|
108
|
+
/** Только при `ai: 1` и только если поисковик ответ показал. */
|
|
109
|
+
aiAnswer?: AiAnswer;
|
|
110
|
+
/** Только при `ads: 1`. Пустой массив — просили, но рекламы не было. */
|
|
111
|
+
ads?: Ad[];
|
|
112
|
+
}
|
|
113
|
+
/** Карточка картинки: первые четыре поля есть всегда. */
|
|
114
|
+
export interface ImageResult {
|
|
115
|
+
/** Адрес самого файла картинки у первоисточника. */
|
|
116
|
+
url: string;
|
|
117
|
+
/** Заголовок карточки — обычно заголовок страницы-источника. */
|
|
118
|
+
title: string;
|
|
119
|
+
/** Домен страницы-источника, а не CDN картинки. */
|
|
120
|
+
domain: string;
|
|
121
|
+
/** Страница, на которой картинка стоит. */
|
|
122
|
+
sourceUrl: string;
|
|
123
|
+
/** Превью поисковика; у Google первые карточки приходят как data:. */
|
|
124
|
+
thumbnail?: string;
|
|
125
|
+
/** Ширина оригинала. Нет, если размер не назван. */
|
|
126
|
+
width?: number;
|
|
127
|
+
/** Высота оригинала. */
|
|
128
|
+
height?: number;
|
|
129
|
+
/** Ширина превью. Только Яндекс. */
|
|
130
|
+
thumbnailWidth?: number;
|
|
131
|
+
/** Высота превью. Только Яндекс. */
|
|
132
|
+
thumbnailHeight?: number;
|
|
133
|
+
/** Вес оригинала в байтах. Только Яндекс. */
|
|
134
|
+
bytes?: number;
|
|
135
|
+
}
|
|
136
|
+
/** Ответ поиска по картинкам — общий для всех трёх поисковиков. */
|
|
137
|
+
export interface ImagesResponse {
|
|
138
|
+
/** Сколько страниц получено. */
|
|
139
|
+
pages: number;
|
|
140
|
+
/** Выдача закончилась. */
|
|
141
|
+
exhausted: boolean;
|
|
142
|
+
query: string;
|
|
143
|
+
/** Адрес страницы выдачи в поисковике. */
|
|
144
|
+
url?: string;
|
|
145
|
+
results: ImageResult[];
|
|
146
|
+
/** Только при `ads: 1` и только у картинок Яндекса. */
|
|
147
|
+
ads?: Ad[];
|
|
148
|
+
}
|
|
149
|
+
/** Карточка видео. url, title и domain есть всегда. */
|
|
150
|
+
export interface VideoResult {
|
|
151
|
+
/** Страница с роликом у первоисточника. */
|
|
152
|
+
url: string;
|
|
153
|
+
title: string;
|
|
154
|
+
domain: string;
|
|
155
|
+
/** Кадр-заставка на CDN поисковика. */
|
|
156
|
+
thumbnail?: string;
|
|
157
|
+
/** Длительность в секундах. Нет поля — длина неизвестна, а не ноль. */
|
|
158
|
+
duration?: number;
|
|
159
|
+
/** Длительность подписью поисковика: 31:18, 1:02:44. */
|
|
160
|
+
durationText?: string;
|
|
161
|
+
/** Дата публикации в unix-секундах. Только Яндекс. */
|
|
162
|
+
published?: number;
|
|
163
|
+
/** Дата публикации словами поисковика, на языке выдачи. */
|
|
164
|
+
publishedText?: string;
|
|
165
|
+
/** Просмотры подписью: 6,8K. Точного значения за ними нет. */
|
|
166
|
+
views?: string;
|
|
167
|
+
/** Площадка: YouTube, VK Видео. */
|
|
168
|
+
provider?: string;
|
|
169
|
+
/** Канал или автор внутри площадки. Только Bing. */
|
|
170
|
+
channel?: string;
|
|
171
|
+
/** Текст сниппета. Только Яндекс. */
|
|
172
|
+
description?: string;
|
|
173
|
+
/** Путь под заголовком. Только Google. */
|
|
174
|
+
breadcrumbs?: string;
|
|
175
|
+
}
|
|
176
|
+
/** Ответ поиска по видео — общий для всех трёх поисковиков. */
|
|
177
|
+
export interface VideoResponse {
|
|
178
|
+
pages: number;
|
|
179
|
+
exhausted: boolean;
|
|
180
|
+
query: string;
|
|
181
|
+
url?: string;
|
|
182
|
+
results: VideoResult[];
|
|
183
|
+
}
|
|
184
|
+
/** Ответ поисковых подсказок. */
|
|
185
|
+
export interface SuggestResponse {
|
|
186
|
+
query: string;
|
|
187
|
+
results: string[];
|
|
188
|
+
/** Только Яндекс: регион, в котором собраны подсказки. */
|
|
189
|
+
lr?: string;
|
|
190
|
+
}
|
|
191
|
+
/** Регион Яндекса из справочника. */
|
|
192
|
+
export interface YandexRegion {
|
|
193
|
+
id: number;
|
|
194
|
+
name: string;
|
|
195
|
+
/** Что это за регион: область, республика, страна. */
|
|
196
|
+
subname: string;
|
|
197
|
+
lat: number;
|
|
198
|
+
lon: number;
|
|
199
|
+
}
|
|
200
|
+
/** Ответ справочника регионов Яндекса. */
|
|
201
|
+
export interface YandexRegionsResponse {
|
|
202
|
+
name: string;
|
|
203
|
+
lang: string;
|
|
204
|
+
regions: YandexRegion[];
|
|
205
|
+
}
|
|
206
|
+
/** Регион Google из справочника: вместе с ID приходит готовый uule. */
|
|
207
|
+
export interface GoogleRegion {
|
|
208
|
+
id: number;
|
|
209
|
+
name: string;
|
|
210
|
+
subname: string;
|
|
211
|
+
type: string;
|
|
212
|
+
type_name: string;
|
|
213
|
+
canonical_name: string;
|
|
214
|
+
/** Готовая строка UULE для параметра `uule`. */
|
|
215
|
+
uule: string;
|
|
216
|
+
lat: number;
|
|
217
|
+
lon: number;
|
|
218
|
+
}
|
|
219
|
+
/** Ответ справочника регионов Google. */
|
|
220
|
+
export interface GoogleRegionsResponse {
|
|
221
|
+
name: string;
|
|
222
|
+
lang: string;
|
|
223
|
+
regions: GoogleRegion[];
|
|
224
|
+
}
|
|
225
|
+
/** Строка списка запросов Вордстата. */
|
|
226
|
+
export interface WordstatPhrase {
|
|
227
|
+
text: string;
|
|
228
|
+
value: number;
|
|
229
|
+
}
|
|
230
|
+
/** Ответ со списками популярных и похожих запросов. */
|
|
231
|
+
export interface WordstatResponse {
|
|
232
|
+
text: string;
|
|
233
|
+
region: string;
|
|
234
|
+
device: string;
|
|
235
|
+
results: {
|
|
236
|
+
/** Что ищут вместе с этой фразой. */
|
|
237
|
+
popular: WordstatPhrase[];
|
|
238
|
+
/** Соседняя семантика. */
|
|
239
|
+
associations: WordstatPhrase[];
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/** Ответ с частотой запроса. */
|
|
243
|
+
export interface WordstatFrequencyResponse {
|
|
244
|
+
text: string;
|
|
245
|
+
region: string;
|
|
246
|
+
device: string;
|
|
247
|
+
results: {
|
|
248
|
+
/** Частота запроса одним числом. */
|
|
249
|
+
totalValue: number;
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/** Точка динамики показов. */
|
|
253
|
+
export interface WordstatGraphPoint {
|
|
254
|
+
/** Дата начала периода. */
|
|
255
|
+
date: string;
|
|
256
|
+
/** Подпись периода словами: «июнь 2026». */
|
|
257
|
+
text: string;
|
|
258
|
+
/** Показы за период. */
|
|
259
|
+
absolute: number;
|
|
260
|
+
/** Доля среди всех показов Яндекса. */
|
|
261
|
+
relative: number;
|
|
262
|
+
}
|
|
263
|
+
/** Ответ с динамикой запроса. */
|
|
264
|
+
export interface WordstatGraphResponse {
|
|
265
|
+
text: string;
|
|
266
|
+
region: string;
|
|
267
|
+
device: string;
|
|
268
|
+
/** Шаг динамики, который применился. */
|
|
269
|
+
type: string;
|
|
270
|
+
results: {
|
|
271
|
+
graph: WordstatGraphPoint[];
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/** Строка географии показов. */
|
|
275
|
+
export interface WordstatMapRow {
|
|
276
|
+
/** Разрез строки: regions или cities. */
|
|
277
|
+
type: string;
|
|
278
|
+
/** Название региона или города. */
|
|
279
|
+
text: string;
|
|
280
|
+
/** Показы. */
|
|
281
|
+
absolute: number;
|
|
282
|
+
/** Affinity-индекс: 100 — средний интерес, выше — повышенный. */
|
|
283
|
+
popularity: number;
|
|
284
|
+
/** Доля среди всех показов Яндекса. */
|
|
285
|
+
relative: number;
|
|
286
|
+
/** ID региона для `region`; null, если название неоднозначно. */
|
|
287
|
+
region_id: number | null;
|
|
288
|
+
}
|
|
289
|
+
/** Ответ с географией запроса. */
|
|
290
|
+
export interface WordstatMapResponse {
|
|
291
|
+
text: string;
|
|
292
|
+
device: string;
|
|
293
|
+
type: string;
|
|
294
|
+
results: {
|
|
295
|
+
rows: WordstatMapRow[];
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
/** Прогноз по одному месту аукциона. */
|
|
299
|
+
export interface DirectPosition {
|
|
300
|
+
/** Ставка. */
|
|
301
|
+
bid: number;
|
|
302
|
+
/** Бюджет за период. */
|
|
303
|
+
budget: number;
|
|
304
|
+
/** Прогноз кликов. */
|
|
305
|
+
clicks: number;
|
|
306
|
+
/** Прогноз CTR в процентах. */
|
|
307
|
+
ctr: number;
|
|
308
|
+
/** Прогноз показов. */
|
|
309
|
+
shows: number;
|
|
310
|
+
}
|
|
311
|
+
/** Прогноз по одной фразе. */
|
|
312
|
+
export interface DirectForecast {
|
|
313
|
+
phrase: string;
|
|
314
|
+
/** Сколько раз объявление будет показано за период. */
|
|
315
|
+
shows: number;
|
|
316
|
+
/** Места аукциона: набор задаёт сам Директ. */
|
|
317
|
+
positions: Record<string, DirectPosition>;
|
|
318
|
+
}
|
|
319
|
+
/** Ответ прогноза показов Яндекс Директа. */
|
|
320
|
+
export interface DirectResponse {
|
|
321
|
+
/** Регион, по которому считался прогноз. */
|
|
322
|
+
geo: number;
|
|
323
|
+
period: string;
|
|
324
|
+
/** На сколько пачек разбит список — по ним считается стоимость. */
|
|
325
|
+
batches: number;
|
|
326
|
+
/** Сколько пачек посчитано. */
|
|
327
|
+
processed: number;
|
|
328
|
+
results: DirectForecast[];
|
|
329
|
+
/** Ошибки Директа по отдельным фразам. */
|
|
330
|
+
errors: string[];
|
|
331
|
+
}
|
|
332
|
+
/** Ответ геолокации по IP. */
|
|
333
|
+
export interface GeoipResponse {
|
|
334
|
+
ip: string;
|
|
335
|
+
latitude: number;
|
|
336
|
+
longitude: number;
|
|
337
|
+
/** ID тот же, что у Яндекса: годится для `region`. */
|
|
338
|
+
region: {
|
|
339
|
+
id: number;
|
|
340
|
+
name: string;
|
|
341
|
+
};
|
|
342
|
+
country: {
|
|
343
|
+
id: number;
|
|
344
|
+
name: string;
|
|
345
|
+
iso_name: string;
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
/** Ответ с остатком на счёте. */
|
|
349
|
+
export interface BalanceResponse {
|
|
350
|
+
balance: number;
|
|
351
|
+
currency: string;
|
|
352
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { ParamValue } from './common.js';
|
|
2
|
+
import { type ClientOptions, type RequestOptions } from './http.js';
|
|
3
|
+
import type { BingImagesParams, BingSearchParams, BingSuggestParams, BingVideoParams, DirectParams, GeoipParams, GoogleImagesParams, GoogleSearchParams, GoogleSuggestParams, GoogleVideoParams, RegionsParams, WordstatGraphParams, WordstatMapParams, WordstatParams, YandexImagesParams, YandexSearchParams, YandexSuggestParams, YandexVideoParams } from './params.js';
|
|
4
|
+
import type { BalanceResponse, DirectResponse, GeoipResponse, GoogleRegionsResponse, ImagesResponse, SearchResponse, SuggestResponse, VideoResponse, WordstatFrequencyResponse, WordstatGraphResponse, WordstatMapResponse, WordstatResponse, YandexRegionsResponse } from './responses.js';
|
|
5
|
+
/**
|
|
6
|
+
* Клиент JSON SEO API.
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* const client = new JsonSeoClient('ВАШ_КЛЮЧ');
|
|
10
|
+
* const serp = await client.yandex({ text: 'купить ноутбук', region: 213 });
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export declare class JsonSeoClient {
|
|
14
|
+
private readonly http;
|
|
15
|
+
constructor(apiKey: string, options?: Omit<ClientOptions, 'apiKey'>);
|
|
16
|
+
constructor(options: ClientOptions);
|
|
17
|
+
/** Органическая выдача Яндекса: мобильная, регион 213. 0.01 ₽ за страницу. */
|
|
18
|
+
yandex(params: string | YandexSearchParams, options?: RequestOptions): Promise<SearchResponse>;
|
|
19
|
+
/** Подсказки Яндекса: до 50 фраз с учётом региона. 0.01 ₽ за запрос. */
|
|
20
|
+
yandexSuggest(params: string | YandexSuggestParams, options?: RequestOptions): Promise<SuggestResponse>;
|
|
21
|
+
/** Код региона (lr) по названию города или области. Бесплатно, нужен ключ. */
|
|
22
|
+
yandexRegions(params: string | RegionsParams, options?: RequestOptions): Promise<YandexRegionsResponse>;
|
|
23
|
+
/** Картинки Яндекса: 20 карточек на страницу, 0.01 ₽ за страницу. */
|
|
24
|
+
yandexImages(params: string | YandexImagesParams, options?: RequestOptions): Promise<ImagesResponse>;
|
|
25
|
+
/** Видео Яндекса: 20 карточек на страницу, 0.01 ₽ за страницу. */
|
|
26
|
+
yandexVideo(params: string | YandexVideoParams, options?: RequestOptions): Promise<VideoResponse>;
|
|
27
|
+
/** Органическая выдача google.com: мобильная, 0.01 ₽ за страницу. */
|
|
28
|
+
google(params: string | GoogleSearchParams, options?: RequestOptions): Promise<SearchResponse>;
|
|
29
|
+
/** Подсказки Google: до ~15 фраз. 0.01 ₽ за запрос. */
|
|
30
|
+
googleSuggest(params: string | GoogleSuggestParams, options?: RequestOptions): Promise<SuggestResponse>;
|
|
31
|
+
/** ID региона Google по названию и готовый `uule`. Бесплатно, нужен ключ. */
|
|
32
|
+
googleRegions(params: string | RegionsParams, options?: RequestOptions): Promise<GoogleRegionsResponse>;
|
|
33
|
+
/** Картинки Google: 100 карточек на страницу, 0.01 ₽ за страницу. */
|
|
34
|
+
googleImages(params: string | GoogleImagesParams, options?: RequestOptions): Promise<ImagesResponse>;
|
|
35
|
+
/** Видео Google: 10 карточек на страницу, 0.01 ₽ за страницу. */
|
|
36
|
+
googleVideo(params: string | GoogleVideoParams, options?: RequestOptions): Promise<VideoResponse>;
|
|
37
|
+
/** Органическая выдача bing.com: без локации — Россия, 0.01 ₽ за страницу. */
|
|
38
|
+
bing(params: string | BingSearchParams, options?: RequestOptions): Promise<SearchResponse>;
|
|
39
|
+
/** Подсказки Bing. 0.01 ₽ за запрос. */
|
|
40
|
+
bingSuggest(params: string | BingSuggestParams, options?: RequestOptions): Promise<SuggestResponse>;
|
|
41
|
+
/** Картинки Bing: `count` карточек (по умолчанию 35), дальше 700-й не листает. */
|
|
42
|
+
bingImages(params: string | BingImagesParams, options?: RequestOptions): Promise<ImagesResponse>;
|
|
43
|
+
/** Видео Bing: `count` карточек на страницу, по умолчанию 105. */
|
|
44
|
+
bingVideo(params: string | BingVideoParams, options?: RequestOptions): Promise<VideoResponse>;
|
|
45
|
+
/** Популярные и похожие запросы. 0.01 ₽ за запрос. */
|
|
46
|
+
wordstat(params: string | WordstatParams, options?: RequestOptions): Promise<WordstatResponse>;
|
|
47
|
+
/** Частота запроса одним числом — `results.totalValue`. 0.01 ₽ за запрос. */
|
|
48
|
+
wordstatFrequency(params: string | WordstatParams, options?: RequestOptions): Promise<WordstatFrequencyResponse>;
|
|
49
|
+
/** Динамика показов по месяцам, неделям или дням. 0.01 ₽ за запрос. */
|
|
50
|
+
wordstatGraph(params: string | WordstatGraphParams, options?: RequestOptions): Promise<WordstatGraphResponse>;
|
|
51
|
+
/**
|
|
52
|
+
* Показы по регионам и городам. `popularity` — affinity-индекс: 100 —
|
|
53
|
+
* средний интерес. 0.01 ₽ за запрос.
|
|
54
|
+
*/
|
|
55
|
+
wordstatMap(params: string | WordstatMapParams, options?: RequestOptions): Promise<WordstatMapResponse>;
|
|
56
|
+
/**
|
|
57
|
+
* Прогноз показов Директа со ставками и бюджетом. Кабинет не нужен.
|
|
58
|
+
*
|
|
59
|
+
* 0.01 ₽ за пачку до 4000 символов (около 150 фраз). До 1000 фраз за
|
|
60
|
+
* запрос, 100 запросов в час.
|
|
61
|
+
*/
|
|
62
|
+
direct(params: string | ReadonlyArray<string> | DirectParams, options?: RequestOptions): Promise<DirectResponse>;
|
|
63
|
+
/** Страна, регион и координаты по IPv4. Бесплатно, нужен ключ. */
|
|
64
|
+
geoip(params: string | GeoipParams, options?: RequestOptions): Promise<GeoipResponse>;
|
|
65
|
+
/** Текущий баланс. Бесплатно, нужен ключ. */
|
|
66
|
+
balance(options?: RequestOptions): Promise<BalanceResponse>;
|
|
67
|
+
/** Произвольный метод API — если в сервисе появился новый. */
|
|
68
|
+
call<T = unknown>(path: string, params?: Record<string, ParamValue>, options?: RequestOptions): Promise<T>;
|
|
69
|
+
/** То же, но ответ возвращается строкой без разбора. */
|
|
70
|
+
callRaw(path: string, params?: Record<string, ParamValue>, options?: RequestOptions): Promise<string>;
|
|
71
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { InvalidArgumentError } from './errors.js';
|
|
2
|
+
import { HttpClient } from './http.js';
|
|
3
|
+
/**
|
|
4
|
+
* Клиент JSON SEO API.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* const client = new JsonSeoClient('ВАШ_КЛЮЧ');
|
|
8
|
+
* const serp = await client.yandex({ text: 'купить ноутбук', region: 213 });
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export class JsonSeoClient {
|
|
12
|
+
constructor(first, second = {}) {
|
|
13
|
+
this.http = new HttpClient(typeof first === 'string' ? { ...second, apiKey: first } : first);
|
|
14
|
+
}
|
|
15
|
+
// Яндекс
|
|
16
|
+
/** Органическая выдача Яндекса: мобильная, регион 213. 0.01 ₽ за страницу. */
|
|
17
|
+
async yandex(params, options) {
|
|
18
|
+
return this.http.json('yandex', primary(params, 'text'), options);
|
|
19
|
+
}
|
|
20
|
+
/** Подсказки Яндекса: до 50 фраз с учётом региона. 0.01 ₽ за запрос. */
|
|
21
|
+
async yandexSuggest(params, options) {
|
|
22
|
+
return this.http.json('yandex/suggest', primary(params, 'text'), options);
|
|
23
|
+
}
|
|
24
|
+
/** Код региона (lr) по названию города или области. Бесплатно, нужен ключ. */
|
|
25
|
+
async yandexRegions(params, options) {
|
|
26
|
+
return this.http.json('yandex/regions', primary(params, 'name'), options);
|
|
27
|
+
}
|
|
28
|
+
/** Картинки Яндекса: 20 карточек на страницу, 0.01 ₽ за страницу. */
|
|
29
|
+
async yandexImages(params, options) {
|
|
30
|
+
return this.http.json('yandex/images', primary(params, 'q'), options);
|
|
31
|
+
}
|
|
32
|
+
/** Видео Яндекса: 20 карточек на страницу, 0.01 ₽ за страницу. */
|
|
33
|
+
async yandexVideo(params, options) {
|
|
34
|
+
return this.http.json('yandex/video', primary(params, 'q'), options);
|
|
35
|
+
}
|
|
36
|
+
// Google
|
|
37
|
+
/** Органическая выдача google.com: мобильная, 0.01 ₽ за страницу. */
|
|
38
|
+
async google(params, options) {
|
|
39
|
+
return this.http.json('google', primary(params, 'q'), options);
|
|
40
|
+
}
|
|
41
|
+
/** Подсказки Google: до ~15 фраз. 0.01 ₽ за запрос. */
|
|
42
|
+
async googleSuggest(params, options) {
|
|
43
|
+
return this.http.json('google/suggest', primary(params, 'q'), options);
|
|
44
|
+
}
|
|
45
|
+
/** ID региона Google по названию и готовый `uule`. Бесплатно, нужен ключ. */
|
|
46
|
+
async googleRegions(params, options) {
|
|
47
|
+
return this.http.json('google/regions', primary(params, 'name'), options);
|
|
48
|
+
}
|
|
49
|
+
/** Картинки Google: 100 карточек на страницу, 0.01 ₽ за страницу. */
|
|
50
|
+
async googleImages(params, options) {
|
|
51
|
+
return this.http.json('google/images', primary(params, 'q'), options);
|
|
52
|
+
}
|
|
53
|
+
/** Видео Google: 10 карточек на страницу, 0.01 ₽ за страницу. */
|
|
54
|
+
async googleVideo(params, options) {
|
|
55
|
+
return this.http.json('google/video', primary(params, 'q'), options);
|
|
56
|
+
}
|
|
57
|
+
// Bing
|
|
58
|
+
/** Органическая выдача bing.com: без локации — Россия, 0.01 ₽ за страницу. */
|
|
59
|
+
async bing(params, options) {
|
|
60
|
+
return this.http.json('bing', primary(params, 'q'), options);
|
|
61
|
+
}
|
|
62
|
+
/** Подсказки Bing. 0.01 ₽ за запрос. */
|
|
63
|
+
async bingSuggest(params, options) {
|
|
64
|
+
return this.http.json('bing/suggest', primary(params, 'q'), options);
|
|
65
|
+
}
|
|
66
|
+
/** Картинки Bing: `count` карточек (по умолчанию 35), дальше 700-й не листает. */
|
|
67
|
+
async bingImages(params, options) {
|
|
68
|
+
return this.http.json('bing/images', primary(params, 'q'), options);
|
|
69
|
+
}
|
|
70
|
+
/** Видео Bing: `count` карточек на страницу, по умолчанию 105. */
|
|
71
|
+
async bingVideo(params, options) {
|
|
72
|
+
return this.http.json('bing/video', primary(params, 'q'), options);
|
|
73
|
+
}
|
|
74
|
+
// Вордстат
|
|
75
|
+
/** Популярные и похожие запросы. 0.01 ₽ за запрос. */
|
|
76
|
+
async wordstat(params, options) {
|
|
77
|
+
return this.http.json('wordstat', primary(params, 'text'), options);
|
|
78
|
+
}
|
|
79
|
+
/** Частота запроса одним числом — `results.totalValue`. 0.01 ₽ за запрос. */
|
|
80
|
+
async wordstatFrequency(params, options) {
|
|
81
|
+
return this.http.json('wordstat/frequency', primary(params, 'text'), options);
|
|
82
|
+
}
|
|
83
|
+
/** Динамика показов по месяцам, неделям или дням. 0.01 ₽ за запрос. */
|
|
84
|
+
async wordstatGraph(params, options) {
|
|
85
|
+
return this.http.json('wordstat/graph', primary(params, 'text'), options);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Показы по регионам и городам. `popularity` — affinity-индекс: 100 —
|
|
89
|
+
* средний интерес. 0.01 ₽ за запрос.
|
|
90
|
+
*/
|
|
91
|
+
async wordstatMap(params, options) {
|
|
92
|
+
return this.http.json('wordstat/map', primary(params, 'text'), options);
|
|
93
|
+
}
|
|
94
|
+
// Директ и служебные методы
|
|
95
|
+
/**
|
|
96
|
+
* Прогноз показов Директа со ставками и бюджетом. Кабинет не нужен.
|
|
97
|
+
*
|
|
98
|
+
* 0.01 ₽ за пачку до 4000 символов (около 150 фраз). До 1000 фраз за
|
|
99
|
+
* запрос, 100 запросов в час.
|
|
100
|
+
*/
|
|
101
|
+
async direct(params, options) {
|
|
102
|
+
return this.http.json('direct', primary(params, 'phrases'), options);
|
|
103
|
+
}
|
|
104
|
+
/** Страна, регион и координаты по IPv4. Бесплатно, нужен ключ. */
|
|
105
|
+
async geoip(params, options) {
|
|
106
|
+
return this.http.json('geoip', primary(params, 'ip'), options);
|
|
107
|
+
}
|
|
108
|
+
/** Текущий баланс. Бесплатно, нужен ключ. */
|
|
109
|
+
async balance(options) {
|
|
110
|
+
return this.http.json('balance', {}, options);
|
|
111
|
+
}
|
|
112
|
+
// Запасной выход
|
|
113
|
+
/** Произвольный метод API — если в сервисе появился новый. */
|
|
114
|
+
async call(path, params = {}, options) {
|
|
115
|
+
return this.http.json(path, params, options);
|
|
116
|
+
}
|
|
117
|
+
/** То же, но ответ возвращается строкой без разбора. */
|
|
118
|
+
async callRaw(path, params = {}, options) {
|
|
119
|
+
return this.http.text(path, params, options);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Даёт вызывать метод строкой или, для `direct()`, списком фраз. */
|
|
123
|
+
function primary(params, key) {
|
|
124
|
+
if (typeof params === 'string' || Array.isArray(params)) {
|
|
125
|
+
return { [key]: params };
|
|
126
|
+
}
|
|
127
|
+
if (params === null || typeof params !== 'object') {
|
|
128
|
+
throw new InvalidArgumentError('Параметры метода передаются строкой, массивом или объектом.');
|
|
129
|
+
}
|
|
130
|
+
return params;
|
|
131
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Значение параметра: массив склеивается, флаг даёт 1/0, null не уедет. */
|
|
2
|
+
export type ParamValue = string | number | boolean | ReadonlyArray<string | number> | null | undefined;
|
|
3
|
+
/** Переключатель: API принимает и 1/0, и true/false. */
|
|
4
|
+
export type Flag = boolean | 0 | 1;
|
|
5
|
+
/** Устройство, с которого снимается выдача. */
|
|
6
|
+
export type Device = 'mobile' | 'desktop' | 'tablet';
|
|
7
|
+
/** У Google и Bing планшетной выдачи нет. */
|
|
8
|
+
export type MobileDevice = 'mobile' | 'desktop';
|
|
9
|
+
/** Фильтрация взрослого контента у Яндекса. */
|
|
10
|
+
export type AdultFilter = 'none' | 'moderate' | 'strict';
|
|
11
|
+
/** Она же у Bing — значения называются иначе. */
|
|
12
|
+
export type BingSafeSearch = 'off' | 'moderate' | 'strict';
|
|
13
|
+
/** SafeSearch Google. */
|
|
14
|
+
export type GoogleSafeSearch = 'active' | 'off';
|
|
15
|
+
/** Доменная зона Яндекса. */
|
|
16
|
+
export type YandexZone = 'ru' | 'tr' | 'com' | 'kz' | 'by' | 'be' | 'kk' | 'uz' | 'com.tr';
|
|
17
|
+
/** Язык названий в справочниках регионов. */
|
|
18
|
+
export type RegionLanguage = 'ru' | 'en';
|
|
19
|
+
/** Размер картинки. У Google меньшая ступень — это значки ровно 256 px. */
|
|
20
|
+
export type ImageSize = 'large' | 'medium' | 'small';
|
|
21
|
+
/** Ориентация картинки. Есть у всех трёх поисковиков. */
|
|
22
|
+
export type ImageOrientation = 'horizontal' | 'vertical' | 'square';
|
|
23
|
+
/** Цвет: color — полноцветные, mono — чёрно-белые, остальное — основной. */
|
|
24
|
+
export type ImageColor = 'color' | 'mono' | 'red' | 'orange' | 'yellow' | 'green' | 'teal' | 'blue' | 'purple' | 'white' | 'black' | 'pink' | 'brown';
|
|
25
|
+
/** Тип изображения: transparent нет у Яндекса, demotivator есть только у него. */
|
|
26
|
+
export type ImageType = 'photo' | 'clipart' | 'lineart' | 'face' | 'animated' | 'transparent' | 'demotivator';
|
|
27
|
+
/** Формат файла. У Bing поддерживается только gif. */
|
|
28
|
+
export type ImageFormat = 'jpg' | 'png' | 'gif';
|
|
29
|
+
/** Насколько свежий результат. Окна у поисковиков свои. */
|
|
30
|
+
export type Freshness = 'day' | 'week' | 'month' | 'year';
|
|
31
|
+
/** Длительность ролика. Границы ступеней у каждого поисковика свои. */
|
|
32
|
+
export type VideoDuration = 'short' | 'medium' | 'long';
|
|
33
|
+
/** Вид частотности: операторы расставит сервис, кавычки не нужны. */
|
|
34
|
+
export type WordstatKind = 'base' | 'phrase' | 'exact' | 'superexact';
|
|
35
|
+
/** Шаг динамики: month и week — история с 2018 года, day — последние 60 дней. */
|
|
36
|
+
export type WordstatGraphType = 'day' | 'week' | 'month';
|
|
37
|
+
/** Разрез географии показов. */
|
|
38
|
+
export type WordstatMapType = 'all' | 'regions' | 'cities';
|
|
39
|
+
/** Период прогноза Яндекс Директа. */
|
|
40
|
+
export type DirectPeriod = 'week' | 'month' | 'quarter' | 'year';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|