Spaces:
Sleeping
Sleeping
const Fastify = require('fastify'); | |
const fs = require('fs'); | |
const { chromium } = require('playwright-extra'); | |
const stealth = require('puppeteer-extra-plugin-stealth')(); | |
chromium.use(stealth); | |
const configFile = fs.readFileSync(__dirname + '/config.json', 'utf8'); | |
const configData = JSON.parse(configFile); | |
const fastify = Fastify(); | |
const PORT = 7860; | |
fastify.get('/', async (request, reply) => { | |
return reply.send({ message: 'Fastify Playwright API is running' }); | |
}); | |
fastify.post('/search', async (request, reply) => { | |
const { searchText } = request.body; | |
const url = 'https://chat.deepseek.com'; | |
const buttonSubmit = '.f6d670'; | |
const textareaSearchBox = '#chat-input'; | |
const textMessage = '.ds-markdown'; | |
const profileButton = '.d65532b2'; | |
const deleteAllButton = '.ds-dropdown-menu-option__label:has-text("Delete all chats")'; | |
const confirmDeleteButton = '.ds-button:has-text("Confirm deletion")'; | |
const totalLoopCount = 60; | |
const printIntervalTime = 1000; | |
console.log('[INFO] Launching browser...'); | |
const browser = await chromium.launch({ headless: true, slowMo: 100 }); // Headed mode for debugging | |
const context = await browser.newContext({ userAgent: configData.userAgent }); | |
console.log('[INFO] Setting cookies...'); | |
await context.addCookies([{ | |
'name': 'cf_clearance', | |
'value': configData.cfClearance, | |
'domain': '.deepseek.com', | |
'path': '/', | |
'httpOnly': true, | |
'secure': true | |
}]); | |
const page = await context.newPage(); | |
console.log(`[INFO] Navigating to ${url}...`); | |
await page.goto(url, { waitUntil: 'load', timeout: 60000 }); | |
console.log('[INFO] Setting localStorage...'); | |
await page.evaluate(userToken => { | |
localStorage.setItem('searchEnabled', 'false'); | |
localStorage.setItem('userToken', `{"value":"${userToken}","__version":"0"}`); | |
}, configData.userToken); | |
console.log('[INFO] Reloading page after setting localStorage...'); | |
await page.goto(url, { waitUntil: 'load' }); | |
console.log('[INFO] Waiting for search input...'); | |
try { | |
await page.waitForSelector(textareaSearchBox, { timeout: 60000, state: 'visible' }); | |
} catch (error) { | |
console.error('[ERROR] Search input not found. Exiting.'); | |
await browser.close(); | |
return reply.send({ error: 'Search input not found!' }); | |
} | |
console.log('[INFO] Typing search text...'); | |
await page.fill(textareaSearchBox, searchText); | |
await page.click(buttonSubmit); | |
let prevResult = ''; | |
console.log('[INFO] Waiting for response...'); | |
for (let i = 0; i < totalLoopCount; i++) { | |
await new Promise(resolve => setTimeout(resolve, printIntervalTime)); | |
const result = await page.locator(textMessage).innerText().catch(() => null); | |
if (result) { | |
console.log(`[INFO] Response received: ${result.slice(0, 50)}...`); | |
if (prevResult === result && i !== totalLoopCount - 1) break; | |
prevResult = result; | |
} | |
} | |
console.log('[INFO] Deleting previous chats...'); | |
await page.click(profileButton); | |
await page.click(deleteAllButton); | |
await page.click(confirmDeleteButton); | |
console.log('[INFO] Closing browser...'); | |
await browser.close(); | |
return reply.send({ response: prevResult }); | |
}); | |
fastify.listen({ port: PORT, host: '0.0.0.0' }, (err, address) => { | |
if (err) throw err; | |
console.log(`Server running at ${address}`); | |
}); | |