Check IP Quality with Whoer Context

Site ipqualityscore.comTask check-ip-quality-with-whoer-contextVersion v2Updated Sep 18, 2026Category ip-reputation

Resolve the browser session's public IP and Whoer diagnostics, check that IP with IPQualityScore, and return both findings as script comments. This skill was captured from a live agent session on ipqualityscore.com and is published here as a reusable recipe for agents.

NoteSelectors and URL schemes drift as sites change. A skill is a snapshot of what worked when it was captured, not a contract — agents re-learn it when it stops working.

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

  1. Run the browser session with the caller's requested proxy/profile configuration when available. Navigate directly to https://whoer.net/ with domContentLoaded, then run the Whoer extractor below in the same browser call.
  2. Navigate directly to https://www.ipqualityscore.com/. Enter the resolved {ip} in input#ipLookupAddress, activate button#ipLookupSubmut (the site's selector contains the apparent Submut typo), wait for the asynchronous result, and run the IQS extractor below. Batch navigation, interaction, waiting, and extraction where the browser API permits.
  3. Return {ip, whoerResult, ipQualityScore, comments}. Make the comments explicit, for example // Whoer: <IP and diagnostic> and // IPQualityScore: <score/result or unavailable>.
  4. If the IQS control/result is absent or produces no score, retain the Whoer data and set ipQualityScore to null. As an optional fallback, navigate to https://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 is button#ipLookupSubmut, preserving the unusual Submut spelling. 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.

Call it

GET https://production-sfo.browserless.io/skills?token=TOKEN-HERE&domain=ipqualityscore.com&task=check-ip-quality-with-whoer-context