Territorial.io Auto-Join Multiplayer

Automatically clicks Multiplayer and Ready buttons on territorial.io. Works with multiple CroxyProxy formats.

当前为 2025-06-30 提交的版本,查看 最新版本

// ==UserScript==
// @name         Territorial.io Auto-Join Multiplayer
// @namespace    Violentmonkey Scripts
// @version      1.2
// @description  Automatically clicks Multiplayer and Ready buttons on territorial.io. Works with multiple CroxyProxy formats.
// @author       Assistant
// @match        https://territorial.io/*
// @match        https://*.croxyproxy.com/*territorial.io*
// @match        https://*/*?__cpo=*
// @grant        none
// @run-at       document-end
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    /**
     * Checks if the current page is territorial.io, either directly or via a known proxy.
     * This is a safeguard to ensure the script only runs on the correct page.
     * @returns {boolean}
     */
    function isTerritorialPage() {
        const hostname = window.location.hostname;
        const searchParams = new URLSearchParams(window.location.search);

        // 1. Check for the direct site
        if (hostname === 'territorial.io') {
            return true;
        }

        // 2. Check for the subdomain proxy format
        if (hostname.includes('croxyproxy.com') && window.location.href.includes('territorial.io')) {
            return true;
        }

        // 3. Check for the base64 encoded parameter format (e.g., on an IP address)
        if (searchParams.has('__cpo')) {
            try {
                // atob() decodes a base-64 encoded string.
                const decodedUrl = atob(searchParams.get('__cpo'));
                if (decodedUrl.includes('territorial.io')) {
                    return true;
                }
            } catch (e) {
                // This can fail if the parameter is not valid Base64; ignore it.
                console.error("[Auto-Join] Error decoding __cpo parameter:", e);
                return false;
            }
        }
        return false;
    }

    // --- Main Execution Logic ---

    // Stop the script immediately if it's not a territorial.io page.
    if (!isTerritorialPage()) {
        // console.log("[Auto-Join] Not a territorial.io page. Halting script.");
        return;
    }

    console.log("[Auto-Join] Territorial.io page confirmed. Starting automation.");

    const TIMEOUT_SECONDS = 15;
    const CHECK_INTERVAL_MS = 200;

    function waitForElementAndClick(findFunction, successCallback, description) {
        let attempts = 0;
        const maxAttempts = (TIMEOUT_SECONDS * 1000) / CHECK_INTERVAL_MS;
        console.log(`[Auto-Join] Searching for: ${description}`);
        const interval = setInterval(() => {
            if (attempts >= maxAttempts) {
                clearInterval(interval);
                console.error(`[Auto-Join] Timed out waiting for: ${description}`);
                return;
            }
            const element = findFunction();
            if (element) {
                clearInterval(interval);
                console.log(`[Auto-Join] Found and clicking: ${description}`);
                element.click();
                if (successCallback) {
                    successCallback();
                }
            }
            attempts++;
        }, CHECK_INTERVAL_MS);
    }

    const findMultiplayerButton = () => {
        const buttons = document.querySelectorAll('button');
        return Array.from(buttons).find(btn => btn.innerText.includes('Multiplayer'));
    };

    const findReadyButton = () => {
        const buttons = document.querySelectorAll('button');
        return Array.from(buttons).find(btn => btn.innerText.trim().startsWith('Ready'));
    };

    // 1. Start by waiting for the "Multiplayer" button.
    waitForElementAndClick(findMultiplayerButton, () => {
        // 2. Once clicked, wait for the "Ready" button.
        waitForElementAndClick(findReadyButton, () => {
            console.log("[Auto-Join] Successfully clicked 'Ready'. Script sequence complete.");
        }, "'Ready' button");
    }, "'Multiplayer' button");

})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址