| 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 }; |