您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
filter specific coverage on map-making page
// ==UserScript== // @name Coverage Preference Settings // @namespace https://gf.zukizuki.org/users/1179204 // @version 1.0.5 // @description filter specific coverage on map-making page // @author KaKa // @match *://map-making.app/maps/* // @require https://cdn.jsdelivr.net/npm/sweetalert2@11 // @license MIT // @grant unsafeWindow // @icon https://www.google.com/s2/favicons?domain=geoguessr.com // ==/UserScript== (function() { let panoId,startTimestamp,endTimestamp,searchState,getState,preference,pIndex=0 let preferences=['default','Unofficial','Specific Date'] function showAlert(preference) { Swal.fire({ title: 'Preference', text: `The default coverage has been set to "${preference}"`, icon: 'info', timer: 1500, showConfirmButton: false, }); if (preference==='Specific Date'){ setTimeout(async function(){await getDateRange()},1000) } } async function getDateRange(){ const dateFormatRegex = /^\d{4}-(0\d|1[0-2]|[1-9])-(0\d|1\d|2\d|3[01]|[1-9])$/; await Swal.fire({ title: 'Enter Date Range', icon:'question', html: '<input id="start-date" class="swal2-input" placeholder="Start Date (yyyy-mm-dd)">' + '<input id="end-date" class="swal2-input" placeholder="End Date (yyyy-mm-dd)">', focusConfirm: false, showCancelButton: false, preConfirm: () => { const startDate = document.getElementById('start-date').value.trim(); const endDate = document.getElementById('end-date').value.trim(); if (!startDate.match(dateFormatRegex) || !endDate.match(dateFormatRegex)) { Swal.showValidationMessage('Please enter valid date range!') return false; } if (startDate&&endDate) { startTimestamp = Date.parse(startDate) / 1000; endTimestamp = Date.parse(endDate) / 1000; } } }); } const THE_WINDOW = unsafeWindow || window; THE_WINDOW.fetch = function(originalFetch) { return async function (...args) { const url = args[0].toString(); if (pIndex===0){ return originalFetch.apply(THE_WINDOW, args); } if (url.includes('SingleImageSearch') || url.includes('GetMetadata')) { try { let requestData = JSON.parse(args[1].body); if (url.includes('SingleImageSearch')&&!searchState) { if(pIndex===1){ requestData[1][1]=30 requestData[2][10][0][0][0]=3 } else if (pIndex===2){ requestData[1][1]=15 requestData[2][0] = [null, null, false, null, null, null, null, null, null, null, [startTimestamp, endTimestamp]]; requestData[3] = [[2, 6]] } args[1].body = JSON.stringify(requestData); } if (url.includes('GetMetadata')) { requestData[2][0][0][1] = panoId searchState=null args[1].body = JSON.stringify(requestData); } const response = await originalFetch.apply(THE_WINDOW, args); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const responseData = await response.json(); if (url.includes('SingleImageSearch')){ if (responseData&&!responseData[0].includes('generic')){ if(!searchState){ panoId=responseData[1][1][1] }} else{panoId=null} } return originalFetch.apply(THE_WINDOW, args); } catch (error) { console.error('Error fetching data:', error); throw error; } } else { return originalFetch.apply(THE_WINDOW, args); } }; }(THE_WINDOW.fetch); let onKeyDown = async (e) => { if (e.key === 'q' || e.key === 'Q') { e.stopImmediatePropagation(); if (pIndex>=3)pIndex=0 else{pIndex+=1} preference=preferences[pIndex] showAlert(preference) }; } document.addEventListener("keydown", onKeyDown); })();