// wariant: pełny html dump odpowiedzi
const puppeteer = require('C:/xampp/htdocs/vilmax/vilmax-cockpit/node_modules/puppeteer');
const fs = require('fs');
const [,, sqlFile, outFile] = process.argv;
const sql = fs.readFileSync(sqlFile, 'utf8');
(async () => {
const browser = await puppeteer.launch({ headless: 'new', args: ['--ignore-certificate-errors'] });
const page = await browser.newPage();
await page.setCookie({ name: 'PLESKSESSID', value: 'c0f91372744e1522655b681ff15a5f10', domain: 'bazarowy-swiat.pl', path: '/' });
await page.goto('https://bazarowy-swiat.pl:8443/smb/database/list/domainId/581', { waitUntil: 'networkidle2', timeout: 90000 });
await new Promise(r => setTimeout(r, 5000));
await page.evaluate(() => {
const rows = [...document.querySelectorAll('tr.pul-list__row--expandable')];
rows.find(r => r.innerText.includes('wordpress_8')).querySelector('.pul-list__row-expander').click();
});
await new Promise(r => setTimeout(r, 3000));
const newPage = new Promise(res => browser.once('targetcreated', t => res(t.page())));
await page.evaluate(() => {
const el = [...document.querySelectorAll('.pul-media__header')].find(e => e.innerText.trim() === 'phpMyAdmin');
let p = el; while (p && p.tagName !== 'A' && !p.onclick) p = p.parentElement;
(p || el).click();
});
const pma = await newPage;
await new Promise(r => setTimeout(r, 8000));
const r = await pma.evaluate(async (q) => {
const tok = (document.querySelector('input[name=token]') || {}).value
|| (document.documentElement.innerHTML.match(/"token":"([a-f0-9]+)"/) || [])[1];
const fd = new URLSearchParams();
fd.set('token', tok); fd.set('sql_query', q); fd.set('db', 'wordpress_8'); fd.set('ajax_request', 'true');
const resp = await fetch('index.php?route=/sql', { method: 'POST', body: fd, credentials: 'include' });
return await resp.text();
}, sql);
fs.writeFileSync(outFile, r);
console.log('saved', r.length, 'chars ->', outFile);
await browser.close();
})().catch(e => console.error('ERR', e.message));