Whoxy Domain Status Indicator (OSINT)

Check if websites are online

ของเมื่อวันที่ 05-07-2025 ดู เวอร์ชันล่าสุด

// ==UserScript==
// @name         Whoxy Domain Status Indicator (OSINT)
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Check if websites are online
// @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 ? '🟢' : '🔴';
        }
    }
})();