chat-v3 / chat-ui /src /lib /server /websearch /searchWeb.ts
muryshev's picture
Changes in search algorithm
1d8089b
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';
// Show result as JSON
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",
},
});
/* eslint-disable @typescript-eslint/no-explicit-any */
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 = {
// q: query,
// hl: "en",
// gl: "us",
// google_domain: "google.com",
// api_key: SERPAPI_KEY,
// } satisfies GoogleParameters;
const params = {
text: query,
yandex_domain: "yandex.ru",
lang: "ru",
lr: "213",
api_key: SERPAPI_KEY
} satisfies YandexParameters;
// Show result as JSON
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 };
}