| import { SERPAPI_KEY, SERPER_API_KEY, YANDEX_API_KEY, YANDEX_FOLDER_ID } from "$env/static/private"; |
| import { JSDOM, VirtualConsole } from "jsdom"; |
| import { getJson } from "serpapi"; |
| import type { GoogleParameters, YandexParameters } from "serpapi"; |
| import { parseString } from 'xml2js'; |
|
|
| |
| export async function searchWeb(query: string) { |
| console.log('searchWeb start') |
| if (YANDEX_API_KEY) { |
| return await searchYandex(query); |
| } |
| if (SERPER_API_KEY) { |
| return await searchWebSerper(query); |
| } |
| if (SERPAPI_KEY) { |
| return await searchWebSerpApi(query); |
| } |
| throw new Error("No Serper.dev or SerpAPI key found"); |
| } |
|
|
| export async function searchWebSerper(query: string) { |
| const params = { |
| q: query, |
| hl: "ru", |
| gl: "ru", |
| engine: "yandex", |
| yandex_domain: "yandex.ru", |
| lang: "ru" |
| }; |
|
|
| const response = await fetch("https://google.serper.dev/search", { |
| method: "POST", |
| body: JSON.stringify(params), |
| headers: { |
| "x-api-key": SERPER_API_KEY, |
| "Content-type": "application/json; charset=UTF-8", |
| }, |
| }); |
|
|
| |
| const data = (await response.json()) as Record<string, any>; |
|
|
| if (!response.ok) { |
| throw new Error( |
| data["message"] ?? |
| `Serper API returned error code ${response.status} - ${response.statusText}` |
| ); |
| } |
|
|
| console.log('searchWeb end', data["organic"] ?? []) |
| return { |
| organic_results: data["organic"] ?? [], |
| }; |
| } |
|
|
| export async function searchWebSerpApi(query: string) { |
| |
| |
| |
| |
| |
| |
| |
|
|
| const params = { |
| text: query, |
| yandex_domain: "yandex.ru", |
| lang: "ru", |
| lr: "213", |
| api_key: SERPAPI_KEY |
| } satisfies YandexParameters; |
|
|
| |
| try { |
| const response = await getJson("yandex", params); |
|
|
| return response; |
| } catch (e) { |
| console.error('Error fetching yandex results:', e); |
| } |
| } |
|
|
| export async function searchYandex(query: string) { |
| const url = `https://yandex.ru/search/xml?folderid=${YANDEX_FOLDER_ID}&apikey=${YANDEX_API_KEY}&query=${query}&maxpassages=0&page=0&sortby=rlv` |
|
|
| console.log('Yandex search start') |
| const responseText = await fetch(url).then((response) => response.text()).catch(e => { console.log(e) }); |
|
|
| const dataArray: { link: string; title: string; host: string }[] = []; |
|
|
| parseString(responseText, (err: any, result: any) => { |
| if (err) { |
| console.error('Error parsing XML:', err); |
| return; |
| } |
|
|
| const groups = result.yandexsearch.response[0].results[0].grouping[0].group; |
|
|
| groups.forEach((group: any) => { |
| const doc = group.doc[0]; |
| const link = doc.url[0]; |
| const host = doc.domain[0]; |
| const title = host; |
|
|
| dataArray.push({ link, title, host }); |
| }); |
| }); |
|
|
|
|
|
|
| console.log('Yandex search result', dataArray) |
| return { organic_results: dataArray }; |
| } |
|
|
|
|
|
|
|
|
|
|
|
|