Force GeoGuessr to use Chinese Google Maps
// ==UserScript==
// @name GeoGuessr Chinese Maps
// @name:zh-CN GeoGuessr 中文地图
// @namespace http://tampermonkey.net/
// @version 4.2
// @description Force GeoGuessr to use Chinese Google Maps
// @description:zh-CN 强制 GeoGuessr 使用中文地图
// @author Your Name
// @match https://*.geoguessr.com/*
// @grant none
// @run-at document-start
// @license MIT
// ==/UserScript==
(function() {
'use strict';
const targetLanguage = 'zh-CN';
let intercepted = false;
console.log('[GeoGuessr Chinese Maps] Script started');
// ============ 核心拦截:劫持 src setter ============
const originalSrcDescriptor = Object.getOwnPropertyDescriptor(HTMLScriptElement.prototype, 'src');
Object.defineProperty(HTMLScriptElement.prototype, 'src', {
get() {
return originalSrcDescriptor.get.call(this);
},
set(value) {
if (typeof value === 'string' && value.includes('maps.googleapis.com/maps/api/js')) {
try {
const url = new URL(value);
const currentLang = url.searchParams.get('language');
if (currentLang !== targetLanguage) {
url.searchParams.set('language', targetLanguage);
console.log(`[GeoGuessr Chinese Maps] ✓ Intercepted at src setter: ${currentLang || 'none'} → ${targetLanguage}`);
console.log(`[GeoGuessr Chinese Maps] Original URL: ${value}`);
console.log(`[GeoGuessr Chinese Maps] Modified URL: ${url.toString()}`);
intercepted = true;
originalSrcDescriptor.set.call(this, url.toString());
return;
} else if (currentLang === targetLanguage) {
console.log(`[GeoGuessr Chinese Maps] ✓ Already Chinese, no modification needed`);
intercepted = true;
}
} catch (e) {
console.error('[GeoGuessr Chinese Maps] Error:', e);
}
}
originalSrcDescriptor.set.call(this, value);
},
configurable: true
});
// ============ 后备方案:MutationObserver ============
const observer = new MutationObserver((mutations) => {
for (const mutation of mutations) {
for (const node of mutation.addedNodes) {
if (node.tagName === 'SCRIPT' && node.src && node.src.includes('maps.googleapis.com/maps/api/js')) {
console.log('[GeoGuessr Chinese Maps] MutationObserver detected script:', node.src);
try {
const url = new URL(node.src);
const currentLang = url.searchParams.get('language');
if (currentLang !== targetLanguage) {
console.log('[GeoGuessr Chinese Maps] ⚠️ Fallback: Script was not intercepted by setter!');
console.log('[GeoGuessr Chinese Maps] Current language:', currentLang);
// 阻止原脚本加载
node.src = '';
node.remove();
// 创建新脚本
url.searchParams.set('language', targetLanguage);
const newScript = document.createElement('script');
// 复制所有属性(除了 src)
for (let i = 0; i < node.attributes.length; i++) {
const attr = node.attributes[i];
if (attr.name !== 'src') {
newScript.setAttribute(attr.name, attr.value);
}
}
// 最后设置 src(触发加载)
newScript.src = url.toString();
// 插入到相同位置
(mutation.target || document.head || document.documentElement).appendChild(newScript);
console.log('[GeoGuessr Chinese Maps] ✓ Replaced with Chinese version:', newScript.src);
intercepted = true;
}
} catch (e) {
console.error('[GeoGuessr Chinese Maps] Observer error:', e);
}
// 找到目标后停止观察
observer.disconnect();
return;
}
}
}
});
observer.observe(document.documentElement, {
childList: true,
subtree: true
});
// ============ 验证拦截结果 ============
window.addEventListener('load', () => {
setTimeout(() => {
console.log('[GeoGuessr Chinese Maps] Checking interception status...');
const scripts = Array.from(document.querySelectorAll('script[src*="maps.googleapis.com"]'));
console.log(`[GeoGuessr Chinese Maps] Found ${scripts.length} Google Maps script(s)`);
scripts.forEach((script, index) => {
try {
const url = new URL(script.src);
const lang = url.searchParams.get('language');
console.log(`[GeoGuessr Chinese Maps] Script ${index + 1} language:`, lang || 'none');
if (lang !== targetLanguage) {
console.error('[GeoGuessr Chinese Maps] ❌ FAILED: Script is not Chinese!');
console.error('[GeoGuessr Chinese Maps] Script URL:', script.src);
} else {
console.log('[GeoGuessr Chinese Maps] ✓ SUCCESS: Chinese map loaded!');
}
} catch (e) {
console.error('[GeoGuessr Chinese Maps] Validation error:', e);
}
});
if (!intercepted && scripts.length > 0) {
console.error('[GeoGuessr Chinese Maps] ❌ WARNING: Scripts were loaded but not intercepted!');
}
}, 2000);
});
console.log('[GeoGuessr Chinese Maps] v4.2 initialized');
})();