Greasy Fork is available in English.

Show Location on ChatGPT

在ChatGPT官方网站的顶部显示当前用户IP所在的地区,如果是非ChatGPT支持的地区会红色标识提示,以免被封号。

// ==UserScript==
// @name         Show Location on ChatGPT
// @namespace    http://tampermonkey.net/
// @version      0.5
// @description  在ChatGPT官方网站的顶部显示当前用户IP所在的地区,如果是非ChatGPT支持的地区会红色标识提示,以免被封号。
// @author       Daotin
// @match        https://chat.openai.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=chat.openai.com
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Define the list of regions to check against
    const regions = [
        "Albania",
        "Algeria",
        "Andorra",
        "Angola",
        "Antigua and Barbuda",
        "Argentina",
        "Armenia",
        "Australia",
        "Austria",
        "Azerbaijan",
        "Bahamas",
        "Bangladesh",
        "Barbados",
        "Belgium",
        "Belize",
        "Benin",
        "Bhutan",
        "Bolivia",
        "Bosnia and Herzegovina",
        "Botswana",
        "Brazil",
        "Brunei",
        "Bulgaria",
        "Burkina Faso",
        "Cabo Verde",
        "Canada",
        "Chile",
        "Colombia",
        "Comoros",
        "Congo (Congo-Brazzaville)",
        "Costa Rica",
        "Côte d'Ivoire",
        "Croatia",
        "Cyprus",
        "Czechia (Czech Republic)",
        "Denmark",
        "Djibouti",
        "Dominica",
        "Dominican Republic",
        "Ecuador",
        "El Salvador",
        "Estonia",
        "Fiji",
        "Finland",
        "France",
        "Gabon",
        "Gambia",
        "Georgia",
        "Germany",
        "Ghana",
        "Greece",
        "Grenada",
        "Guatemala",
        "Guinea",
        "Guinea-Bissau",
        "Guyana",
        "Haiti",
        "Holy See (Vatican City)",
        "Honduras",
        "Hungary",
        "Iceland",
        "India",
        "Indonesia",
        "Iraq",
        "Ireland",
        "Israel",
        "Italy",
        "Jamaica",
        "Japan",
        "Jordan",
        "Kazakhstan",
        "Kenya",
        "Kiribati",
        "Kuwait",
        "Kyrgyzstan",
        "Latvia",
        "Lebanon",
        "Lesotho",
        "Liberia",
        "Liechtenstein",
        "Lithuania",
        "Luxembourg",
        "Madagascar",
        "Malawi",
        "Malaysia",
        "Maldives",
        "Mali",
        "Malta",
        "Marshall Islands",
        "Mauritania",
        "Mauritius",
        "Mexico",
        "Micronesia",
        "Moldova",
        "Monaco",
        "Mongolia",
        "Montenegro",
        "Morocco",
        "Mozambique",
        "Myanmar",
        "Namibia",
        "Nauru",
        "Nepal",
        "Netherlands",
        "New Zealand",
        "Nicaragua",
        "Niger",
        "Nigeria",
        "North Macedonia",
        "Norway",
        "Oman",
        "Pakistan",
        "Palau",
        "Palestine",
        "Panama",
        "Papua New Guinea",
        "Paraguay",
        "Peru",
        "Philippines",
        "Poland",
        "Portugal",
        "Qatar",
        "Romania",
        "Rwanda",
        "Saint Kitts and Nevis",
        "Saint Lucia",
        "Saint Vincent and the Grenadines",
        "Samoa",
        "San Marino",
        "Sao Tome and Principe",
        "Senegal",
        "Serbia",
        "Seychelles",
        "Sierra Leone",
        "Singapore",
        "Slovakia",
        "Slovenia",
        "Solomon Islands",
        "South Africa",
        "South Korea",
        "Spain",
        "Sri Lanka",
        "Suriname",
        "Sweden",
        "Switzerland",
        "Taiwan",
        "Tanzania",
        "Thailand",
        "Timor-Leste (East Timor)",
        "Togo",
        "Tonga",
        "Trinidad and Tobago",
        "Tunisia",
        "Turkey",
        "Tuvalu",
        "Uganda",
        "Ukraine (with certain exceptions)",
        "United Arab Emirates",
        "United Kingdom",
        "United States of America",
        "Uruguay",
        "Vanuatu",
        "Zambia"
    ];

    // Your code here...
    // Make an HTTP request to https://chat.openai.com/cdn-cgi/trace
    fetch('https://chat.openai.com/cdn-cgi/trace')
        .then(response => response.text())
        .then(data => {
        // Extract the user's location and IP address from the returned string
        const locationRegex = /loc=([a-zA-Z]+)/;
        const countryCode = data.match(locationRegex)[1];
        const ipRegex = /ip=([0-9\.]+)/;
        const ipAddress = data.match(ipRegex)[1];

        // Make an HTTP request to the REST Countries API to get the full country name
        fetch(`https://restcountries.com/v3.1/alpha/${countryCode}`)
            .then(response => response.json())
            .then(data => {
            const countryName = data[0]?.name?.official || data[0]?.name?.common;

            // 循环regions,判断countryName是否包含regions中的元素
            const isInRegion = regions.some(region => countryName.includes(region));

            // Display the user's location and IP address at the top of the browser
            const locationDiv = document.createElement('div');
            locationDiv.textContent = `Your location: ${countryName} (${ipAddress}) ${isInRegion ? '✅' : '⛔'}`;
            locationDiv.style.position = 'fixed';
            locationDiv.style.top = '10px';
            locationDiv.style.left = '50%';
            locationDiv.style.transform = 'translateX(-50%)';
            locationDiv.style.padding = '10px 20px';
            locationDiv.style.backgroundColor = isInRegion ? '#10a37fb3' : '#ef4146b3';
            locationDiv.style.color = '#fff';
            locationDiv.style.fontSize = '16px';
            locationDiv.style.fontWeight = 'bold';
            locationDiv.style.textAlign = 'center';
            locationDiv.style.zIndex = '9999';
            locationDiv.style.borderRadius = '8px';
            document.body.appendChild(locationDiv);

            // Add a close button to the locationDiv
            const closeButton = document.createElement('div');
            closeButton.textContent = '×';
            closeButton.style.position = 'absolute';
            closeButton.style.top = '-3px';
            closeButton.style.right = '-6px';
            closeButton.style.backgroundColor = 'rgba(231, 195, 195, 0.5)';
            closeButton.style.border = 'none';
            closeButton.style.color = '#fff';
            closeButton.style.fontSize = '16px';
            closeButton.style.cursor = 'pointer';
            closeButton.style.borderRadius = '50%';
            closeButton.style.width = '16px';
            closeButton.style.height = '16px';
            closeButton.style.lineHeight = '16px';
            closeButton.style.textAlign = 'center';
            locationDiv.appendChild(closeButton);

            // Add a click event listener to the closeButton to remove the locationDiv
            closeButton.addEventListener('click', () => {
                locationDiv.remove();
            });
        });
    });
})();