你需要先安装一款用户样式管理器扩展(如 Stylus )后才能安装此样式。
你需要先安装一款用户样式管理器扩展(如 Stylus )后才能安装此样式。
你需要先安装一款用户样式管理器扩展(如 Stylus )后才能安装此样式。
你需要先安装一款用户样式管理器扩展后才能安装此样式。
你需要先安装一款用户样式管理器扩展后才能安装此样式。
你需要先安装一款用户样式管理器扩展后才能安装此样式。
(我已安装用户样式管理器,立即安装用户样式!)
换行
// ==UserScript== // @name CheatGuessr | WorldGuessr Cheat // @namespace http://tampermonkey.net/ // @version 1.5 // @description Extremely customizable WorldGuessr cheating client. Click 3 to open the settings menu. // @author CheatGuessr // @match https://www.worldguessr.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=worldguessr.com // @grant none // @license GNU AGPLv3 // ==/UserScript== ( function () { 'use strict' ; if ( window . location . pathname === '/banned' ) { const handleBannedPage = () => { const backdrop = document . createElement ( 'div' ); backdrop . style . position = 'fixed' ; backdrop . style . top = '0' ; backdrop . style . left = '0' ; backdrop . style . right = '0' ; backdrop . style . bottom = '0' ; backdrop . style . backgroundColor = 'rgba(0,0,0,0.5)' ; backdrop . style . zIndex = '10000' ; const modal = document . createElement ( 'div' ); modal . style . position = 'fixed' ; modal . style . top = '50%' ; modal . style . left = '50%' ; modal . style . transform = 'translate(-50%, -50%)' ; modal . style . backgroundColor = '#1f2937' ; modal . style . padding = '20px' ; modal . style . borderRadius = '8px' ; modal . style . color = 'white' ; modal . style . zIndex = '10001' ; const message = document . createElement ( 'p' ); message . textContent = 'The Cheat has been detected!\nPlease Enter 10-20 random characters to bypass the anti-cheat.\n\nExample (do not use the example):\ndf89aj3n4r98nd9' ; message . style . margin = '0 0 15px 0' ; const input = document . createElement ( 'input' ); input . type = 'text' ; input . style . width = '100%' ; input . style . marginBottom = '15px' ; input . style . padding = '8px' ; input . style . borderRadius = '4px' ; input . style . border = '1px solid #4b5563' ; input . style . backgroundColor = '#374151' ; input . style . color = 'white' ; const submitButton = document . createElement ( 'button' ); submitButton . textContent = 'Submit' ; submitButton . style . padding = '8px 16px' ; submitButton . style . backgroundColor = '#3b82f6' ; submitButton . style . color = 'white' ; submitButton . style . border = 'none' ; submitButton . style . borderRadius = '4px' ; submitButton . style . cursor = 'pointer' ; submitButton . onmouseenter = () => submitButton . style . backgroundColor = '#2563eb' ; submitButton . onmouseleave = () => submitButton . style . backgroundColor = '#3b82f6' ; submitButton . onclick = () => { const chars = input . value . trim (); if ( chars ) { if ( chars === 'df89aj3n4r98nd9' ) { alert ( 'You cannot use the example!' ); return ; } localStorage . setItem ( 'mapDivClass' , chars ); const history = JSON . parse ( localStorage . getItem ( 'mapDivClassHistory' ) || '[]' ); history . push ( chars ); localStorage . setItem ( 'mapDivClassHistory' , JSON . stringify ( history )); window . location . href = 'https://www.worldguessr.com/' ; } }; modal . appendChild ( message ); modal . appendChild ( input ); modal . appendChild ( submitButton ); document . body . appendChild ( backdrop ); document . body . appendChild ( modal ); }; handleBannedPage (); return ; } let googleMapsIframe = null ; let lastLocation = null ; let loadingIndicator = null ; let dotInterval = null ; let settings = null ; let settingsModal = null ; let mapDivClass = localStorage . getItem ( 'mapDivClass' ) || 'map-div' ; const DEFAULT_SETTINGS = { keybinds : { toggleMap : '1' , newTab : '2' , settings : '3' , detailedLocation : '4' }, mapPosition : 'top-left' , mapSize : { width : 400 , height : 300 }, loadingPosition : 'bottom' , refreshInterval : 1000 , blockAds : true }; const style = document . createElement ( 'style' ); style . textContent = ` . $ { mapDivClass } { position : fixed ; z - index : 9999 ; border : 2px solid # 333 ; border - radius : 4px ; } . close - button { position : absolute ; top : - 15px ; right : - 15px ; width : 30px ; height : 30px ; background : red ; border : 2px solid white ; border - radius : 50 %; color : white ; font - weight : bold ; cursor : pointer ; display : flex ; align - items : center ; justify - content : center ; z - index : 10000 ; } . loading - indicator { position : fixed ; left : 10px ; padding : 5px 10px ; background : rgba ( 0 , 0 , 0 , 0.7 ); color : white ; border - radius : 4px ; z - index : 9999 ; } . settings - modal { position : fixed ; top : 50 %; left : 50 %; transform : translate (- 50 %, - 50 %); background : # 1f2937 ; padding : 20px ; border - radius : 8px ; z - index : 10001 ; width : 600px ; max - height : 80vh ; overflow - y : auto ; color : white ; } . settings - backdrop { position : fixed ; top : 0 ; left : 0 ; right : 0 ; bottom : 0 ; background : rgba ( 0 , 0 , 0 , 0.5 ); z - index : 10000 ; } . settings - grid { display : grid ; grid - template - columns : 1fr 1fr ; gap : 20px ; } . settings - section { background : # 374151 ; padding : 15px ; border - radius : 6px ; } . settings - row { margin : 10px 0 ; } . settings - row label { display : block ; margin - bottom : 5px ; color : # e5e7eb ; } . settings - input { width : 100 %; padding : 8px ; border : 1px solid # 4b5563 ; border - radius : 4px ; background : # 1f2937 ; color : white ; } . settings - button { padding : 8px 16px ; border : none ; border - radius : 4px ; cursor : pointer ; margin : 5px ; background : # 3b82f6 ; color : white ; } . settings - button : hover { background : # 2563eb ; } `; document . head . appendChild ( style ); function loadSettings () { try { const saved = localStorage . getItem ( 'worldGuessrHelper' ); settings = saved ? JSON . parse ( saved ) : DEFAULT_SETTINGS ; } catch ( e ) { settings = DEFAULT_SETTINGS ; } } function saveSettings () { localStorage . setItem ( 'worldGuessrHelper' , JSON . stringify ( settings )); } function blockAds () { if (! settings . blockAds ) return ; const adSelectors = [ '[id^="google_ads_iframe"]' , '[id^="worldguessr-com_"]' , '.video-ad' ]; const removeAds = () => { adSelectors . forEach ( selector => { document . querySelectorAll ( selector ). forEach ( ad => { ad . remove (); }); }); }; removeAds (); const observer = new MutationObserver ( removeAds ); observer . observe ( document . body , { childList : true , subtree : true }); } function createLoadingIndicator () { loadingIndicator = document . createElement ( 'div' ); loadingIndicator . className = 'loading-indicator' ; loadingIndicator . style . display = 'none' ; document . body . appendChild ( loadingIndicator ); let dots = 0 ; if ( dotInterval ) clearInterval ( dotInterval ); dotInterval = setInterval (() => { dots = ( dots + 1 ) % 4 ; if ( loadingIndicator ) { loadingIndicator . textContent = 'Loading location' + '.' . repeat ( dots ); } }, 500 ); } function toggleSettingsModal () { if ( settingsModal ) { settingsModal . backdrop . remove (); settingsModal . modal . remove (); settingsModal = null ; return ; } const backdrop = document . createElement ( 'div' ); backdrop . className = 'settings-backdrop' ; const modal = document . createElement ( 'div' ); modal . className = 'settings-modal' ; modal . innerHTML = ` < h2 style = "margin-bottom: 20px" > WorldGuessr Helper Settings </ h2 > < div class = "settings-grid" > < div class = "settings-section" > < h3 > Keybinds </ h3 > < div class = "settings-row" > < label > Toggle Map Key </ label > < input type = "text" class = "settings-input" id = "toggleMapKey" value = "${settings.keybinds.toggleMap}" > </ div > < div class = "settings-row" > < label > New Tab Key </ label > < input type = "text" class = "settings-input" id = "newTabKey" value = "${settings.keybinds.newTab}" > </ div > < div class = "settings-row" > < label > Settings Key </ label > < input type = "text" class = "settings-input" id = "settingsKey" value = "${settings.keybinds.settings}" > </ div > < div class = "settings-row" > < label > Detailed Location Alert </ label > < input type = "text" class = "settings-input" id = "detailedLocation" value = "${settings.keybinds.detailedLocation}" > </ div > </ div > < div class = "settings-section" > < h3 > Map Settings </ h3 > < div class = "settings-row" > < label > Map Position </ label > < select class = "settings-input" id = "mapPosition" > < option value = "top-left" $ { settings . mapPosition === 'top-left' ? 'selected' : '' }> Top Left </ option > < option value = "top-right" $ { settings . mapPosition === 'top-right' ? 'selected' : '' }> Top Right </ option > < option value = "bottom-left" $ { settings . mapPosition === 'bottom-left' ? 'selected' : '' }> Bottom Left </ option > < option value = "bottom-right" $ { settings . mapPosition === 'bottom-right' ? 'selected' : '' }> Bottom Right </ option > </ select > </ div > < div class = "settings-row" > < label > Map Width ( px )</ label > < input type = "number" class = "settings-input" id = "mapWidth" value = "${settings.mapSize.width}" > </ div > < div class = "settings-row" > < label > Map Height ( px )</ label > < input type = "number" class = "settings-input" id = "mapHeight" value = "${settings.mapSize.height}" > </ div > </ div > </ div > < div class = "settings-section" style = "margin-top: 20px" > < h3 > Additional Settings </ h3 > < div class = "settings-row" > < label > < input type = "checkbox" id = "blockAds" $ { settings . blockAds ? 'checked' : '' }> Block Advertisements </ label > </ div > </ div > < div style = "text-align: right; margin-top: 20px" > < button class = "settings-button" id = "closeSettings" > Cancel </ button > < button class = "settings-button" id = "saveSettings" > Save </ button > </ div > `; document . body . appendChild ( backdrop ); document . body . appendChild ( modal ); settingsModal = { backdrop , modal }; document . getElementById ( 'saveSettings' ). onclick = () => { settings . keybinds . toggleMap = document . getElementById ( 'toggleMapKey' ). value ; settings . keybinds . newTab = document . getElementById ( 'newTabKey' ). value ; settings . keybinds . settings = document . getElementById ( 'settingsKey' ). value ; settings . keybinds . detailedLocation = document . getElementById ( 'detailedLocation' ). value ; settings . mapPosition = document . getElementById ( 'mapPosition' ). value ; settings . mapSize . width = parseInt ( document . getElementById ( 'mapWidth' ). value ); settings . mapSize . height = parseInt ( document . getElementById ( 'mapHeight' ). value ); settings . blockAds = document . getElementById ( 'blockAds' ). checked ; saveSettings (); blockAds (); toggleSettingsModal (); }; document . getElementById ( 'closeSettings' ). onclick = toggleSettingsModal ; } function showLoadingIndicator () { if ( loadingIndicator ) { loadingIndicator . style . display = 'block' ; loadingIndicator . style . bottom = settings . loadingPosition === 'bottom' ? '10px' : 'auto' ; loadingIndicator . style . top = settings . loadingPosition === 'top' ? '10px' : 'auto' ; } } function hideLoadingIndicator () { if ( loadingIndicator ) { loadingIndicator . style . display = 'none' ; } } function extractLocationFromIframe () { showLoadingIndicator (); const iframe = document . querySelector ( 'iframe[src^="/svEmbed"]' ); if (! iframe ) { hideLoadingIndicator (); return null ; } const urlParams = new URLSearchParams ( iframe . src . split ( '?' )[ 1 ]); const lat = parseFloat ( urlParams . get ( 'lat' )); const long = parseFloat ( urlParams . get ( 'long' )); if (! isNaN ( lat ) && ! isNaN ( long )) { hideLoadingIndicator (); return { lat , long , timestamp : new Date () }; } hideLoadingIndicator (); return null ; } function updateMapPosition () { if (! googleMapsIframe ) return ; const pos = settings . mapPosition . split ( '-' ); googleMapsIframe . style . top = pos [ 0 ] === 'top' ? '10px' : 'auto' ; googleMapsIframe . style . bottom = pos [ 0 ] === 'bottom' ? '10px' : 'auto' ; googleMapsIframe . style . left = pos [ 1 ] === 'left' ? '10px' : 'auto' ; googleMapsIframe . style . right = pos [ 1 ] === 'right' ? '10px' : 'auto' ; googleMapsIframe . style . width = settings . mapSize . width + 'px' ; googleMapsIframe . style . height = settings . mapSize . height + 'px' ; } function toggleGoogleMapsIframe ( location ) { if (! location ) return ; if ( googleMapsIframe ) { googleMapsIframe . remove (); googleMapsIframe = null ; return ; } try { const container = document . createElement ( 'div' ); container . className = mapDivClass ; const closeBtn = document . createElement ( 'button' ); closeBtn . className = 'close-button' ; closeBtn . textContent = '×' ; closeBtn . onclick = () => { container . remove (); googleMapsIframe = null ; }; const iframe = document . createElement ( 'iframe' ); iframe . width = '100%' ; iframe . height = '100%' ; iframe . style . border = 'none' ; iframe . src = "https://www.google.com/maps?q=" + location . lat + "," + location . long + "&z=18&output=embed" ; container . appendChild ( closeBtn ); container . appendChild ( iframe ); document . body . appendChild ( container ); googleMapsIframe = container ; updateMapPosition (); } catch ( error ) { console . error ( 'Error creating iframe:' , error ); } } async function fetchLocationDetails ( lat , long ) { try { const response = await fetch (` https : //nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${lat}&lon=${long}`); if (! response . ok ) { throw new Error ( 'Failed to fetch location details' ); } const data = await response . json (); const { address } = data ; const locationDetails = ` Area : $ { address . neighbourhood || address . suburb || address . hamlet || 'N/A' } City : $ { address . city || address . town || address . village || 'N/A' } State : $ { address . state || 'N/A' } Country : $ { address . country || 'N/A' } `; alert ( locationDetails ); } catch ( error ) { alert ( 'Could not fetch location details: ' + error . message ); } } window . addEventListener ( 'keydown' , function ( event ) { event . stopPropagation (); const location = extractLocationFromIframe (); if (! location ) return ; if ( lastLocation && ( lastLocation . lat !== location . lat || lastLocation . long !== location . long )) { if ( googleMapsIframe ) { toggleGoogleMapsIframe ( location ); toggleGoogleMapsIframe ( location ); } } lastLocation = location ; if ( event . key === settings . keybinds . toggleMap ) { toggleGoogleMapsIframe ( location ); } else if ( event . key === settings . keybinds . newTab ) { window . open ( "https://www.google.com/maps?q=" + location . lat + "," + location . long , "_blank" ); } else if ( event . key === settings . keybinds . settings ) { if ( googleMapsIframe ) { toggleGoogleMapsIframe ( location ); } toggleSettingsModal (); } else if ( event . key === settings . keybinds . detailedLocation ) { const { lat , long } = location ; if (! lat || ! long ) { alert ( 'Coordinates not yet available!' ); } else { fetchLocationDetails ( lat , long ); } } }, true ); loadSettings (); createLoadingIndicator (); blockAds (); setInterval (() => { const location = extractLocationFromIframe (); if (! location || ! lastLocation ) return ; if ( lastLocation . lat !== location . lat || lastLocation . long !== location . long ) { if ( googleMapsIframe ) { toggleGoogleMapsIframe ( location ); toggleGoogleMapsIframe ( location ); } lastLocation = location ; } }, settings . refreshInterval ); const observer = new MutationObserver (() => { if (! document . querySelector ( 'iframe[src^="/svEmbed"]' ) && googleMapsIframe ) { googleMapsIframe . remove (); googleMapsIframe = null ; } }); observer . observe ( document . body , { childList : true , subtree : true }); })();