// usage: node pma_q.cjs "SQL QUERY" — wykonuje SQL w wordpress_8 przez phpMyAdmin (sesja Plesk) const puppeteer = require('C:/xampp/htdocs/vilmax/vilmax-cockpit/node_modules/puppeteer'); const sql = process.argv[2]; (async () => { const browser = await puppeteer.launch({ headless: 'new', args: ['--ignore-certificate-errors'] }); const page = await browser.newPage(); await page.setCookie({ name: 'PLESKSESSID', value: '868218dee515d3123c2ff3bb3d7a9a79', 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 res = 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 r = await fetch('index.php?route=/sql', { method: 'POST', body: fd, credentials: 'include' }); const j = await r.json(); const d = document.createElement('div'); d.innerHTML = j.message || ''; const cells = [...d.querySelectorAll('td')].map(t => t.innerText.trim()).filter(Boolean); const notices = d.innerText.match(/(\d+ rows? affected|\d+ wiersz|\d+ rekord|error|błąd)/gi) || []; return { success: j.success, cells: cells.slice(0, 80), notices: notices.slice(0, 5), err: j.error || '' }; }, sql); console.log(JSON.stringify(res, null, 1)); await browser.close(); })().catch(e => console.error('ERR', e.message));