← back to Hollywood Import
Innovations: login cracked + 24 priced
17719889ada0170c64140e6f46b93e3b6bfbd03f · 2026-06-17 16:15:44 -0700 · SteveStudio2
- innov-recon.mjs: Innovations trade login (Laravel+recaptchaV3); creds in gitignored .env
- resolved ARP-*→Arpora ($33.95), ILL-*→Illusion ($104.95) via authed search
- priced all 24 hollywood/innovations: list, retail=list×1.448, cost=list×0.90 (10% disc)
- stored trade login in vendor_registry.innovations (Steve-confirmed)
Files touched
M .gitignoreA apply-innov.sqlA innov-login.pngA innov-price-crawl.mjsA innov-price.mjsA innov-prices-staged.jsonA innov-recon-out.jsonA innov-recon.mjs
Diff
commit 17719889ada0170c64140e6f46b93e3b6bfbd03f
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date: Wed Jun 17 16:15:44 2026 -0700
Innovations: login cracked + 24 priced
- innov-recon.mjs: Innovations trade login (Laravel+recaptchaV3); creds in gitignored .env
- resolved ARP-*→Arpora ($33.95), ILL-*→Illusion ($104.95) via authed search
- priced all 24 hollywood/innovations: list, retail=list×1.448, cost=list×0.90 (10% disc)
- stored trade login in vendor_registry.innovations (Steve-confirmed)
---
.gitignore | 2 +
apply-innov.sql | 26 ++++++
innov-login.png | Bin 0 -> 78409 bytes
innov-price-crawl.mjs | 44 ++++++++++
innov-price.mjs | 24 ++++++
innov-prices-staged.json | 219 +++++++++++++++++++++++++++++++++++++++++++++++
innov-recon-out.json | 15 ++++
innov-recon.mjs | 45 ++++++++++
8 files changed, 375 insertions(+)
diff --git a/.gitignore b/.gitignore
index 6aa26c2..168d691 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,5 @@ products-authed.html
recon-login.png
crawl.log
node_modules
+innov-auth.json
+innov-prices.json
diff --git a/apply-innov.sql b/apply-innov.sql
new file mode 100644
index 0000000..bf585ae
--- /dev/null
+++ b/apply-innov.sql
@@ -0,0 +1,26 @@
+BEGIN;
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034984 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034967 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034969 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034970 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034971 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034972 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034974 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034975 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034976 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034977 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034978 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034979 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034980 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034981 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034983 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035933 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035934 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035935 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035937 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035940 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"33.95"'),'{hw_price}','"49.16"'),'{retail_price}','"49.16"'),'{cost}','"30.56"') WHERE id=2034982 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035938 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035936 AND vendor_code='hollywood';
+UPDATE vendor_catalog SET specs=jsonb_set(jsonb_set(jsonb_set(jsonb_set(coalesce(specs,'{}'::jsonb),'{list_price}','"104.95"'),'{hw_price}','"151.97"'),'{retail_price}','"151.97"'),'{cost}','"94.46"') WHERE id=2035939 AND vendor_code='hollywood';
+COMMIT;
diff --git a/innov-login.png b/innov-login.png
new file mode 100644
index 0000000..7da2214
Binary files /dev/null and b/innov-login.png differ
diff --git a/innov-price-crawl.mjs b/innov-price-crawl.mjs
new file mode 100644
index 0000000..b8a4967
--- /dev/null
+++ b/innov-price-crawl.mjs
@@ -0,0 +1,44 @@
+// Innovations authed price crawl for our 2 DB-only patterns (Anjuna, Faux Glass Bead).
+// Read-only on the vendor + local stage only (NO Shopify/canonical push — gated).
+// Uses the saved innov-auth.json session (no re-login). Sequential + throttled.
+import { chromium } from 'playwright';
+import fs from 'node:fs';
+
+const BASE = 'https://www.innovationsusa.com';
+const TERMS = ['anjuna', 'faux glass bead', 'glass bead', 'textured vinyl'];
+const sleep = (ms) => new Promise(r => setTimeout(r, ms));
+
+const browser = await chromium.launch({ channel: 'chrome', headless: true });
+const ctx = await browser.newContext({ storageState: './innov-auth.json', viewport: { width: 1400, height: 1000 } });
+const page = await ctx.newPage();
+
+const seen = new Set();
+const out = { ranAt: new Date().toISOString(), perTerm: [], items: [] };
+
+for (const q of TERMS) {
+ const url = `${BASE}/search/${encodeURIComponent(q)}`;
+ const resp = await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 }).catch(() => null);
+ await sleep(2500);
+ const links = await page.evaluate(() =>
+ [...document.querySelectorAll('a[href*="/item/"]')].map(a => a.getAttribute('href'))
+ .filter((v, i, a) => a.indexOf(v) === i).slice(0, 12));
+ out.perTerm.push({ term: q, status: resp ? resp.status() : null, found: links.length, links });
+ for (const href of links) {
+ const u = href.startsWith('http') ? href : BASE + href;
+ if (seen.has(u)) continue; seen.add(u);
+ await page.goto(u, { waitUntil: 'domcontentloaded', timeout: 30000 }).catch(() => {});
+ await sleep(1800);
+ const r = await page.evaluate(() => {
+ const t = document.body.innerText;
+ const h1 = (document.querySelector('h1,h2')?.innerText || '').trim();
+ const prices = [...t.matchAll(/\$\s?\d[\d,]*\.\d{2}\s*(\/\s*(yard|yd|roll|sq|panel|each))?/gi)].map(m => m[0].trim()).slice(0, 6);
+ return { title: h1, prices, hasPrice: /\$\d/.test(t) };
+ });
+ out.items.push({ url: u, title: r.title, prices: r.prices });
+ console.log(` ${u.replace(BASE, '')} → ${r.title} → ${JSON.stringify(r.prices)}`);
+ }
+}
+
+fs.writeFileSync(new URL('innov-prices-staged.json', import.meta.url), JSON.stringify(out, null, 2));
+console.log(`\nTERMS:${TERMS.length} item-pages:${out.items.length} priced:${out.items.filter(i => i.prices.length).length}`);
+await browser.close();
diff --git a/innov-price.mjs b/innov-price.mjs
new file mode 100644
index 0000000..060ad09
--- /dev/null
+++ b/innov-price.mjs
@@ -0,0 +1,24 @@
+import { chromium } from 'playwright';
+import fs from 'node:fs';
+const items=JSON.parse(fs.readFileSync('/tmp/inn24.json','utf8'));
+const b=await chromium.launch({channel:'chrome',headless:true});
+const p=await (await b.newContext({storageState:'./innov-auth.json',viewport:{width:1400,height:1000}})).newPage();
+const getPrice=async(url)=>{const r=await p.goto(url,{waitUntil:'domcontentloaded',timeout:30000}).catch(()=>null);
+ if(!r||r.status()>=400)return null; await p.waitForTimeout(1500);
+ return p.evaluate(()=>{const m=document.body.innerText.match(/\$\s?([\d,]+\.\d{2})\s*(\/\s*(yard|yd|roll|panel|sq))?/i);const t404=/not found|404/i.test(document.title);return t404?null:(m?{price:m[1],unit:m[2]||''}:null);});};
+const out=[];
+for(const it of items){
+ const sku=it.col3.toLowerCase().replace(/\s.*$/,'').replace(/[^a-z0-9-]/g,'');
+ // ARP- -> arpora ; ILL- -> try illusion (ils) variants
+ const cands=[];
+ if(/^arp-/.test(sku)) cands.push(`https://www.innovationsusa.com/item/arpora/${sku}`);
+ if(/^ill-/.test(sku)){ cands.push(`https://www.innovationsusa.com/item/illusion/${sku}`); cands.push(`https://www.innovationsusa.com/item/illusion/${sku.replace('ill-','ils-')}`); }
+ cands.push(`https://www.innovationsusa.com/item/arpora/${sku}`);
+ let res=null,used=null;
+ for(const u of cands){ res=await getPrice(u); if(res){used=u;break;} }
+ out.push({...it,sku,price:res?.price||null,unit:res?.unit||null,url:used});
+ console.log(`${it.mfr} [${it.col3}] → ${res?('$'+res.price+(res.unit?' '+res.unit:'')+' '+used.replace('https://www.innovationsusa.com','')):'NO PRICE / 404'}`);
+}
+fs.writeFileSync('innov-prices.json',JSON.stringify(out,null,2));
+console.log('priced:',out.filter(x=>x.price).length,'/',out.length);
+await b.close();
diff --git a/innov-prices-staged.json b/innov-prices-staged.json
new file mode 100644
index 0000000..425ec09
--- /dev/null
+++ b/innov-prices-staged.json
@@ -0,0 +1,219 @@
+{
+ "ranAt": "2026-06-17T23:14:02.026Z",
+ "perTerm": [
+ {
+ "term": "anjuna",
+ "status": 200,
+ "found": 1,
+ "links": [
+ "https://www.innovationsusa.com/item/coast/coa-001"
+ ]
+ },
+ {
+ "term": "faux glass bead",
+ "status": 200,
+ "found": 12,
+ "links": [
+ "https://www.innovationsusa.com/item/alentejo/aln-006",
+ "https://www.innovationsusa.com/item/arpora/arp-013",
+ "https://www.innovationsusa.com/item/lille/lil-002",
+ "https://www.innovationsusa.com/item/reed/ree-09",
+ "https://www.innovationsusa.com/item/rangoon-silk/rs8493",
+ "https://www.innovationsusa.com/item/labyrinth-plus/lby-001p",
+ "https://www.innovationsusa.com/item/pebble/peb-001",
+ "https://www.innovationsusa.com/item/tide/tid-01",
+ "https://www.innovationsusa.com/item/macau/24004",
+ "https://www.innovationsusa.com/item/macau/24007",
+ "https://www.innovationsusa.com/item/macau/24020",
+ "https://www.innovationsusa.com/item/macau/24022"
+ ]
+ },
+ {
+ "term": "glass bead",
+ "status": 200,
+ "found": 8,
+ "links": [
+ "https://www.innovationsusa.com/item/reed/ree-09",
+ "https://www.innovationsusa.com/item/arpora/arp-013",
+ "https://www.innovationsusa.com/item/rangoon-silk/rs8493",
+ "https://www.innovationsusa.com/item/labyrinth-plus/lby-001p",
+ "https://www.innovationsusa.com/item/pebble/peb-001",
+ "https://www.innovationsusa.com/item/tide/tid-01",
+ "https://www.innovationsusa.com/item/alentejo/aln-006",
+ "https://www.innovationsusa.com/item/lille/lil-002"
+ ]
+ },
+ {
+ "term": "textured vinyl",
+ "status": 200,
+ "found": 12,
+ "links": [
+ "https://www.innovationsusa.com/item/vinyl-cork/vco-001",
+ "https://www.innovationsusa.com/item/vinyl-cork/vco-002",
+ "https://www.innovationsusa.com/item/vinyl-cork/vco-003",
+ "https://www.innovationsusa.com/item/vinyl-cork/vco-004",
+ "https://www.innovationsusa.com/item/vinyl-cork/vco-005",
+ "https://www.innovationsusa.com/item/vinyl-cork/vco-006",
+ "https://www.innovationsusa.com/item/vinyl-cork/vco-007",
+ "https://www.innovationsusa.com/item/vinyl-cork/vco-008",
+ "https://www.innovationsusa.com/item/vinyl-cork/vco-009",
+ "https://www.innovationsusa.com/item/vinyl-cork/vco-010",
+ "https://www.innovationsusa.com/item/vinyl-cork/vco-011",
+ "https://www.innovationsusa.com/item/vinyl-cork/vco-012"
+ ]
+ }
+ ],
+ "items": [
+ {
+ "url": "https://www.innovationsusa.com/item/coast/coa-001",
+ "title": "COAST",
+ "prices": [
+ "$31.95"
+ ]
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/alentejo/aln-006",
+ "title": "ALENTEJO",
+ "prices": []
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/arpora/arp-013",
+ "title": "ARPORA",
+ "prices": [
+ "$33.95"
+ ]
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/lille/lil-002",
+ "title": "LILLE",
+ "prices": [
+ "$31.95"
+ ]
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/reed/ree-09",
+ "title": "REED",
+ "prices": [
+ "$63.95"
+ ]
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/rangoon-silk/rs8493",
+ "title": "RANGOON SILK",
+ "prices": []
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/labyrinth-plus/lby-001p",
+ "title": "LABYRINTH PLUS",
+ "prices": [
+ "$35.95"
+ ]
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/pebble/peb-001",
+ "title": "PEBBLE",
+ "prices": [
+ "$36.95"
+ ]
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/tide/tid-01",
+ "title": "TIDE",
+ "prices": []
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/macau/24004",
+ "title": "MACAU",
+ "prices": [
+ "$31.95"
+ ]
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/macau/24007",
+ "title": "MACAU",
+ "prices": []
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/macau/24020",
+ "title": "MACAU",
+ "prices": []
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/macau/24022",
+ "title": "MACAU",
+ "prices": []
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-001",
+ "title": "VINYL CORK",
+ "prices": [
+ "$49.95"
+ ]
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-002",
+ "title": "VINYL CORK",
+ "prices": []
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-003",
+ "title": "VINYL CORK",
+ "prices": [
+ "$49.95"
+ ]
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-004",
+ "title": "VINYL CORK",
+ "prices": []
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-005",
+ "title": "VINYL CORK",
+ "prices": []
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-006",
+ "title": "VINYL CORK",
+ "prices": []
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-007",
+ "title": "VINYL CORK",
+ "prices": []
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-008",
+ "title": "VINYL CORK",
+ "prices": [
+ "$49.95"
+ ]
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-009",
+ "title": "VINYL CORK",
+ "prices": []
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-010",
+ "title": "VINYL CORK",
+ "prices": [
+ "$49.95"
+ ]
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-011",
+ "title": "VINYL CORK",
+ "prices": [
+ "$49.95"
+ ]
+ },
+ {
+ "url": "https://www.innovationsusa.com/item/vinyl-cork/vco-012",
+ "title": "VINYL CORK",
+ "prices": [
+ "$49.95"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/innov-recon-out.json b/innov-recon-out.json
new file mode 100644
index 0000000..3fd1732
--- /dev/null
+++ b/innov-recon-out.json
@@ -0,0 +1,15 @@
+{
+ "loggedIn": true,
+ "notes": [
+ "filled email=1 pass=1",
+ "after login url=https://www.innovationsusa.com/home",
+ "/item/anjuna/arp-001 → {\"url\":\"https://www.innovationsusa.com/item/anjuna/arp-001\",\"status404\":true,\"prices\":[],\"hasPrice\":false}",
+ "/item/damier/dmr-01 → {\"url\":\"https://www.innovationsusa.com/item/damier/dmr-01\",\"status404\":false,\"prices\":[\"$104.95 \"],\"hasPrice\":true}"
+ ],
+ "productPrice": {
+ "url": "https://www.innovationsusa.com/item/anjuna/arp-001",
+ "status404": true,
+ "prices": [],
+ "hasPrice": false
+ }
+}
\ No newline at end of file
diff --git a/innov-recon.mjs b/innov-recon.mjs
new file mode 100644
index 0000000..54a5b82
--- /dev/null
+++ b/innov-recon.mjs
@@ -0,0 +1,45 @@
+// Innovations trade login + price recon. Uses the shared DW trade login (same as Momentum,
+// from .env). reCAPTCHA v3 → real Chrome mints token. Checks if prices unlock + dumps structure.
+import { chromium } from 'playwright';
+import fs from 'node:fs';
+const E = Object.fromEntries(fs.readFileSync(new URL('.env', import.meta.url), 'utf8')
+ .split('\n').filter(l => l && !l.startsWith('#') && l.includes('=')).map(l => { const i = l.indexOf('='); return [l.slice(0, i).trim(), l.slice(i + 1).trim()]; }));
+const USER = E.INNOVATIONS_USER, PASS = E.INNOVATIONS_PASS; // Innovations trade login (Steve-confirmed)
+const BASE = E.INNOVATIONS_BASE || 'https://www.innovationsusa.com';
+const out = { loggedIn: false, notes: [], productPrice: null };
+
+const browser = await chromium.launch({ channel: 'chrome', headless: false });
+const ctx = await browser.newContext({ viewport: { width: 1400, height: 1000 } });
+const page = await ctx.newPage();
+
+await page.goto(BASE + '/login', { waitUntil: 'domcontentloaded', timeout: 60000 });
+await page.waitForTimeout(2500);
+const fv = async (sel, val) => { const l = page.locator(sel); const n = await l.count();
+ for (let i = 0; i < n; i++) { const el = l.nth(i); if (await el.isVisible().catch(() => 0)) { await el.fill(val, { timeout: 8000 }); return 1; } } return 0; };
+const okE = await fv('#email', USER) || await fv('input[type="email"]', USER) || await fv('input[name="email"]', USER);
+const okP = await fv('#password', PASS) || await fv('input[type="password"]', PASS) || await fv('input[name="password"]', PASS);
+out.notes.push('filled email=' + okE + ' pass=' + okP);
+await page.locator('button[type="submit"]:visible, input[type="submit"]:visible').first().click({ timeout: 8000 }).catch(() => page.keyboard.press('Enter'));
+await page.waitForTimeout(7000);
+out.notes.push('after login url=' + page.url());
+// authed? look for logout / account
+out.loggedIn = await page.evaluate(() => /log\s?out|sign\s?out|my account/i.test(document.body.innerText));
+await ctx.storageState({ path: new URL('innov-auth.json', import.meta.url).pathname });
+
+// try a known product (Anjuna ARP-001) + Damier (known live) to see price
+for (const u of ['/item/anjuna/arp-001', '/item/damier/dmr-01']) {
+ await page.goto(BASE + u, { waitUntil: 'domcontentloaded', timeout: 40000 }).catch(() => {});
+ await page.waitForTimeout(3500);
+ const r = await page.evaluate(() => {
+ const t = document.body.innerText;
+ return { url: location.href, status404: /not found|404|no longer/i.test(document.title + t.slice(0, 200)),
+ prices: [...t.matchAll(/\$\s?\d[\d,]*\.?\d{0,2}\s*(\/\s*(yard|yd|roll|sq|panel|each))?/gi)].map(m => m[0]).slice(0, 8),
+ hasPrice: /\$\d/.test(t) };
+ });
+ out.productPrice = out.productPrice || r;
+ out.notes.push(u + ' → ' + JSON.stringify(r).slice(0, 200));
+}
+fs.writeFileSync(new URL('innov-recon-out.json', import.meta.url), JSON.stringify(out, null, 2));
+console.log('loggedIn:', out.loggedIn);
+out.notes.forEach(n => console.log(' -', n));
+await browser.close();
← 8538f43 Tri-Kes/Momentum batch 2: price 992 via FileMaker col3→crawl
·
back to Hollywood Import
·
Innovations-wide price reconciliation: 23 current patterns p e7dde61 →