← back to Dw Marketing Reels
harvest-colorways.cjs
59 lines
'use strict';
// Deep pass: for products where the base PDP has MULTIPLE colorways, pull the full
// colorway swatch grid (color name + swatch img + sku) so we can pick the exact colorway.
// Also retry Designers Guild Surimono PDG1062-01 via the real DG product route.
const os = require('os'), fs = require('fs');
require('dotenv').config({ path: os.homedir() + '/.claude/skills/browserbase/.env' });
const Browserbase = require('@browserbasehq/sdk').default;
const { chromium } = require('playwright-core');
const sleep = ms => new Promise(r => setTimeout(r, ms));
const targets = [
{ sku:'EUR-70328', want:'Audley', url:'https://www.osborneandlittle.com/audley_W6297-W6297.html' },
{ sku:'EUR-70402', want:'Canestra',url:'https://www.osborneandlittle.com/canestra_W6341-W6341.html' },
{ sku:'EUR-70351', want:'Chameleon',url:'https://www.osborneandlittle.com/chameleon_W6305-W6305.html' },
{ sku:'NCW4270-03',want:'Coromandel 03',url:'https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html' },
{ sku:'NCW4270-05',want:'Coromandel 05',url:'https://www.osborneandlittle.com/coromandel_NCW4270-NCW4270.html' },
{ sku:'PDG1062-01',want:'Surimono Berry',url:'https://www.designersguild.com/en-gb/wallpaper/surimono-berry-wallpaper/pdg1062-01', vendor:'DG' },
];
(async () => {
const bb = new Browserbase({ apiKey: process.env.BROWSERBASE_API_KEY });
const session = await bb.sessions.create({ projectId: process.env.BROWSERBASE_PROJECT_ID, browserSettings: { solveCaptchas: true } });
console.error('session', session.id);
const browser = await chromium.connectOverCDP(session.connectUrl);
const page = browser.contexts()[0].pages()[0] || await browser.contexts()[0].newPage();
page.setDefaultTimeout(45000);
const results = [];
for (const t of targets){
const r = { sku:t.sku, want:t.want, vendor:t.vendor||'OL', url:t.url };
try {
await page.goto(t.url, { waitUntil:'domcontentloaded' }).catch(()=>{});
await sleep(3500);
r.finalUrl = page.url(); r.title = await page.title();
// Dump ALL imgs w/ their src + nearby text; and any colorway option list
r.data = await page.evaluate(() => {
const imgs = [];
document.querySelectorAll('img').forEach(im => {
const s = im.src || im.getAttribute('data-src') || im.getAttribute('data-original') || '';
if (/media\/catalog\/product/i.test(s) && !/AVATAR|logo\/websites/i.test(s))
imgs.push({ src:s, alt:im.alt||'', title:im.title||'' });
});
// colorway option swatches (magento swatch / related colours)
const cw = [];
document.querySelectorAll('.colour, .colourway, .swatch-attribute-options a, .related-colours a, [data-role="swatch-option"], .product-item').forEach(el=>{
const a=el.querySelector('a')||el; const im=el.querySelector('img');
cw.push({ text:(el.getAttribute('aria-label')||el.title||el.innerText||'').trim().slice(0,60), href:(a&&a.href)||'', img:(im&&(im.src||im.getAttribute('data-src')))||'' });
});
return { imgs:[...new Map(imgs.map(i=>[i.src,i])).values()].slice(0,20), colorways:cw.filter(c=>c.text||c.img).slice(0,30) };
});
} catch(e){ r.error = e.message; }
console.error(`[${r.sku}] ${r.finalUrl} imgs=${(r.data&&r.data.imgs.length)||0} cw=${(r.data&&r.data.colorways.length)||0} ${r.error||''}`);
results.push(r);
}
await browser.close().catch(()=>{});
const fp = os.homedir()+'/Projects/dw-marketing-reels/harvest-colorways-results.json';
fs.writeFileSync(fp, JSON.stringify(results,null,2));
console.log(fp);
})().catch(e=>{ console.error('FATAL', e.message); process.exit(1); });