← back to Norma
agents/instagram-agent/probe-unlinked.js
43 lines
#!/usr/bin/env node
/* Probe the link-state of the owned-but-unenrolled accounts found in email.
* Reuses build-registry's token resolver; token stays in memory, never printed. */
const fs = require('fs');
const path = require('path');
const os = require('os');
const GRAPH = process.env.IG_GRAPH_HOST || 'https://graph.facebook.com';
const V = process.env.IG_GRAPH_VERSION || 'v21.0';
function token() {
if (process.env.META_ACCESS_TOKEN) return process.env.META_ACCESS_TOKEN;
try {
const p = path.join(os.homedir(), 'Projects/secrets-manager/.env');
const line = fs.readFileSync(p, 'utf8').split('\n').find((l) => l.startsWith('META_ACCESS_TOKEN='));
if (line) return line.slice('META_ACCESS_TOKEN='.length).trim();
} catch {}
return '';
}
const NEEDLES = ['beverly', 'filthy', 'protest', 'paperhanger', 'paper hanger', 'designers chat', 'designerschat', 'hospitality fabric', 'dsgn'];
(async () => {
const t = token();
if (!t) { console.error('no token'); process.exit(1); }
let url = `${GRAPH}/${V}/me/accounts?fields=name,instagram_business_account{username},connected_instagram_account{username}&limit=100&access_token=${encodeURIComponent(t)}`;
const pages = [];
while (url) {
const r = await fetch(url); const j = await r.json();
if (j.error) { console.error('ERR', j.error.message); process.exit(1); }
pages.push(...(j.data || []));
url = j.paging && j.paging.next ? j.paging.next : null;
}
console.log('pages on token:', pages.length);
const hit = pages.filter((p) => NEEDLES.some((n) => (p.name || '').toLowerCase().includes(n)));
console.log('=== matching Pages ===');
for (const p of hit) {
const ig = p.instagram_business_account && p.instagram_business_account.username;
const ci = p.connected_instagram_account && p.connected_instagram_account.username;
console.log(`- "${p.name}" | ig_business=${ig || '—'} | connected=${ci || '—'}`);
}
if (!hit.length) console.log('(no Page names match — these accounts have NO Page on this token)');
})();