iask / iask.js
processed's picture
Create iask.js
3c9a18e verified
const { run } = require('shannz-playwright');
async function iask(query) {
const code = `const { chromium } = require('playwright');
async function iask(query) {
const browser = await chromium.launch();
const page = await browser.newPage();
try {
await page.goto(\`https://iask.ai/?mode=question&q=\${query}\`);
await page.waitForSelector('.mt-6.md\\\\:mt-4.w-full.p-px.relative.self-center.flex.flex-col.items-center.results-followup', { timeout: 0 });
const outputDiv = await page.$('#output');
if (!outputDiv) {
return { image: [], answer: null, sources: [], videoSource: [], webSearch: [] };
}
const answerElement = await outputDiv.$('#text');
const answerText = await answerElement.evaluate(el => el.innerText);
const [answer, sourcesText] = answerText.split('Top 3 Authoritative Sources Used in Answering this Question');
const cleanedAnswer = answer.replace(/According to Ask AI & Question AI www\\.iAsk\\.ai:\\s*/, '').trim();
const sources = sourcesText ? sourcesText.split('\\n').filter(source => source.trim() !== '') : [];
const imageElements = await outputDiv.$$('img');
const images = await Promise.all(imageElements.map(async (img) => {
return await img.evaluate(img => img.src);
}));
const videoSourceDiv = await page.$('#related-videos');
const videoSources = [];
if (videoSourceDiv) {
const videoElements = await videoSourceDiv.$$('a');
for (const videoElement of videoElements) {
const videoLink = await videoElement.evaluate(el => el.href);
const videoTitle = await videoElement.$eval('h3', el => el.innerText).catch(() => 'No title found');
const videoThumbnail = await videoElement.$eval('img', el => el.src).catch(() => 'No thumbnail found');
if (videoTitle !== 'No title found' && videoThumbnail !== 'No thumbnail found') {
videoSources.push({ title: videoTitle, link: videoLink, thumbnail: videoThumbnail });
}
}
}
const webSearchDiv = await page.$('#related-links');
const webSearchResults = [];
if (webSearchDiv) {
const linkElements = await webSearchDiv.$$('a');
for (const linkElement of linkElements) {
const linkUrl = await linkElement.evaluate(el => el.href);
const linkTitle = await linkElement.evaluate(el => el.innerText);
const linkImage = await linkElement.$eval('img', el => el.src).catch(() => 'No image found');
const linkDescription = await linkElement.evaluate(el => el.nextElementSibling.innerText).catch(() => 'No description found');
if (linkTitle && linkUrl) {
webSearchResults.push({
title: linkTitle,
link: linkUrl,
image: linkImage,
description: linkDescription
});
}
}
}
const src = sources.map(source => source.trim());
const result = { image: images, answer: cleanedAnswer, sources: src, videoSource: videoSources, webSearch: webSearchResults };
return JSON.stringify(result, null, 2);
} catch (error) {
console.error('Error fetching data:', error);
return { image: [], answer: null, sources: [], videoSource: [], webSearch: [] };
} finally {
await browser.close();
}
}
iask(\`${query}\`).then(a => console.log(a));`;
const start = await run('javascript', code);
const string = start.result.output;
return JSON.parse(string);
}
module.exports = { iask };