const puppeteer = require('C:/xampp/htdocs/vilmax/vilmax-cockpit/node_modules/puppeteer'); const fs = require('fs'); const [,, postId, metaKey, outFile] = process.argv; (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 sql = `WITH RECURSIVE cte(n) AS (SELECT 0 UNION ALL SELECT n+1 FROM cte WHERE n<2000) SELECT SUBSTRING(HEX(meta_value), n*50+1, 50) AS c FROM wp_postmeta, cte WHERE post_id=${postId} AND meta_key='${metaKey}' AND SUBSTRING(HEX(meta_value), n*50+1, 50) != ''`; 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); const j = JSON.parse(r); // parsowanie poza evaluate fs.writeFileSync(outFile + '.raw', j.message || ''); const cells = [...(j.message||'').matchAll(/class="data[^"]*"[^>]*>([^<]*) m[1]); const hex = cells.join('').replace(/[^0-9a-fA-F]/g, ''); fs.writeFileSync(outFile, Buffer.from(hex, 'hex')); console.log('rows:', cells.length, 'bytes:', hex.length / 2, '->', outFile); await browser.close(); })().catch(e => console.error('ERR', e.message));