Reverse Whoxy Domain Status (OSINT)

Check if websites are online

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Reverse Whoxy Domain Status (OSINT)
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  Check if websites are online
// @author       SH3LL
// @match        https://www.whoxy.com/*
// @grant        GM_xmlhttpRequest
// @connect      *
// ==/UserScript==

(async function() {
    'use strict';

    const table = document.querySelector('table.grid.first_col_center');
    if (!table) {
        console.log('No table found on the page.');
        return;
    }

    const defaultHosterKeywords = [
        'this domain is for sale',
        'domain registered',
        'domain reserved',
        'courtesy page',
        'coming soon',
        'welcome to your new website',
        'this domain has been registered',
        'placeholder page',
        'parked domain',
        'under construction',
        'domain parking',
        'domain reserved'
    ];

    const knownProviders = [
        'godaddy.com',
        'namecheap.com',
        'bluehost.com',
        'hostgator.com',
        'dreamhost.com',
        'squarespace.com',
        'wix.com',
        'siteground.com',
        'ionos.com',
        'dynadot.com'
    ];

    async function checkDomainStatus(url) {
        try {
            if (!url.startsWith('http://') && !url.startsWith('https://')) {
                url = 'http://' + url;
            }

            return new Promise((resolve) => {
                GM_xmlhttpRequest({
                    method: 'GET',
                    url: url,
                    timeout: 8000,
                    onload: function(response) {
                        const finalUrl = response.finalUrl || url;
                        const content = (response.responseText || '').toLowerCase();
                        const status = response.status;

                        // WAF / protected detection
                        if (
                            content.includes('cloudflare') ||
                            content.includes('ddos-guard') ||
                            content.includes('sucuri') ||
                            content.includes('access denied') ||
                            content.includes('request blocked') ||
                            status === 403 || status === 503
                        ) {
                            console.log(`🟠 WAF PROTECTED   | ${url} (HTTP ${status})`);
                            resolve('🟠');
                            return;
                        }

                        // Redirect to known provider
                        if (knownProviders.some(provider => finalUrl.includes(provider))) {
                            console.log(`🔴 REDIRECT        | ${url} (Redirected to ${finalUrl})`);
                            resolve('🔴');
                            return;
                        }

                        // Minimal or empty body
                        const parser = new DOMParser();
                        const doc = parser.parseFromString(response.responseText, 'text/html');
                        const bodyContent = doc.body ? doc.body.textContent.trim() : '';
                        if (!bodyContent || bodyContent.length < 50) {
                            console.log(`🔴 EMPTY PAGE      | ${url}`);
                            resolve('🔴');
                            return;
                        }

                        // Default hoster keywords
                        const matchingKeyword = defaultHosterKeywords.find(keyword => content.includes(keyword.toLowerCase()));
                        if (matchingKeyword) {
                            console.log(`🔴 HOSTER KEYWORD  | ${url} (${matchingKeyword})`);
                            resolve('🔴');
                            return;
                        }

                        // Online
                        console.log(`🟢 ONLINE          | ${url} (HTTP ${status})`);
                        resolve('🟢');
                    },
                    onerror: function() {
                        console.log(`🟠 BLOCKED         | ${url} (Network error or blocked by server)`);
                        resolve('🟠');
                    },
                    ontimeout: function() {
                        console.log(`🔴 TIMEOUT         | ${url} (Request timed out)`);
                        resolve('🔴');
                    }
                });
            });
        } catch (error) {
            console.log(`🔴 ERROR           | ${url} (${error.message})`);
            return '🔴';
        }
    }

    const rows = table.querySelectorAll('tbody tr');
    for (const row of rows) {
        const domainCell = row.querySelector('td:nth-child(2) a');
        if (domainCell) {
            const domain = domainCell.textContent.trim();
            const statusLink = document.createElement('a');
            statusLink.style.marginLeft = '5px';
            statusLink.textContent = '🔄'; // Loading
            statusLink.href = `http://${domain}`;
            statusLink.target = '_blank';
            domainCell.parentElement.appendChild(statusLink);

            const status = await checkDomainStatus(domain);
            statusLink.textContent = status;
        }
    }
})();