mirror of
https://github.com/ItzCrazyKns/Perplexica.git
synced 2025-06-18 15:58:31 +00:00
add bing
This commit is contained in:
@ -11,6 +11,7 @@ import { searchSearxng } from '../lib/searchEngines/searxng';
|
|||||||
import { searchGooglePSE } from '../lib/searchEngines/google_pse';
|
import { searchGooglePSE } from '../lib/searchEngines/google_pse';
|
||||||
import { searchBraveAPI } from '../lib/searchEngines/brave';
|
import { searchBraveAPI } from '../lib/searchEngines/brave';
|
||||||
import { searchYaCy } from '../lib/searchEngines/yacy';
|
import { searchYaCy } from '../lib/searchEngines/yacy';
|
||||||
|
import { searchBingAPI } from '../lib/searchEngines/bing';
|
||||||
import { getSearchEngineBackend } from '../config';
|
import { getSearchEngineBackend } from '../config';
|
||||||
import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
||||||
|
|
||||||
@ -107,6 +108,21 @@ async function performImageSearch(query: string) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 'bing': {
|
||||||
|
const bingResult = await searchBingAPI(query);
|
||||||
|
images = bingResult.results.map((result) => {
|
||||||
|
if (result.img_src && result.url && result.title) {
|
||||||
|
return {
|
||||||
|
img_src: result.img_src,
|
||||||
|
url: result.url,
|
||||||
|
title: result.title,
|
||||||
|
source: result.url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).filter(Boolean);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new Error(`Unknown search engine ${searchEngine}`);
|
throw new Error(`Unknown search engine ${searchEngine}`);
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@ import { StringOutputParser } from '@langchain/core/output_parsers';
|
|||||||
import { searchSearxng } from '../lib/searchEngines/searxng';
|
import { searchSearxng } from '../lib/searchEngines/searxng';
|
||||||
import { searchGooglePSE } from '../lib/searchEngines/google_pse';
|
import { searchGooglePSE } from '../lib/searchEngines/google_pse';
|
||||||
import { searchBraveAPI } from '../lib/searchEngines/brave';
|
import { searchBraveAPI } from '../lib/searchEngines/brave';
|
||||||
import { searchYaCy } from '../lib/searchEngines/yacy';
|
import { searchBingAPI } from '../lib/searchEngines/bing';
|
||||||
import { getSearchEngineBackend } from '../config';
|
import { getSearchEngineBackend } from '../config';
|
||||||
import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
||||||
|
|
||||||
@ -108,6 +108,22 @@ async function performVideoSearch(query: string) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 'bing': {
|
||||||
|
const bingResult = await searchBingAPI(youtubeQuery);
|
||||||
|
bingResult.results.forEach((result) => {
|
||||||
|
if (result.img_src && result.url && result.title) {
|
||||||
|
const videoId = new URL(result.url).searchParams.get('v');
|
||||||
|
videos.push({
|
||||||
|
img_src: result.img_src,
|
||||||
|
url: result.url,
|
||||||
|
title: result.title,
|
||||||
|
iframe_src: videoId ? `https://www.youtube.com/embed/${videoId}` : null
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new Error(`Unknown search engine ${searchEngine}`);
|
throw new Error(`Unknown search engine ${searchEngine}`);
|
||||||
}
|
}
|
||||||
|
@ -32,15 +32,12 @@ interface BingAPISearchResult {
|
|||||||
width?: number;
|
width?: number;
|
||||||
height?: number;
|
height?: number;
|
||||||
};
|
};
|
||||||
provider?: Array<{
|
|
||||||
name: string;
|
|
||||||
_type: string;
|
|
||||||
}>;
|
|
||||||
video?: {
|
video?: {
|
||||||
allowHttpsEmbed?: boolean;
|
allowHttpsEmbed?: boolean;
|
||||||
embedHtml?: string;
|
embedHtml?: string;
|
||||||
allowMobileEmbed?: boolean;
|
allowMobileEmbed?: boolean;
|
||||||
viewCount?: number;
|
viewCount?: number;
|
||||||
|
duration?: string;
|
||||||
};
|
};
|
||||||
image?: {
|
image?: {
|
||||||
thumbnail?: {
|
thumbnail?: {
|
||||||
@ -51,29 +48,14 @@ interface BingAPISearchResult {
|
|||||||
imageInsightsToken?: string;
|
imageInsightsToken?: string;
|
||||||
imageId?: string;
|
imageId?: string;
|
||||||
};
|
};
|
||||||
metatags?: Array<{
|
|
||||||
[key: string]: string;
|
|
||||||
'og:type'?: string;
|
|
||||||
'og:image'?: string;
|
|
||||||
'og:video'?: string;
|
|
||||||
}>;
|
|
||||||
mentions?: Array<{
|
|
||||||
name: string;
|
|
||||||
}>;
|
|
||||||
entity?: {
|
|
||||||
entityPresentationInfo?: {
|
|
||||||
entityTypeHints?: string[];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export const searchBingAPI = async (query: string) => {
|
export const searchBingAPI = async (query: string) => {
|
||||||
try {
|
try {
|
||||||
const bingApiKey = await getBingSubscriptionKey();
|
const bingApiKey = await getBingSubscriptionKey();
|
||||||
const url = new URL(`https://api.cognitive.microsoft.com/bing/v7.0/search`);
|
const url = new URL(`https://api.cognitive.microsoft.com/bing/v7.0/search`);
|
||||||
url.searchParams.append('q', query);
|
url.searchParams.append('q', query);
|
||||||
url.searchParams.append('responseFilter', 'Webpages,Images,Videos,News');
|
url.searchParams.append('responseFilter', 'Webpages,Images,Videos');
|
||||||
|
|
||||||
const res = await axios.get(url.toString(), {
|
const res = await axios.get(url.toString(), {
|
||||||
headers: {
|
headers: {
|
||||||
@ -87,11 +69,13 @@ export const searchBingAPI = async (query: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const originalres = res.data;
|
const originalres = res.data;
|
||||||
|
|
||||||
|
// Extract web, image, and video results
|
||||||
const webResults = originalres.webPages?.value || [];
|
const webResults = originalres.webPages?.value || [];
|
||||||
const imageResults = originalres.images?.value || [];
|
const imageResults = originalres.images?.value || [];
|
||||||
const videoResults = originalres.videos?.value || [];
|
const videoResults = originalres.videos?.value || [];
|
||||||
|
|
||||||
const results = webResults.map((item: any) => ({
|
const results = webResults.map((item: BingAPISearchResult) => ({
|
||||||
title: item.name,
|
title: item.name,
|
||||||
url: item.url,
|
url: item.url,
|
||||||
content: item.snippet,
|
content: item.snippet,
|
||||||
@ -102,7 +86,9 @@ export const searchBingAPI = async (query: string) => {
|
|||||||
videoData: {
|
videoData: {
|
||||||
duration: item.video.duration,
|
duration: item.video.duration,
|
||||||
embedUrl: item.video.embedHtml?.match(/src="(.*?)"/)?.[1]
|
embedUrl: item.video.embedHtml?.match(/src="(.*?)"/)?.[1]
|
||||||
}
|
},
|
||||||
|
publisher: item.publisher,
|
||||||
|
datePublished: item.datePublished
|
||||||
})
|
})
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ import { searchSearxng } from '../lib/searchEngines/searxng';
|
|||||||
import { searchGooglePSE } from '../lib/searchEngines/google_pse';
|
import { searchGooglePSE } from '../lib/searchEngines/google_pse';
|
||||||
import { searchBraveAPI } from '../lib/searchEngines/brave';
|
import { searchBraveAPI } from '../lib/searchEngines/brave';
|
||||||
import { searchYaCy } from '../lib/searchEngines/yacy';
|
import { searchYaCy } from '../lib/searchEngines/yacy';
|
||||||
|
import { searchBingAPI } from '../lib/searchEngines/bing';
|
||||||
import { getSearchEngineBackend } from '../config';
|
import { getSearchEngineBackend } from '../config';
|
||||||
import logger from '../utils/logger';
|
import logger from '../utils/logger';
|
||||||
|
|
||||||
@ -72,6 +73,20 @@ async function performSearch(query: string, site: string) {
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 'bing': {
|
||||||
|
const bingResult = await searchBingAPI(query);
|
||||||
|
return bingResult.results.map(item => ({
|
||||||
|
title: item.title,
|
||||||
|
url: item.url,
|
||||||
|
content: item.content,
|
||||||
|
thumbnail: item.img_src,
|
||||||
|
img_src: item.img_src,
|
||||||
|
iframe_src: null,
|
||||||
|
author: item?.publisher || site,
|
||||||
|
publishedDate: item?.datePublished
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new Error(`Unknown search engine ${searchEngine}`);
|
throw new Error(`Unknown search engine ${searchEngine}`);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user