126 lines
3.5 KiB
JavaScript
Executable File
126 lines
3.5 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
/**
|
|
* Reonomy Quick Demo - Single contact extraction
|
|
* Shows the full flow in ~60 seconds
|
|
*
|
|
* Usage: node reonomy-quick-demo.js
|
|
* Or: buba reonomy demo
|
|
*/
|
|
|
|
const { execSync } = require('child_process');
|
|
|
|
const EMAIL = process.env.REONOMY_EMAIL || 'henry@realestateenhanced.com';
|
|
const PASSWORD = process.env.REONOMY_PASSWORD || '9082166532';
|
|
const SEARCH_ID = process.env.REONOMY_SEARCH_ID || 'bacfd104-fed5-4cc4-aba1-933f899de3f8';
|
|
|
|
function ab(cmd) {
|
|
console.log(` → ${cmd}`);
|
|
try {
|
|
return execSync(`agent-browser ${cmd}`, { encoding: 'utf8', timeout: 30000 }).trim();
|
|
} catch (e) {
|
|
console.log(` ⚠️ ${e.message.substring(0, 50)}`);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function wait(ms) {
|
|
return new Promise(r => setTimeout(r, ms));
|
|
}
|
|
|
|
async function demo() {
|
|
console.log('\n🎯 REONOMY CONTACT EXTRACTION DEMO');
|
|
console.log('===================================\n');
|
|
|
|
// Login
|
|
console.log('📍 Step 1: Login');
|
|
ab('open "https://app.reonomy.com/#!/login" --headed');
|
|
await wait(4000);
|
|
ab(`fill @e2 "${EMAIL}"`);
|
|
await wait(500);
|
|
ab(`fill @e3 "${PASSWORD}"`);
|
|
await wait(500);
|
|
ab('click @e5');
|
|
console.log(' ⏳ Logging in...');
|
|
await wait(12000);
|
|
|
|
// Search
|
|
console.log('\n📍 Step 2: Load filtered search');
|
|
ab(`open "https://app.reonomy.com/#!/search/${SEARCH_ID}"`);
|
|
await wait(8000);
|
|
|
|
// Click property
|
|
console.log('\n📍 Step 3: Select property');
|
|
const snap1 = ab('snapshot -i');
|
|
const propMatch = snap1?.match(/button "(\d+[^"]+)" \[ref=(e\d+)\]/);
|
|
if (propMatch) {
|
|
console.log(` Property: ${propMatch[1].substring(0, 50)}...`);
|
|
ab(`click @${propMatch[2]}`);
|
|
} else {
|
|
ab('click @e8');
|
|
}
|
|
await wait(6000);
|
|
|
|
// Owner tab
|
|
console.log('\n📍 Step 4: Owner tab');
|
|
ab('find role tab click --name "Owner"');
|
|
await wait(5000);
|
|
|
|
// View Contacts
|
|
console.log('\n📍 Step 5: View Contacts');
|
|
const snap2 = ab('snapshot -i');
|
|
const vcMatch = snap2?.match(/button "View Contacts[^"]*" \[ref=(e\d+)\]/);
|
|
if (vcMatch) {
|
|
ab(`click @${vcMatch[1]}`);
|
|
await wait(5000);
|
|
}
|
|
|
|
// Find person
|
|
console.log('\n📍 Step 6: Navigate to person');
|
|
const snap3 = ab('snapshot');
|
|
const personMatch = snap3?.match(/\/url: \/!\/person\/([a-f0-9-]+)/);
|
|
if (personMatch) {
|
|
ab(`open "https://app.reonomy.com/!/person/${personMatch[1]}"`);
|
|
await wait(6000);
|
|
}
|
|
|
|
// Click Contact
|
|
console.log('\n📍 Step 7: Open contact modal');
|
|
const snap4 = ab('snapshot -i');
|
|
const contactMatch = snap4?.match(/button "Contact" \[ref=(e\d+)\]/);
|
|
if (contactMatch) {
|
|
ab(`click @${contactMatch[1]}`);
|
|
await wait(3000);
|
|
}
|
|
|
|
// Extract
|
|
console.log('\n📍 Step 8: EXTRACT CONTACTS');
|
|
const snap5 = ab('snapshot -i');
|
|
|
|
console.log('\n🎉 CONTACTS FOUND:');
|
|
console.log('==================');
|
|
|
|
// Phones
|
|
const phones = snap5?.matchAll(/button "(\d{3}-\d{3}-\d{4})\s+([^"]+)"/g) || [];
|
|
for (const p of phones) {
|
|
console.log(` 📞 ${p[1]} (${p[2].substring(0, 30)})`);
|
|
}
|
|
|
|
// Emails
|
|
const emails = snap5?.matchAll(/button "([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})"/g) || [];
|
|
for (const e of emails) {
|
|
console.log(` 📧 ${e[1]}`);
|
|
}
|
|
|
|
// Screenshot
|
|
ab('screenshot /tmp/reonomy-demo-final.png');
|
|
console.log('\n📸 Screenshot: /tmp/reonomy-demo-final.png');
|
|
|
|
console.log('\n✅ Demo complete! Browser left open.');
|
|
console.log(' Run: agent-browser close');
|
|
}
|
|
|
|
demo().catch(e => {
|
|
console.error('Demo failed:', e.message);
|
|
process.exit(1);
|
|
});
|