@letruxux/web-search
Version:
Wrapper for web search engines libraries.
66 lines (65 loc) • 2.32 kB
JavaScript
export class BraveSearchApi {
apiKey;
baseUrl = "https://api.search.brave.com/res/v1/web/search";
constructor(apiKey) {
this.apiKey = apiKey;
}
async search(config) {
const query = this.applySiteModifier(config.query, config.site);
const response = await fetch(`${this.baseUrl}?q=${encodeURIComponent(query)}`, {
headers: {
Accept: "application/json",
"X-Subscription-Token": this.apiKey,
},
});
if (!response.ok) {
throw new Error(`Brave API error: ${response.status} ${response.statusText}`);
}
const data = await response.json();
return (data.web?.results?.map((result) => ({
title: result.title,
url: result.url,
snippet: result.description,
image: result.profile?.img_url || undefined,
})) || []);
}
applySiteModifier(query, site) {
return site ? `${query} site:${site}` : query;
}
}
export class SerpApi {
apiKey;
baseUrl = "https://serpapi.com/search";
constructor(apiKey) {
this.apiKey = apiKey;
}
async search(config) {
const query = this.applySiteModifier(config.query, config.site);
const params = new URLSearchParams({
q: query,
api_key: this.apiKey,
engine: "google_light", // "bing", "duckduckgo", etc.
});
const response = await fetch(`${this.baseUrl}?${params}`);
if (!response.ok) {
throw new Error(`SerpApi error: ${response.status} ${response.statusText}`);
}
const data = await response.json();
return (data.organic_results?.map((result) => ({
title: result.title,
url: result.link,
snippet: result.snippet,
image: result.thumbnail || undefined,
})) || []);
}
applySiteModifier(query, site) {
return site ? `${query} site:${site}` : query;
}
}
/*
const brave = new BraveSearchApi("your-brave-api-key");
const serpApi = new SerpApi("your-serpapi-key");
const braveResults = await brave.search({ query: "test", site: "example.com" });
const serpResults = await serpApi.search({ query: "test", site: "example.com" });
*/
//# sourceMappingURL=api-search.js.map