// ==UserScript== // @name Advanced Search Assistant for Google // @name:zh-CN Google 高级搜索助手 // @description:zh-CN 在谷歌搜索页面顶部添加一个高级搜索表单 // @name:ar Google مساعد البحث المتقدم // @description:ar أضف نموذج بحث متقدم إلى أعلى صفحة بحث Google الخاصة بك // @name:bg Google Помощник за разширено търсене // @description:bg Добавете формуляр за разширено търсене в горната част на вашата страница за търсене в Google // @name:cs Google Pokročilý asistent vyhledávání // @description:cs Přidejte formulář pro pokročilé vyhledávání do horní části stránky vyhledávání Google // @name:da Google Avanceret søgeassistent // @description:da Tilføj en avanceret søgeformular øverst på din Google-søgeside // @name:de Google Erweiterter Suchassistent // @description:de Fügen Sie oben auf Ihrer Google-Suchseite ein erweitertes Suchformular hinzu // @name:el Google Βοηθός σύνθετης αναζήτησης // @description:el Προσθέστε μια φόρμα σύνθετης αναζήτησης στην κορυφή της σελίδας αναζήτησης Google // @name:en Google Advanced search assistant // @description:en Add an advanced search form to the top of your Google search page // @name:eo Google Altnivela serĉa asistanto // @description:eo Aldonu altnivelan serĉformularon al la supro de via serĉpaĝo de Guglo // @name:es Google asistente de búsqueda avanzada // @description:es Agregue un formulario de búsqueda avanzada en la parte superior de su página de búsqueda de Google // @name:fi Google Tarkennettu hakuavustaja // @description:fi Lisää tarkennettu hakulomake Google-hakusivusi yläosaan // @name:fr Google Assistant de recherche avancée // @description:fr Ajoutez un formulaire de recherche avancée en haut de votre page de recherche Google // @name:he Google עוזר חיפוש מתקדם // @description:he הוסף טופס חיפוש מתקדם לראש דף החיפוש שלך בגוגל // @name:hr Google Pomoćnik za napredno pretraživanje // @description:hr Dodajte obrazac za napredno pretraživanje na vrh svoje stranice Google pretraživanja // @name:hu Google Speciális keresési asszisztens // @description:hu Adjon hozzá egy speciális keresési űrlapot a Google keresési oldalának tetejére // @name:id Google Asisten pencarian lanjutan // @description:id Tambahkan formulir pencarian lanjutan ke bagian atas halaman pencarian Google Anda // @name:it Google Assistente di ricerca avanzata // @description:it Aggiungi un modulo di ricerca avanzata nella parte superiore della pagina di ricerca di Google // @name:ja Google 高度な検索アシスタント // @description:ja Google 検索ページの上部に高度な検索フォームを追加します // @name:ka Google გაფართოებული საძიებო ასისტენტი // @description:ka დაამატეთ გაფართოებული საძიებო ფორმა თქვენი Google ძიების გვერდის ზედა ნაწილში // @name:ko Google 고급 검색 도우미 // @description:ko Google 검색 페이지 상단에 고급 검색 양식을 추가하세요. // @name:nl Google Geavanceerde zoekassistent // @description:nl Voeg een geavanceerd zoekformulier toe bovenaan uw Google-zoekpagina // @name:nb Google Avansert søkeassistent // @description:nb Legg til et avansert søkeskjema øverst på Google-søkesiden din // @name:pl Google Zaawansowany asystent wyszukiwania // @description:pl Dodaj formularz wyszukiwania zaawansowanego na górze strony wyszukiwania Google // @name:pt-BR Google Assistente de pesquisa avançada // @description:pt-BR Adicione um formulário de pesquisa avançada ao topo da sua página de pesquisa do Google // @name:ro Google Asistent de căutare avansată // @description:ro Adăugați un formular de căutare avansată în partea de sus a paginii dvs. de căutare Google // @name:ru Google Расширенный помощник поиска // @description:ru Добавьте форму расширенного поиска в верхнюю часть страницы поиска Google. // @name:sk Google Pokročilý asistent vyhľadávania // @description:sk Pridajte formulár rozšíreného vyhľadávania do hornej časti stránky vyhľadávania Google // @name:sr Google Помоћник за напредну претрагу // @description:sr Додајте образац за напредну претрагу на врх ваше странице Гоогле претраге // @name:sv Google Avancerad sökassistent // @description:sv Lägg till ett avancerat sökformulär överst på din Google-söksida // @name:th Google ผู้ช่วยการค้นหาขั้นสูง // @description:th เพิ่มแบบฟอร์มการค้นหาขั้นสูงที่ด้านบนของหน้าการค้นหาของ Google // @name:tr Google Gelişmiş arama asistanı // @description:tr Google arama sayfanızın üst kısmına gelişmiş bir arama formu ekleyin // @name:ug Google ئىلغار ئىزدەش ياردەمچىسى // @description:ug Google ئىزدەش بېتىڭىزنىڭ ئۈستىگە ئىلغار ئىزدەش جەدۋىلىنى قوشۇڭ // @name:uk Google Розширений пошуковий помічник // @description:uk Додайте форму розширеного пошуку у верхній частині сторінки пошуку Google // @name:vi Google Trợ lý tìm kiếm nâng cao // @description:vi Thêm biểu mẫu tìm kiếm nâng cao vào đầu trang tìm kiếm Google của bạn // @name:zh-TW Google 高級搜尋助手 // @description:zh-TW 在谷歌搜尋頁面頂部新增一個高級搜尋表單 // @name:zh-HK Google 高級搜尋助手 // @description:zh-HK 在谷歌搜尋頁面頂部新增一個高級搜尋表單 // @name:fr-CA Google Assistant de recherche avancée // @description:fr-CA Ajoutez un formulaire de recherche avancée en haut de votre page de recherche Google // @namespace https://github.com/ChinaGodMan/UserScripts // @version 0.1.9.35 // @description Add an advanced search form to the top of the page // @author shiquda &人民的勤务员 // @match *://www.google.com/search* // @include *://*google*/search* // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @license MIT // @icon https://github.com/ChinaGodMan/UserScripts/raw/main/docs/icon/Scripts%20Icons/Google-advance-search.png // @supportURL https://github.com/ChinaGodMan/UserScripts/issues // @homepageURL https://github.com/ChinaGodMan/UserScripts // @downloadURL none // ==/UserScript== (function () { "use strict" let isMobile = false if ( navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/BlackBerry/i) || navigator.userAgent.match(/Windows Phone/i) ) { // On mobile device isMobile = true } let isDarkMode = false try { if ( window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches ) { // Dark mode is enabled isDarkMode = true console.log("Dark mode is enabled.") } } catch (error) { console.log("Failed to determine the color mode.", error) } const userLanguage = "" // You can set your language config here manually. 'zh-CN' & 'en' are supported now. const supportedLanguages = ["zh-CN", "en"] const translation = { as_q: { "zh-CN": "搜索字词:", en: "Search word:", }, as_epq: { "zh-CN": "与以下字词完全匹配:", en: "Match the following words exactly:", }, as_oq: { "zh-CN": "包含以下任意字词:", en: "Contains any of the following words:", }, as_eq: { "zh-CN": "排除以下字词:", en: "Exclude the following words:", }, as_nlo: { "zh-CN": "包含的数字范围:从", en: "Number range: from", }, as_nhi: { "zh-CN": "到:", en: "to:", }, lr: { "zh-CN": "语言:", en: "Language:", }, cr: { "zh-CN": "地区:", en: "Region:", }, as_qdr: { "zh-CN": "最后更新时间:", en: "Last update time:", }, as_sitesearch: { "zh-CN": "网站或域名:", en: "Website or domain:", }, as_occt: { "zh-CN": "字词出现位置:", en: "Word position:", }, as_filetype: { "zh-CN": "文件类型:", en: "File type:", }, tbs: { "zh-CN": "使用权限:", en: "Usage rights:", }, advancedSearch: { "zh-CN": "高级搜索", en: "Advanced Search", }, search: { "zh-CN": "搜索", en: "Search", }, clear: { "zh-CN": "清空", en: "Clear", }, as_qdr_select: { "": { "zh-CN": "请选择", en: "Please select", }, d: { "zh-CN": "一天内", en: "Past 24 hours", }, w: { "zh-CN": "一周内", en: "Past week", }, m: { "zh-CN": "一月内", en: "Past month", }, y: { "zh-CN": "一年内", en: "Past year", }, }, as_occt_select: { "": { "zh-CN": "请选择", en: "Please select", }, title: { "zh-CN": "网页标题中", en: "In the title of the web page", }, body: { "zh-CN": "网页正文中", en: "In the body of the web page", }, url: { "zh-CN": "网页网址中", en: "In the URL of the web page", }, links: { "zh-CN": "指向网页的链接中", en: "In the links to the web page", }, }, } const style = ` #advancedSearchToggleButton { margin-right: 10px; border: none; border-radius: 5px; background-color: #007bff; color: #fff; font-size: 14px; font-weight: bold; margin: 10px; } #advancedSearchFormContainer { position: fixed; ${isMobile ? "top: 150px;" : "top: 130px;"} ${isMobile ? "left: 15px;" : "left: 30px;"} display: none; padding: 10px; border: 1px solid #ccc; border-radius: 5px; font-size: 14px; font-weight: bold; ${isDarkMode ? "background-color: rgba(0, 0, 0, 1);" : "background-color: rgba(255, 255, 255, 1);" } ${isMobile ? "column-count: 2;" : ""} /* 在移动设备上分为两列 */ z-index: 1000; // Make sure the button is on top of the search bar } #advancedSearchFormContainer label { display: block; margin-top: 5px; } #advancedSearchFormContainer input[type="text"] { margin-top: 5px; padding: 5px; border: 1px solid #ccc; border-radius: 5px; } #advancedSearchFormContainer select { margin-top: 5px; padding: 5px; border-radius: 5px; } #advancedSearchFormContainer button { border: none; border-radius: 5px; background-color: #007bff; color: #fff; font-size: 14px; font-weight: bold; margin: 20px; } ` GM_addStyle(style) let language = "en" if (userLanguage.length > 0) { // userLanguage is set manually if (supportedLanguages.includes(userLanguage)) { language = userLanguage } else { console.log(`Unsupported language: ${userLanguage}`) } } else { // Check if any of the user's preferred languages are supported language = navigator.languages .map((lang) => lang.split("-")[0]) // Consider only the language part, not the region .map((lang) => supportedLanguages.find((supportedLang) => supportedLang.split("-")[0] === lang)) // Match with the supported languages .filter(Boolean) // Remove undefined values .shift() // Take the first matched language || "en" // Default to 'en' if no match found console.log(`Here is the language: ${language}`) } // Create user interface const toggleButton = document.createElement("button") toggleButton.className = "nfSF8e" toggleButton.textContent = translation["advancedSearch"][language] toggleButton.id = "advancedSearchToggleButton" if (isMobile) { document.querySelector(".Fh5muf").appendChild(toggleButton) } else { document.querySelector(".logo").appendChild(toggleButton) const searchContainer = document.querySelector(".RNNXgb") searchContainer.appendChild(toggleButton) } // Add minimal style for positioning toggleButton.style.marginTop = "5px" // Add some space above the button toggleButton.style.marginLeft = "5px" // Add some space to the left of the button // Add any additional styles to match the search bar's height or other styling const formContainer = document.createElement("div") formContainer.id = "advancedSearchFormContainer" document.body.appendChild(formContainer) // const form = document.createElement("form") formContainer.appendChild(form) const params = { as_q: translation["as_q"][language], as_epq: translation["as_epq"][language], as_oq: translation["as_oq"][language], as_eq: translation["as_eq"][language], as_nlo: translation["as_nlo"][language], as_nhi: translation["as_nhi"][language], // 'lr': translation['lr'][language], // 'cr': translation['cr'][language], as_qdr: { name: translation["as_qdr"][language], options: { "": translation["as_qdr_select"][""][language], d: translation["as_qdr_select"]["d"][language], w: translation["as_qdr_select"]["w"][language], m: translation["as_qdr_select"]["m"][language], y: translation["as_qdr_select"]["y"][language], }, }, as_sitesearch: translation["as_sitesearch"][language], as_occt: { name: translation["as_occt"][language], options: { "": translation["as_occt_select"][""][language], title: translation["as_occt_select"]["title"][language], body: translation["as_occt_select"]["body"][language], url: translation["as_occt_select"]["url"][language], links: translation["as_occt_select"]["links"][language], }, }, as_filetype: translation["as_filetype"][language], // 'tbs': translation['tbs'][language], } for (const param in params) { if (typeof params[param] === "object") { const label = document.createElement("label") label.textContent = params[param].name const select = document.createElement("select") select.name = param Object.keys(params[param]["options"]).forEach((option) => { const optionElement = document.createElement("option") optionElement.value = option optionElement.textContent = params[param]["options"][option] select.appendChild(optionElement) }) form.appendChild(label) form.appendChild(select) form.appendChild(document.createElement("br")) continue } const label = document.createElement("label") label.textContent = params[param] const input = document.createElement("input") input.name = param input.type = "text" form.appendChild(label) form.appendChild(input) form.appendChild(document.createElement("br")) } const searchButton = document.createElement("button") searchButton.textContent = translation["search"][language] form.appendChild(searchButton) // Add a clear button to reset the form const clearButton = document.createElement("button") clearButton.textContent = translation["clear"][language] clearButton.addEventListener("click", function (event) { event.preventDefault() form.reset() }) form.appendChild(clearButton) // Load saved data and fill the form when opening a new page window.addEventListener("load", function () { for (const param in params) { const savedValue = GM_getValue(param) if (savedValue) { form[param].value = savedValue } } }) // Save form data to Greasemonkey storage form.addEventListener("input", function () { for (const param in params) { GM_setValue(param, form[param].value) } }) // Toggle the form display toggleButton.addEventListener("click", function (event) { event.preventDefault() let status = formContainer.style.display status = status === "none" || status === "" ? "block" : "none" formContainer.style.display = status }) // Submit the form form.addEventListener("submit", function (event) { event.preventDefault() const searchParams = new URLSearchParams() for (const param in params) { const value = form[param].value if (value) { searchParams.set(param, value) } } const searchUrl = "https://www.google.com/search?" + searchParams.toString() window.location.href = searchUrl }) })()