Obtain the public IP visible to the current browser session, preserve the relevant Whoer diagnostic text, check the same IP with IPQualityScore, and format both results as script-ready comments. The browser session may be configured externally with a proxy or stealth profile; do not infer or invent those settings from page content.
Use Cases
Use when a script or report needs the active browser/proxy public IP, Whoer context, and an IPQualityScore fraud or reputation result. If IPQualityScore cannot produce a result, optionally perform a separate fallback lookup and label it clearly rather than presenting it as an IPQualityScore score.
Automation Flow
- Run the browser session with the caller's requested proxy/profile configuration when available. Navigate directly to
https://whoer.net/withdomContentLoaded, then run the Whoer extractor below in the same browser call. - Navigate directly to
https://www.ipqualityscore.com/. Enter the resolved{ip}ininput#ipLookupAddress, activatebutton#ipLookupSubmut(the site's selector contains the apparentSubmuttypo), wait for the asynchronous result, and run the IQS extractor below. Batch navigation, interaction, waiting, and extraction where the browser API permits. - Return
{ip, whoerResult, ipQualityScore, comments}. Make the comments explicit, for example// Whoer: <IP and diagnostic>and// IPQualityScore: <score/result or unavailable>. - If the IQS control/result is absent or produces no score, retain the Whoer data and set
ipQualityScoretonull. As an optional fallback, navigate tohttps://www.spamhaus.org/search/?q={encodeURIComponent(ip)}, extract the visible result text, and label it as a Spamhaus lookup—not an IPQualityScore score.
Run this self-contained extractor on the loaded Whoer page:
(() => {
const text = document.body.innerText || '';
const valid = ip => ip.split('.').every(n => Number(n) <= 255);
const all = [...new Set(text.match(/\b(?:\d{1,3}\.){3}\d{1,3}\b/g) || [])].filter(valid);
const marker = text.search(/my\s+ip/i);
const area = marker >= 0 ? text.slice(marker, marker + 2500) : text.slice(0, 2500);
const nearby = [...new Set(area.match(/\b(?:\d{1,3}\.){3}\d{1,3}\b/g) || [])].filter(valid);
return { ip: nearby[0] || all[0] || null, ips: all, whoerResult: area.trim() };
})()After the IQS lookup has completed, run this self-contained extractor on the IQS page:
(() => {
const text = (document.body.innerText || '').replace(/\u00a0/g, ' ').replace(/[ \t]+/g, ' ').trim();
const first = re => { const m = text.match(re); return m ? m[1].trim() : null; };
const nodes = [...document.querySelectorAll('[data-testid*="score" i], [id*="score" i], [class*="score" i]')];
const scoreNodes = nodes.map(n => (n.innerText || n.textContent || '').replace(/\s+/g, ' ').trim()).filter(Boolean);
const labeled = text.match(/(?:fraud\s*score|risk\s*score|ip\s*reputation|score)\s*[:\-]?\s*(\d{1,3})(?:\s*(?:\/\s*100|out of 100))?/i);
const ip = first(/\b((?:\d{1,3}\.){3}\d{1,3})\b/);
const fraudScore = first(/fraud\s*score\s*[:\-]?\s*(\d{1,3})/i);
const riskScore = first(/(?:risk|ip)\s*score\s*[:\-]?\s*(\d{1,3})/i);
const score = labeled ? Number(labeled[1]) : null;
const resultText = scoreNodes.join(' | ') || (labeled ? text.slice(Math.max(0, labeled.index - 300), labeled.index + 500).trim() : null);
const rows = [...document.querySelectorAll('tr')].map(r => [...r.querySelectorAll('th,td')].map(c => c.textContent.replace(/\s+/g, ' ').trim()).filter(Boolean)).filter(r => r.length);
return { ip, score, fraudScore, riskScore, proxy: first(/proxy\s*[:\-]?\s*(yes|no|true|false)/i), vpn: first(/vpn\s*[:\-]?\s*(yes|no|true|false)/i), tor: first(/tor\s*[:\-]?\s*(yes|no|true|false)/i), resultText, rows, pageText: text.slice(0, 5000) };
})()Possible Friction Points
- Whoer can show several IPv4 addresses in page text. Prefer an address in the region beginning at
My IP, retain the complete list for verification, and do not blindly trust unrelated page content. - IPQualityScore's observed lookup field is
input#ipLookupAddress; its submit selector isbutton#ipLookupSubmut, preserving the unusualSubmutspelling. Check that both elements exist before interacting. - IPQualityScore results populate asynchronously; wait after submission before extracting.
- The public IP visible to Whoer can differ from other page values when a proxy, VPN, privacy relay, or browser configuration is active. Report observations rather than assuming the cause.
- Do not interpret an arbitrary number as a score. Prefer labeled score text, score-related nodes, or result rows; a missing score is
null, not evidence of a clean IP. - Keep fallback results separate and explicitly labeled; Spamhaus availability or reputation text is not an IPQualityScore fraud score.