← back to Eur Recrawl
login-osbtrade.mjs
36 lines
// login-osbtrade.mjs — direct login to the Osborne trade portal (tradenew.osborneandlittle.com).
// Fields: #username / #password / Login. Creds from /tmp/osb-creds.txt (user\npass).
import { chromium, webkit } from 'playwright';
import fs from 'node:fs';
import path from 'node:path';
const [user, pass] = fs.readFileSync('/tmp/osb-creds.txt', 'utf8').trim().split('\n');
const ENGINE = (process.env.ENGINE || 'chrome').toLowerCase();
const drv = ENGINE === 'webkit' ? webkit : chromium;
const opts = { headless: false, viewport: { width: 1440, height: 900 } };
if (ENGINE === 'chrome') opts.channel = 'chrome';
const ctx = await drv.launchPersistentContext(path.join(process.cwd(), '.auth', 'osbtrade'), opts);
const page = ctx.pages()[0] || await ctx.newPage();
await page.goto('https://tradenew.osborneandlittle.com/', { waitUntil: 'domcontentloaded', timeout: 60000 }).catch((e) => console.log('nav', e.message));
await page.waitForTimeout(3000);
console.log('login page:', (await page.title().catch(() => '')).slice(0, 45), '@', page.url());
await page.fill('#username', user, { timeout: 10000 }).then(() => console.log('username filled')).catch((e) => console.log('user:', e.message.slice(0, 40)));
await page.fill('#password', pass, { timeout: 10000 }).then(() => console.log('password filled')).catch((e) => console.log('pass:', e.message.slice(0, 40)));
const btn = await page.$('button[type=submit], button:has-text("Login")');
if (btn) { await btn.click({ timeout: 8000 }).catch(() => {}); console.log('Login clicked'); } else { await page.press('#password', 'Enter').catch(() => {}); }
await page.waitForTimeout(7000);
const info = await page.evaluate(() => {
const t = document.body ? document.body.innerText : '';
return { url: location.href, title: document.title, err: /invalid|incorrect|not recognised|not found|failed|error|try again/i.test(t), loggedIn: /log ?out|log ?off|sign ?out|my account|basket|pricelist|price list|catalogue|welcome/i.test(t), sample: t.replace(/\s+/g, ' ').slice(0, 220) };
}).catch(() => ({ url: page.url(), title: '', err: false, loggedIn: false, sample: '(eval failed)' }));
console.log('post-login url:', info.url, '| title:', info.title.slice(0, 45));
console.log('loggedIn~', info.loggedIn, '| err~', info.err);
console.log('sample:', info.sample);
if (info.loggedIn && !info.err) { await ctx.storageState({ path: path.join(process.cwd(), '.auth', 'osbtrade-state.json') }).catch(() => {}); console.log('✅ session saved -> .auth/osbtrade-state.json'); }
await page.screenshot({ path: 'probe-osbtrade.png' }).catch(() => {});
await page.waitForTimeout(1500);
await ctx.close();