|
import { EndPoint, DEFAULT_SEARCH_ENGINE_TIMEOUT, BING_MKT } from './utils/constant'; |
|
import { httpRequest } from './utils/utils'; |
|
import { Sogou } from './search/sogou'; |
|
import searxng, { ESearXNGCategory } from './search/searxng'; |
|
import { webSearch } from './search/chatglm'; |
|
|
|
|
|
export const searchWithSearXNG = async ( |
|
query: string, |
|
categories?: ESearXNGCategory[], |
|
language = 'all' |
|
) => { |
|
language = process.env.SEARXNG_LANGUAGE || language; |
|
const defaultEngines = process.env.SEARXNG_ENGINES ? process.env.SEARXNG_ENGINES.split(',') : []; |
|
const engines = defaultEngines.map(item => item.trim()); |
|
|
|
if (categories?.includes(ESearXNGCategory.SCIENCE)) language = 'all'; |
|
const res = await searxng({ |
|
q: query, |
|
categories, |
|
language, |
|
engines: engines.join(',') |
|
}); |
|
return res; |
|
}; |
|
|
|
|
|
|
|
|
|
export const searchWithBing = async (query: string) => { |
|
try { |
|
const subscriptionKey = process.env.BING_SEARCH_KEY; |
|
if (!subscriptionKey) { |
|
throw new Error('Bing search key is not provided.'); |
|
} |
|
const res = await httpRequest({ |
|
endpoint: EndPoint.BING_SEARCH_V7_ENDPOINT, |
|
timeout: DEFAULT_SEARCH_ENGINE_TIMEOUT, |
|
query: { |
|
q: query, |
|
mkt: BING_MKT |
|
}, |
|
headers: { |
|
'Ocp-Apim-Subscription-Key': subscriptionKey |
|
} |
|
}); |
|
const result = await res.json(); |
|
const list = result?.webPages?.value || []; |
|
return list.map((item: any, index: number) => { |
|
return { |
|
id: index + 1, |
|
name: item.name, |
|
url: item.url, |
|
snippet: item.snippet |
|
}; |
|
}); |
|
} catch(err) { |
|
console.error('[Bing Search Error]:', err); |
|
return []; |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
export const searchWithGoogle = async (query: string) => { |
|
if (!query.trim()) return []; |
|
try { |
|
const key = process.env.GOOGLE_SEARCH_KEY; |
|
const id = process.env.GOOGLE_SEARCH_ID; |
|
const res = await httpRequest({ |
|
method: 'GET', |
|
endpoint: EndPoint.GOOGLE_SEARCH_ENDPOINT, |
|
query: { |
|
key, |
|
cx: id, |
|
q: query |
|
}, |
|
timeout: DEFAULT_SEARCH_ENGINE_TIMEOUT |
|
}); |
|
const result = await res.json(); |
|
const list = result.items ?? []; |
|
return list.map((item: any, index: number) => { |
|
return { |
|
id: index + 1, |
|
name: item.title, |
|
url: item.link, |
|
formattedUrl: item.formattedUrl, |
|
snippet: item.snippet, |
|
imageLink: item.image?.thumbnailLink, |
|
imageContextLink: item.image?.contextLink |
|
}; |
|
}); |
|
} catch (err) { |
|
console.error('Google Search Error:', err); |
|
return []; |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
export const searchWithSogou = async (query: string) => { |
|
const sogou = new Sogou(query); |
|
await sogou.init(); |
|
|
|
const results = await sogou.getResults(); |
|
return results.map((item, index) => { |
|
return { |
|
id: index + 1, |
|
...item |
|
}; |
|
}); |
|
}; |
|
|
|
export const searchWithChatGLM = async (query: string) => { |
|
const results = await webSearch(query); |
|
return results.map((item, index) => { |
|
return { |
|
id: index + 1, |
|
name: item.title, |
|
url: item.link, |
|
snippet: item.content, |
|
icon: item.icon, |
|
media: item.media, |
|
}; |
|
}); |
|
}; |
|
|