您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Shows one lookup button per site (if multiple) on Platesmania upload pages.
// ==UserScript== // @name Platesmania Lookup Toolbox // @version 1.6.0 // @description Shows one lookup button per site (if multiple) on Platesmania upload pages. // @match https://platesmania.com/*/add* // @grant GM_setValue // @license MIT // @namespace https://greasyfork.org/users/976031 // ==/UserScript== (function () { 'use strict'; const lookupSites = { nl: [ { name: 'finnik.nl', base: 'https://finnik.nl/kenteken/' }, { name: 'rdwdata.nl', base: 'https://www.rdwdata.nl/kenteken/' }, { name: 'autoweek.nl', base: 'https://www.autoweek.nl/kentekencheck/' }, ], se: [ { name: 'car.info', base: 'https://www.car.info/?s=' }, { name: 'biluppgifter.se', base: 'https://biluppgifter.se/fordon/' }, { name: 'transportstyrelsen', base: 'https://fordon-fu-regnr.transportstyrelsen.se/?ts-regnr-sok=' }, ], ua: [ { name: 'carplates.app', base: 'https://ua.carplates.app/en/number/' }, { name: 'baza-gai.com.ua', base: 'https://baza-gai.com.ua/nomer/' }, { name: 'auto-inform.com.ua', base: 'https://auto-inform.com.ua/search/' }, ], uk: [ { name: 'checkcardetails.co.uk', base: 'https://www.checkcardetails.co.uk/cardetails/' }, { name: 'totalcarcheck.co.uk', base: 'https://totalcarcheck.co.uk/FreeCheck?regno=' }, { name: 'checkhistory.co.uk', base: 'https://checkhistory.uk/vehicle/' }, ], no: [{ name: 'vegvesen.no', base: 'https://www.vegvesen.no/en/vehicles/buy-and-sell/vehicle-information/check-vehicle-information/?registreringsnummer=' }], dk: [{ name: 'digitalservicebog.dk', base: 'https://app.digitalservicebog.dk/search?country=dk&Registration=' }], fr: [{ name: 'immatriculation-auto.info', base: 'https://immatriculation-auto.info/vehicle/' }], fi: [{ name: 'motonet.fi (API)', base: 'https://www.motonet.fi/api/vehicleInfo/registrationNumber/FI?locale=fi®istrationNumber=' }], cz: [{ name: 'uniqa.cz', base: 'https://www.uniqa.cz/online/pojisteni-vozidla/#ecvId=' }], }; const url = window.location.href; const is = (code) => url.includes(`platesmania.com/${code}/add`); const supportedCodes = ['nl','ua','no','dk','fr','uk','fi','pl','lt','cz','se']; function isLookupSiteAvailable() { return supportedCodes.some(is); } function areFieldsFilled() { if (is('nl')) return document.getElementById('nomer').value !== ''; if (is('ua')) { const region = document.getElementById('region1').value; const digits = document.getElementById('digit1').value; return region !== '' && digits !== ''; } if (is('no') || is('dk') || is('se')) return document.getElementById('let').value !== '' && document.getElementById('digit').value !== ''; if (is('fr')) { const b1 = document.getElementById('b1').value; const d2 = document.getElementById('digit2').value; const b2 = document.getElementById('b2').value; return b1 !== '' && d2 !== '' && b2 !== ''; } if (is('de') || is('ch')) return document.getElementById('digit').value !== ''; if (is('pl') || is('uk')) return document.getElementById('nomerpl').value !== ''; if (is('fi')) return document.getElementById('digit').value !== ''; if (is('lt')) return document.getElementById('digit2').value !== ''; if (is('cz')) { const d1 = document.getElementById('digit1').value; const d2 = document.getElementById('digit2').value; const d3 = document.getElementById('digit3').value; const nomer = document.getElementById('nomer').value; return d1 !== '' || d2 !== '' || d3 !== '' || nomer !== ''; } return false; } function buildPlateForCurrentPage() { if (is('nl')) return document.getElementById('nomer').value; if (is('ua')) { const region = document.getElementById('region1').value; const digits = document.getElementById('digit1').value; const b1 = document.getElementById('b1').value; const b2 = document.getElementById('b2').value; return `${region}${digits}${b1}${b2}`; } if (is('no') || is('dk') || is('se')) { const letField = document.getElementById('let').value; const digitField = document.getElementById('digit').value; return `${letField}${digitField}`; } if (is('fr')) { const b1 = document.getElementById('b1').value; const digit2 = document.getElementById('digit2').value; const b2 = document.getElementById('b2').value; return `${b1}${digit2}${b2}`; } if (is('fi')) { const letField = document.getElementById('let1').value; const digitField = document.getElementById('digit').value; return `${letField}-${digitField}`; } if (is('uk')) { return document.getElementById('nomerpl').value; } if (is('pl')) { const regionField = document.getElementById('region'); const selectedRegionText = regionField.options[regionField.selectedIndex].text; const digitField = document.getElementById('nomerpl').value; return `${selectedRegionText}${digitField}`; } if (is('lt')) { const b1 = document.getElementById('b1'); const b2 = document.getElementById('b2'); const b3 = document.getElementById('b3'); const d1 = document.getElementById('digit1'); const d2 = document.getElementById('digit2'); const d3 = document.getElementById('digit3'); const vanity = document.getElementById('nomer'); const ctype = document.getElementById('ctype').value; if (ctype === '1') return b1.value + b2.value + b3.value + d2.value; if (ctype === '2') return d1.value + b1.value + b2.value; if (ctype === '3') return b1.value + b2.value + d2.value; if (ctype === '4') return d1.value + b1.value + b2.value + b3.value; if (['5','6','7','9'].includes(ctype)) return vanity.value; if (ctype === '8') return d3.value + b1.value + b2.value; return ''; } if (is('cz')) { const q = (id) => document.getElementById(id)?.value || ''; const category = q('ctype'); const regionField = document.getElementById('region'); const selectedRegionText = regionField.options[regionField.selectedIndex].text; const b1 = q('b1'), b2 = q('b2'), b3 = q('b3'); const d1 = q('digit1'), d2 = q('digit2'), d3 = q('digit3'); const nomer = q('nomer'), el = q('el'); switch (category) { case '1': return `${b1}${selectedRegionText}${b2}${d1}`; case '2': return `${b1}${selectedRegionText}${d1}`; case '4': return `${selectedRegionText}${b2}${d1}`; case '5': return `${selectedRegionText}${b2}${d1}`; case '6': return `${selectedRegionText}${b2}${d1}`; case '7': return `${selectedRegionText}${b2}${d2}`; case '8': return `${selectedRegionText}${b2}${d2}`; case '9': return `${selectedRegionText}${b2}${d2}`; case '10': return `${selectedRegionText}${b2}${d2}`; case '11': return nomer; case '3': return nomer; case '12': return `${el}${b3}${d3}`; case '13': return `${d1}${d3}`; default: return ''; } } return ''; } function createOrUpdateLookupButtons() { const host = document.getElementById('zoomimgid'); if (!host) return; let container = document.getElementById('lookupButtonsContainer'); if (!isLookupSiteAvailable()) { if (container) container.remove(); return; } if (!container) { container = document.createElement('div'); container.id = 'lookupButtonsContainer'; container.style.display = 'grid'; container.style.gap = '6px'; host.parentNode.insertBefore(container, host); } else { container.innerHTML = ''; } const fieldsOk = areFieldsFilled(); const plate = fieldsOk ? buildPlateForCurrentPage() : ''; const code = supportedCodes.find(is); // Countries with special flows const specialPL = is('pl'); const specialLT = is('lt'); const sites = lookupSites[code] || []; // PL special flow (POST via query param) if (specialPL) { const btn = makeBtn('Lookup', !fieldsOk, () => { const plateNumber = buildPlateForCurrentPage(); const targetUrl = `https://moj.gov.pl/nforms/engine/ng/index?nfWidReset=true&xFormsAppName=NormaEuro&xFormsOrigin=EXTERNAL&plateNumber=${encodeURIComponent(plateNumber)}#/search`; window.open(targetUrl, '_blank'); }); container.appendChild(btn); return; } // LT special POST form if (specialLT) { const btn = makeBtn('Lookup', !fieldsOk, () => { const plateNumber = buildPlateForCurrentPage(); let form = document.createElement('form'); form.action = 'https://www.cab.lt/draustumo-patikra/'; form.method = 'POST'; form.target = '_blank'; let inputCountry = document.createElement('input'); inputCountry.type = 'hidden'; inputCountry.name = 'country'; inputCountry.value = 'LT'; let inputPlate = document.createElement('input'); inputPlate.type = 'hidden'; inputPlate.name = 'plate'; inputPlate.value = plateNumber; form.appendChild(inputCountry); form.appendChild(inputPlate); document.body.appendChild(form); form.submit(); document.body.removeChild(form); }); container.appendChild(btn); return; } // Standard flow: if no configured sites -> nothing to show if (!sites.length) return; if (sites.length === 1) { const only = sites[0]; const btn = makeBtn('Lookup', !fieldsOk, () => { const plateNumber = buildPlateForCurrentPage(); if (!plateNumber) return; window.open(only.base + plateNumber, '_blank'); }); container.appendChild(btn); } else { for (const site of sites) { const btn = makeBtn(site.name, !fieldsOk, () => { const plateNumber = buildPlateForCurrentPage(); if (!plateNumber) return; window.open(site.base + plateNumber, '_blank'); }); container.appendChild(btn); } } } function createOrUpdateGoogleImagesButton() { const host = document.getElementById('zoomimgid'); if (!host) return; let googleBtn = document.getElementById('googleImagesButton'); if (!googleBtn) { googleBtn = makeBtn('Search combination on Google Images', true, null); googleBtn.id = 'googleImagesButton'; host.parentNode.insertBefore(googleBtn, host); } const fieldsOk = areFieldsFilled(); googleBtn.disabled = !fieldsOk; googleBtn.onclick = !fieldsOk ? null : function () { let plateNumber = ''; if (is('nl')) plateNumber = document.getElementById('nomer').value; else if (is('ua')) { const region = document.getElementById('region1').value; const digits = document.getElementById('digit1').value; const b1 = document.getElementById('b1').value; const b2 = document.getElementById('b2').value; plateNumber = `${region} ${digits} ${b1}${b2}`; } else if (is('no') || is('dk') || is('se')) { plateNumber = document.getElementById('let').value + ' ' + document.getElementById('digit').value; } else if (is('fr')) { const b1 = document.getElementById('b1').value; const d2 = document.getElementById('digit2').value; const b2 = document.getElementById('b2').value; plateNumber = `${b1} ${d2} ${b2}`; } else if (is('de')) { const regionField = document.getElementById('region').value; const letField = document.getElementById('b1').value; const letField2 = document.getElementById('b2').value; const digitField = document.getElementById('digit').value; plateNumber = `${regionField} ${letField} ${digitField}${letField2}`; } else if (is('ch')) { const regionField = document.getElementById('region').value; const digitField = document.getElementById('digit').value; plateNumber = `${regionField} ${digitField}`; } else if (is('fi')) { plateNumber = document.getElementById('let1').value + '-' + document.getElementById('digit').value; } else if (is('pl')) { const regionField = document.getElementById('region'); const selectedRegionText = regionField.options[regionField.selectedIndex].text; const digitField = document.getElementById('nomerpl').value; plateNumber = selectedRegionText + ' ' + digitField; } else if (is('uk')) { plateNumber = document.getElementById('nomerpl').value; } else if (is('lt')) { plateNumber = buildPlateForCurrentPage(); } else if (is('cz')) { plateNumber = buildPlateForCurrentPage(); } window.open('https://www.google.com/search?tbm=isch&q="' + plateNumber + '"', '_blank'); }; } function makeBtn(label, disabled, onclick) { const btn = document.createElement('button'); btn.innerText = label; btn.disabled = !!disabled; btn.style.marginBottom = '10px'; btn.style.width = '100%'; btn.style.backgroundColor = disabled ? '#95a5a6' : '#3498db'; btn.style.color = '#ffffff'; btn.style.border = 'none'; btn.style.cursor = disabled ? 'default' : 'pointer'; btn.style.height = '23px'; btn.style.borderRadius = '4px'; if (onclick && !disabled) btn.onclick = onclick; return btn; } // --- Initial render + live updates --- function render() { createOrUpdateLookupButtons(); createOrUpdateGoogleImagesButton(); } render(); setInterval(render, 1000); })();