Reverse Whoxy Domain Status (OSINT)

Check if websites are online in a reverse whoxy list

当前为 2025-07-05 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

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

(async function() {
    'use strict';

    // Find the target table
    const table = document.querySelector('table.grid.first_col_center');
    if (!table) return;

    // Common keywords/phrases indicating a default hoster page
    const defaultHosterKeywords = [
        'this domain is for sale',
        'domain registered',
        'coming soon',
        'welcome to your new website',
        'this domain has been registered',
        'default page',
        'placeholder page',
        'parked domain',
        'under construction',
        'domain parking',
        'domain reserved'
    ];

    // Known hosting provider domains (for redirect detection)
    const knownProviders = [
        'godaddy.com',
        'namecheap.com',
        'bluehost.com',
        'hostgator.com',
        'dreamhost.com',
        'squarespace.com',
        'wix.com',
        'siteground.com',
        'ionos.com',
        'dynadot.com'
    ];

    // Function to check if a page is a default hoster page, empty, or redirected to a provider
    async function checkDomainStatus(url) {
        try {
            // Ensure URL starts with http:// or https://
            if (!url.startsWith('http://') && !url.startsWith('https://')) {
                url = 'http://' + url;
            }

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

                            // Check for redirects to known providers
                            const isProviderRedirect = knownProviders.some(provider => finalUrl.includes(provider));
                            if (isProviderRedirect) {
                                resolve(false);
                                return;
                            }

                            // Check for empty or minimal body content
                            const parser = new DOMParser();
                            const doc = parser.parseFromString(response.responseText, 'text/html');
                            const bodyContent = doc.body ? doc.body.textContent.trim() : '';
                            const isEmptyBody = !bodyContent || bodyContent.length < 50;

                            if (isEmptyBody) {
                                resolve(false);
                                return;
                            }

                            // Check for default hoster keywords
                            const isDefaultPage = defaultHosterKeywords.some(keyword => content.includes(keyword));
                            resolve(!isDefaultPage);
                        } else {
                            resolve(false);
                        }
                    },
                    onerror: function() {
                        resolve(false);
                    },
                    ontimeout: function() {
                        resolve(false);
                    }
                });
            });
        } catch (error) {
            console.error(`Error checking ${url}:`, error);
            return false;
        }
    }

    // Process each row in the table
    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 indicator
            statusLink.href = `http://${domain}`;
            statusLink.target = '_blank'; // Open in new tab
            domainCell.parentElement.appendChild(statusLink);

            const isActive = await checkDomainStatus(domain);
            statusLink.textContent = isActive ? '🟢' : '🔴';
        }
    }
})();