搜索引擎结果 URL 修改器

这个 Tampermonkey 脚本通过修改搜索引擎结果中的 URL,重定向到替代网站,从而增强了您的搜索引擎使用体验,允许更自定义和高效的浏览体验。您还可以添加自定义的 URL 修改规则到脚本中,并欢迎将您的规则提交给这个脚本,使其变得更加有用。

  1. // ==UserScript==
  2. // @name URL Modifier for Search Engines
  3. // @name:zh-CN 搜索引擎结果 URL 修改器
  4. // @name:zh-TW 搜索引擎結果 URL 修改器
  5. // @name:es Modificador de URL para Motores de Búsqueda
  6. // @name:pt Modificador de URL para Motores de Busca
  7. // @name:ru Изменитель URL для Поисковых Систем
  8. // @name:ja 検索エンジン用 URL 修正
  9. // @name:fr Modificateur d'URL pour les moteurs de recherche
  10. // @name:de URL Modifier für Suchmaschinen
  11. // @name:nl URL Wijzigingsmodule voor Zoekmachines
  12. // @name:sv URL Modifierare för Sökmotorer
  13. // @name:fi URL Muokkain Hakukoneille
  14. // @name:da URL Modifier til Søgemaskiner
  15. // @name:ko 검색 엔진용 URL 수정기
  16. // @name:it Modificatore di URL per Motori di Ricerca
  17. // @name:cs Modifikátor URL pro vyhledávače
  18. // @name:el Μετατροπέας URL για Μηχανές Αναζήτησης
  19. // @name:he מתקן URL למנועי חיפוש
  20. // @name:pl Modyfikator URL dla Wyszukiwarek
  21. // @name:tr Arama Motorları için URL Değiştirici
  22. // @name:ro Modificator de URL pentru Motoare de Căutare
  23. // @name:hu URL Módosító a Keresőmotorokhoz
  24. // @name:no URL Modifier for Søkemotorer
  25. // @name:uk Модифікатор URL для Пошукових Систем
  26. // @name:id Pengubah URL untuk Mesin Pencari
  27. // @name:vi Bộ Chỉnh Sửa URL cho Các Công Cụ Tìm Kiếm
  28. // @name:hi सर्च इंजनों के लिए URL संशोधक
  29. // @name:fa تغییردهنده URL برای موتورهای جستجو
  30.  
  31. // @version 2.6.5
  32. // @author Domenic
  33. // @namespace http://tampermonkey.net/
  34.  
  35. // @description This Tampermonkey script enhances your search engine usage by modifying (redirecting) URLs in the search result of search engines, redirecting to alternative sites, allowing for a more customized and efficient browsing experience. You can also add you custom URL modification rule to the script and are welcomed to commit your rules to this script to make it much more useful.
  36. // @description:zh-cn 这个 Tampermonkey 脚本通过修改搜索引擎结果中的 URL,重定向到替代网站,从而增强了您的搜索引擎使用体验,允许更自定义和高效的浏览体验。您还可以添加自定义的 URL 修改规则到脚本中,并欢迎将您的规则提交给这个脚本,使其变得更加有用。
  37. // @description:zh-tw 這個 Tampermonkey 腳本通過修改搜索引擎結果中的 URL,重定向到替代網站,從而增強了您的搜索引擎使用體驗,允許更自定義和高效的瀏覽體驗。您還可以添加自定義的 URL 修改規則到腳本中,並歡迎將您的規則提交給這個腳本,使其變得更加有用。
  38. // @description:es Este script de Tampermonkey mejora tu uso del motor de búsqueda modificando las URLs en los resultados de búsqueda de los motores de búsqueda, redirigiendo a sitios alternativos, lo que permite una experiencia de navegación más personalizada y eficiente. También puedes añadir tu regla de modificación de URL personalizada al script y se te invita a comprometer tus reglas con este script para hacerlo aún más útil.
  39. // @description:pt Este script do Tampermonkey aprimora seu uso do mecanismo de busca modificando URLs nos resultados de pesquisa dos motores de busca, redirecionando para sites alternativos, permitindo uma experiência de navegação mais personalizada e eficiente. Você também pode adicionar sua própria regra de modificação de URL ao script e é bem-vindo para comprometer suas regras com este script para torná-lo ainda mais útil.
  40. // @description:ru Этот скрипт Tampermonkey улучшает использование поисковой системы за счет модификации URL-адресов в результатах поиска, перенаправляя на альтернативные сайты, что позволяет более настраиваемый и эффективный опыт просмотра. Вы также можете добавить свое собственное правило модификации URL в скрипт и приветствуется ваш вклад в этот скрипт своими правилами, чтобы сделать его еще более полезным.
  41. // @description:ja この Tampermonkey スクリプトは、検索エンジンの検索結果の URL を変更して代替サイトにリダイレクトすることで、検索エンジンの使用体験を向上させ、よりカスタマイズされ効率的なブラウジング体験を可能にします。また、カスタム URL 変更ルールをスクリプトに追加することができ、このスクリプトをさらに便利にするためにあなたのルールをコミットすることを歓迎します。
  42. // @description:fr Ce script Tampermonkey améliore votre utilisation du moteur de recherche en modifiant les URL dans les résultats de recherche des moteurs de recherche, redirigeant vers des sites alternatifs, permettant une expérience de navigation plus personnalisée et efficace. Vous pouvez également ajouter votre propre règle de modification d'URL au script et êtes invité à engager vos règles avec ce script pour le rendre encore plus utile.
  43. // @description:de Dieses Tampermonkey-Skript verbessert Ihre Nutzung der Suchmaschine, indem es URLs in den Suchergebnissen von Suchmaschinen modifiziert, auf alternative Seiten umleitet und so ein individuelleres und effizienteres Browsing-Erlebnis ermöglicht. Sie können auch Ihre eigene URL-Modifikationsregel zum Skript hinzufügen und sind eingeladen, Ihre Regeln zu diesem Skript beizutragen, um es noch nützlicher zu machen.
  44. // @description:nl Dit Tampermonkey-script verbetert uw zoekmachinegebruik door URL's in de zoekresultaten van zoekmachines te wijzigen, om te leiden naar alternatieve sites, wat een meer aangepaste en efficiënte browse-ervaring mogelijk maakt. U kunt ook uw eigen URL-wijzigingsregel aan het script toevoegen en u wordt uitgenodigd om uw regels aan dit script te committeren om het nog nuttiger te maken.
  45. // @description:sv Detta Tampermonkey-skript förbättrar din användning av sökmotorer genom att modifiera URL:er i sökresultaten från sökmotorer, omdirigera till alternativa webbplatser, vilket möjliggör en mer anpassad och effektiv surfupplevelse. Du kan också lägga till din egen anpassade URL-modifieringsregel till skriptet och är välkommen att bidra med dina regler till detta skript för att göra det ännu mer användbart.
  46. // @description:fi Tämä Tampermonkey-skripti tehostaa hakukoneiden käyttöäsi muokkaamalla hakutulosten URL-osoitteita hakukoneissa, ohjaten vaihtoehtoisille sivustoille, mahdollistaen mukautetumman ja tehokkaamman selailukokemuksen. Voit myös lisätä omia URL-muokkaussääntöjäsi skriptiin ja olet tervetullut lähettämään sääntöjäsi tähän skriptiin, jotta se olisi vieläkin hyödyllisempi.
  47. // @description:da Dette Tampermonkey script forbedrer din brug af søgemaskiner ved at ændre URL'er i søgemaskinens søgeresultater, omdirigere til alternative sider, hvilket tillader en mere tilpasset og effektiv browsing oplevelse. Du kan også tilføje din egen tilpassede URL-ændringsregel til scriptet og er velkommen til at bidrage med dine regler til dette script for at gøre det endnu mere nyttigt.
  48. // @description:ko 이 Tampermonkey 스크립트는 검색 엔진의 검색 결과에서 URL 을 수정하여 대체 사이트로 리디렉션함으로써 검색 엔진 사용을 개선하고 더 맞춤화되고 효율적인 브라우징 경험을 가능하게 합니다. 또한 사용자만의 URL 수정 규칙을 스크립트에 추가할 수 있으며, 이 스크립트를 더 유용하게 만들기 위해 규칙을 커밋하는 것을 환영합니다.
  49. // @description:it Questo script di Tampermonkey migliora l'uso del motore di ricerca modificando gli URL nei risultati di ricerca dei motori di ricerca, reindirizzando a siti alternativi, consentendo un'esperienza di navigazione più personalizzata ed efficiente. Puoi anche aggiungere la tua regola di modifica dell'URL allo script e sei invitato a impegnare le tue regole con questo script per renderlo ancora più utile.
  50. // @description:cs Tento skript Tampermonkey vylepšuje vaše používání vyhledávače úpravou URL výsledků vyhledávání na vyhledávačích, přesměrováním na alternativní stránky, což umožňuje více přizpůsobený a efektivnější prohlížecí zážitek. Můžete také přidat své vlastní pravidlo úpravy URL do skriptu a jste vítáni, abyste svá pravidla s tímto skriptem zavázali, aby byl ještě užitečnější.
  51. // @description:el Αυτό το σενάριο Tampermonkey ενισχύει τη χρήση της μηχανής αναζήτησης σας με την τροποποίηση των URL στα αποτελέσματα αναζήτησης των μηχανών αναζήτησης, ανακατευθύνοντας σε εναλλακτικούς ιστότοπους, επιτρέποντας μια πιο προσαρμοσμένη και αποδοτική εμπειρία περιήγησης. Μπορείτε επίσης να προσθέσετε τον δικό σας κανόνα τροποποίησης URL στο σενάριο και είστε ευπρόσδεκτοι να δεσμεύσετε τους κανόνες σας σε αυτό το σενάριο για να το κάνετε ακόμα πιο χρήσιμο.
  52. // @description:he סקריפט Tampermonkey זה משפר את השימוש במנועי חיפוש שלך על ידי שינוי URL-ים בתוצאות החיפוש של מנועי חיפוש, הפניה לאתרים חלופיים, מה שמאפשר חוויית גלישה מותאמת אישית ויעילה יותר. תוכל גם להוסיף כלל שינוי URL מותאם אישית לסקריפט ולהתחייב בכללים שלך לסקריפט זה כדי להפוך אותו לשימושי יותר.
  53. // @description:pl Ten skrypt Tampermonkey ulepsza korzystanie z wyszukiwarek internetowych poprzez modyfikację URL-i w wynikach wyszukiwania, przekierowując do alternatywnych stron, co pozwala na bardziej spersonalizowane i efektywne przeglądanie sieci. Możesz również dodać własne reguły modyfikacji URL do skryptu i jesteś mile widziany, aby dodać swoje reguły do tego skryptu, aby uczynić go jeszcze bardziej użytecznym.
  54. // @description:tr Bu Tampermonkey betiği, arama motoru sonuçlarındaki URL'leri değiştirerek alternatif sitelere yönlendirme yaparak arama motoru kullanımınızı geliştirir, daha özelleştirilmiş ve verimli bir tarama deneyimi sağlar. Ayrıca özel URL değiştirme kuralınızı betiğe ekleyebilir ve bu betiği daha faydalı hale getirmek için kuralınızı bu betikle taahhüt etmeye davet edilirsiniz.
  55. // @description:ro Acest script Tampermonkey îmbunătățește utilizarea motorului de căutare prin modificarea URL-urilor în rezultatele căutării motoarelor de căutare, redirecționând către site-uri alternative, permițând o experiență de navigare mai personalizată și eficientă. Puteți adăuga, de asemenea, regula de modificare a URL-ului personalizat la script și sunteți bineveniți să vă angajați regulile la acest script pentru a-l face mult mai util.
  56. // @description:no Dette Tampermonkey-skriptet forbedrer din bruk av søkemotorer ved å endre URL-er i søkeresultatet fra søkemotorer, omdirigere til alternative nettsteder, noe som tillater en mer tilpasset og effektiv nettleseropplevelse. Du kan også legge til din egen tilpassede URL-modifikasjonsregel i skriptet og er velkommen til å forplikte dine regler til dette skriptet for å gjøre det mye mer nyttig.
  57. // @description:hu Ez a Tampermonkey szkript fokozza a keresőmotorok használatát a keresési eredmények URL-jeinek módosításával, alternatív oldalakra való átirányítással, lehetővé téve egy személyre szabottabb és hatékonyabb böngészési élményt. Hozzáadhatsz saját URL módosítási szabályokat a szkripthez, és szívesen látjuk, ha hozzájárulsz a szabályaidat ehhez a szkripthez, hogy még hasznosabbá tegyük.
  58. // @description:uk Цей скрипт для Tampermonkey покращує ваше використання пошукових систем шляхом модифікації URL-адрес у результатах пошуку пошукових систем, перенаправляючи на альтернативні сайти, що дозволяє отримати більш налаштований і ефективний досвід перегляду. Ви також можете додати власне правило модифікації URL до скрипта та вітаєтеся додати свої правила до цього скрипта, щоб зробити його набагато кориснішим.
  59. // @description:id Skrip Tampermonkey ini meningkatkan penggunaan mesin pencari Anda dengan mengubah URL dalam hasil pencarian mesin pencari, mengarahkan ke situs alternatif, memungkinkan pengalaman browsing yang lebih disesuaikan dan efisien. Anda juga dapat menambahkan aturan modifikasi URL kustom ke dalam skrip dan dipersilakan untuk mencommit aturan Anda ke skrip ini agar menjadi lebih berguna.
  60. // @description:vi Script Tampermonkey này cải thiện việc sử dụng công cụ tìm kiếm của bạn bằng cách chỉnh sửa URL trong kết quả tìm kiếm của các công cụ tìm kiếm, chuyển hướng đến các trang thay thế, cho phép trải nghiệm duyệt web tùy chỉnh và hiệu quả hơn. Bạn cũng có thể thêm quy tắc chỉnh sửa URL tùy chỉnh của mình vào script và được chào đón để cam kết các quy tắc của mình với script này để làm cho nó hữu ích hơn.
  61. // @description:hi यह Tampermonkey स्क्रिप्ट आपके सर्च इंजन उपयोग को बेहतर बनाती है जिससे सर्च इंजन के परिणामों में URLs को संशोधित करके वैकल्पिक साइटों पर पुनर्निर्देशित किया जा सकता है, जिससे अधिक कस्टमाइज़्ड और कुशल ब्राउज़िंग अनुभव प्रदान किया जा सकता है। आप इस स्क्रिप्ट में अपना कस्टम URL संशोधन नियम जोड़ सकते हैं और इसे अधिक उपयोगी बनाने के लिए अपने नियमों को इस स्क्रिप्ट में कमिट करने का स्वागत है।
  62. // @description:fa این اسکریپت Tampermonkey با تغییر URL‌ها در نتایج جستجوی موتورهای جستجو و هدایت به سایت‌های جایگزین، استفاده شما از موتور جستجو را بهبود می‌بخشد و امکان تجربه‌ای شخصی‌سازی شده و کارآمدتر در مرور وب را فراهم می‌آورد. شما همچنین می‌توانید قانون تغییر URL سفارشی خود را به اسکریپت اضافه کنید و برای کردن این اسکریپت به ابزاری مفیدتر، دعوت به ارسال قوانین خود به این اسکریپت می‌شوید.
  63.  
  64. // @match *://www.google.com/*?*
  65. // @match *://www.google.ad/*?*
  66. // @match *://www.google.ae/*?*
  67. // @match *://www.google.com.af/*?*
  68. // @match *://www.google.com.ag/*?*
  69. // @match *://www.google.al/*?*
  70. // @match *://www.google.am/*?*
  71. // @match *://www.google.co.ao/*?*
  72. // @match *://www.google.com.ar/*?*
  73. // @match *://www.google.as/*?*
  74. // @match *://www.google.at/*?*
  75. // @match *://www.google.com.au/*?*
  76. // @match *://www.google.az/*?*
  77. // @match *://www.google.ba/*?*
  78. // @match *://www.google.com.bd/*?*
  79. // @match *://www.google.be/*?*
  80. // @match *://www.google.bf/*?*
  81. // @match *://www.google.bg/*?*
  82. // @match *://www.google.com.bh/*?*
  83. // @match *://www.google.bi/*?*
  84. // @match *://www.google.bj/*?*
  85. // @match *://www.google.com.bn/*?*
  86. // @match *://www.google.com.bo/*?*
  87. // @match *://www.google.com.br/*?*
  88. // @match *://www.google.bs/*?*
  89. // @match *://www.google.bt/*?*
  90. // @match *://www.google.co.bw/*?*
  91. // @match *://www.google.by/*?*
  92. // @match *://www.google.com.bz/*?*
  93. // @match *://www.google.ca/*?*
  94. // @match *://www.google.cd/*?*
  95. // @match *://www.google.cf/*?*
  96. // @match *://www.google.cg/*?*
  97. // @match *://www.google.ch/*?*
  98. // @match *://www.google.ci/*?*
  99. // @match *://www.google.co.ck/*?*
  100. // @match *://www.google.cl/*?*
  101. // @match *://www.google.cm/*?*
  102. // @match *://www.google.cn/*?*
  103. // @match *://www.google.com.co/*?*
  104. // @match *://www.google.co.cr/*?*
  105. // @match *://www.google.com.cu/*?*
  106. // @match *://www.google.cv/*?*
  107. // @match *://www.google.com.cy/*?*
  108. // @match *://www.google.cz/*?*
  109. // @match *://www.google.de/*?*
  110. // @match *://www.google.dj/*?*
  111. // @match *://www.google.dk/*?*
  112. // @match *://www.google.dm/*?*
  113. // @match *://www.google.com.do/*?*
  114. // @match *://www.google.dz/*?*
  115. // @match *://www.google.com.ec/*?*
  116. // @match *://www.google.ee/*?*
  117. // @match *://www.google.com.eg/*?*
  118. // @match *://www.google.es/*?*
  119. // @match *://www.google.com.et/*?*
  120. // @match *://www.google.fi/*?*
  121. // @match *://www.google.com.fj/*?*
  122. // @match *://www.google.fm/*?*
  123. // @match *://www.google.fr/*?*
  124. // @match *://www.google.ga/*?*
  125. // @match *://www.google.ge/*?*
  126. // @match *://www.google.gg/*?*
  127. // @match *://www.google.com.gh/*?*
  128. // @match *://www.google.com.gi/*?*
  129. // @match *://www.google.gl/*?*
  130. // @match *://www.google.gm/*?*
  131. // @match *://www.google.gr/*?*
  132. // @match *://www.google.com.gt/*?*
  133. // @match *://www.google.gy/*?*
  134. // @match *://www.google.com.hk/*?*
  135. // @match *://www.google.hn/*?*
  136. // @match *://www.google.hr/*?*
  137. // @match *://www.google.ht/*?*
  138. // @match *://www.google.hu/*?*
  139. // @match *://www.google.co.id/*?*
  140. // @match *://www.google.ie/*?*
  141. // @match *://www.google.co.il/*?*
  142. // @match *://www.google.im/*?*
  143. // @match *://www.google.co.in/*?*
  144. // @match *://www.google.iq/*?*
  145. // @match *://www.google.is/*?*
  146. // @match *://www.google.it/*?*
  147. // @match *://www.google.je/*?*
  148. // @match *://www.google.com.jm/*?*
  149. // @match *://www.google.jo/*?*
  150. // @match *://www.google.co.jp/*?*
  151. // @match *://www.google.co.ke/*?*
  152. // @match *://www.google.com.kh/*?*
  153. // @match *://www.google.ki/*?*
  154. // @match *://www.google.kg/*?*
  155. // @match *://www.google.co.kr/*?*
  156. // @match *://www.google.com.kw/*?*
  157. // @match *://www.google.kz/*?*
  158. // @match *://www.google.la/*?*
  159. // @match *://www.google.com.lb/*?*
  160. // @match *://www.google.li/*?*
  161. // @match *://www.google.lk/*?*
  162. // @match *://www.google.co.ls/*?*
  163. // @match *://www.google.lt/*?*
  164. // @match *://www.google.lu/*?*
  165. // @match *://www.google.lv/*?*
  166. // @match *://www.google.com.ly/*?*
  167. // @match *://www.google.co.ma/*?*
  168. // @match *://www.google.md/*?*
  169. // @match *://www.google.me/*?*
  170. // @match *://www.google.mg/*?*
  171. // @match *://www.google.mk/*?*
  172. // @match *://www.google.ml/*?*
  173. // @match *://www.google.com.mm/*?*
  174. // @match *://www.google.mn/*?*
  175. // @match *://www.google.com.mt/*?*
  176. // @match *://www.google.mu/*?*
  177. // @match *://www.google.mv/*?*
  178. // @match *://www.google.mw/*?*
  179. // @match *://www.google.com.mx/*?*
  180. // @match *://www.google.com.my/*?*
  181. // @match *://www.google.co.mz/*?*
  182. // @match *://www.google.com.na/*?*
  183. // @match *://www.google.com.ng/*?*
  184. // @match *://www.google.com.ni/*?*
  185. // @match *://www.google.ne/*?*
  186. // @match *://www.google.nl/*?*
  187. // @match *://www.google.no/*?*
  188. // @match *://www.google.com.np/*?*
  189. // @match *://www.google.nr/*?*
  190. // @match *://www.google.nu/*?*
  191. // @match *://www.google.co.nz/*?*
  192. // @match *://www.google.com.om/*?*
  193. // @match *://www.google.com.pa/*?*
  194. // @match *://www.google.com.pe/*?*
  195. // @match *://www.google.com.pg/*?*
  196. // @match *://www.google.com.ph/*?*
  197. // @match *://www.google.com.pk/*?*
  198. // @match *://www.google.pl/*?*
  199. // @match *://www.google.pn/*?*
  200. // @match *://www.google.com.pr/*?*
  201. // @match *://www.google.ps/*?*
  202. // @match *://www.google.pt/*?*
  203. // @match *://www.google.com.py/*?*
  204. // @match *://www.google.com.qa/*?*
  205. // @match *://www.google.ro/*?*
  206. // @match *://www.google.ru/*?*
  207. // @match *://www.google.rw/*?*
  208. // @match *://www.google.com.sa/*?*
  209. // @match *://www.google.com.sb/*?*
  210. // @match *://www.google.sc/*?*
  211. // @match *://www.google.se/*?*
  212. // @match *://www.google.com.sg/*?*
  213. // @match *://www.google.sh/*?*
  214. // @match *://www.google.si/*?*
  215. // @match *://www.google.sk/*?*
  216. // @match *://www.google.com.sl/*?*
  217. // @match *://www.google.sn/*?*
  218. // @match *://www.google.so/*?*
  219. // @match *://www.google.sm/*?*
  220. // @match *://www.google.sr/*?*
  221. // @match *://www.google.st/*?*
  222. // @match *://www.google.com.sv/*?*
  223. // @match *://www.google.td/*?*
  224. // @match *://www.google.tg/*?*
  225. // @match *://www.google.co.th/*?*
  226. // @match *://www.google.com.tj/*?*
  227. // @match *://www.google.tl/*?*
  228. // @match *://www.google.tm/*?*
  229. // @match *://www.google.tn/*?*
  230. // @match *://www.google.to/*?*
  231. // @match *://www.google.com.tr/*?*
  232. // @match *://www.google.tt/*?*
  233. // @match *://www.google.com.tw/*?*
  234. // @match *://www.google.co.tz/*?*
  235. // @match *://www.google.com.ua/*?*
  236. // @match *://www.google.co.ug/*?*
  237. // @match *://www.google.co.uk/*?*
  238. // @match *://www.google.com.uy/*?*
  239. // @match *://www.google.co.uz/*?*
  240. // @match *://www.google.com.vc/*?*
  241. // @match *://www.google.co.ve/*?*
  242. // @match *://www.google.co.vi/*?*
  243. // @match *://www.google.com.vn/*?*
  244. // @match *://www.google.vu/*?*
  245. // @match *://www.google.ws/*?*
  246. // @match *://www.google.rs/*?*
  247. // @match *://www.google.co.za/*?*
  248. // @match *://www.google.co.zm/*?*
  249. // @match *://www.google.co.zw/*?*
  250. // @match *://www.google.cat/*?*
  251.  
  252. // @match *://www.bing.com/*?*
  253.  
  254. // @match *://search.yahoo.com/search*
  255. // @match *://*.search.yahoo.com/search*
  256. // @match *://search.yahoo.co.jp/*?*
  257.  
  258. // @match *://www.baidu.com/s?*
  259.  
  260. // @match *://yandex.com/search/?*
  261. // @match *://yandex.ru/search/?*
  262.  
  263. // @match *://search.disroot.org/search*
  264. // @match *://searx.tiekoetter.com/search*
  265. // @match *://search.bus-hit.me/search*
  266. // @match *://search.inetol.net/search*
  267. // @match *://priv.au/search*
  268. // @match *://searx.be/search*
  269. // @match *://searxng.site/search*
  270. // @match *://search.hbubli.cc/search*
  271. // @match *://search.im-in.space/search*
  272. // @match *://opnxng.com/search*
  273. // @match *://search.upinmars.com/search*
  274. // @match *://search.sapti.me/search*
  275. // @match *://freesearch.club/search*
  276. // @match *://xo.wtf/search*
  277. // @match *://www.gruble.de/search*
  278. // @match *://searx.tuxcloud.net/search*
  279. // @match *://baresearch.org/search*
  280. // @match *://searx.daetalytica.io/search*
  281. // @match *://etsi.me/search*
  282. // @match *://search.leptons.xyz/search*
  283. // @match *://search.rowie.at/search*
  284. // @match *://search.mdosch.de/search*
  285. // @match *://searx.catfluori.de/search*
  286. // @match *://searx.si/search*
  287. // @match *://searx.namejeff.xyz/search*
  288. // @match *://search.itstechtime.com/search*
  289. // @match *://s.mble.dk/search*
  290. // @match *://searx.kutay.dev/search*
  291. // @match *://ooglester.com/search*
  292. // @match *://searx.ox2.fr/search*
  293. // @match *://searx.techsaviours.org/search*
  294. // @match *://searx.perennialte.ch/search*
  295. // @match *://s.trung.fun/searxng/search*
  296. // @match *://search.in.projectsegfau.lt/search*
  297. // @match *://search.projectsegfau.lt/search*
  298. // @match *://darmarit.org/searx/search*
  299. // @match *://searx.lunar.icu/search*
  300. // @match *://nyc1.sx.ggtyler.dev/search*
  301. // @match *://search.rhscz.eu/search*
  302. // @match *://paulgo.io/search*
  303. // @match *://northboot.xyz/search*
  304. // @match *://searx.zhenyapav.com/search*
  305. // @match *://searxng.ch/search*
  306. // @match *://copp.gg/search*
  307. // @match *://searx.sev.monster/search*
  308. // @match *://searx.oakleycord.dev/search*
  309. // @match *://searx.juancord.xyz/search*
  310. // @match *://searx.work/search*
  311. // @match *://search.ononoki.org/search*
  312. // @match *://search.demoniak.ch/search*
  313. // @match *://searx.cthd.icu/search*
  314. // @match *://searx.fmhy.net/search*
  315. // @match *://searx.headpat.exchange/search*
  316. // @match *://sex.finaltek.net/search*
  317. // @match *://search.gcomm.ch/search*
  318. // @match *://search.smnz.de/search*
  319. // @match *://searx.ankha.ac/search*
  320. // @match *://search.lvkaszus.pl/search*
  321. // @match *://searx.nobulart.com/search*
  322. // @match *://sx.t-1.org/search*
  323. // @match *://www.jabber-germany.de/searx/search*
  324. // @match *://sx.catgirl.cloud/search*
  325. // @match *://sx.vern.cc/searxng/search*
  326.  
  327. // @match *://www.startpage.com/search*
  328. // @match *://www.startpage.com/sp/search*
  329.  
  330. // @match *://search.brave.com/*?*
  331.  
  332. // @match *://duckduckgo.com
  333. // @match *://duckduckgo.com/?*
  334.  
  335. // @match *://ghosterysearch.com/*?*
  336.  
  337. // @match *://presearch.com/*?*
  338.  
  339. // @match *://metager.org/*meta/meta.ger3*
  340. // @match *://metager.de/*meta/meta.ger3*
  341.  
  342. // @match *://4get.ca/*?*
  343. // @match *://4get.silly.computer/*?*
  344. // @match *://4get.plunked.party/*?*
  345. // @match *://4get.konakona.moe/*?*
  346. // @match *://4get.sijh.net/*?*
  347. // @match *://4get.hbubli.cc/*?*
  348. // @match *://4get.perennialte.ch/*?*
  349. // @match *://4get.zzls.xyz/*?*
  350. // @match *://4getus.zzls.xyz/*?*
  351. // @match *://4get.seitan-ayoub.lol/*?*
  352. // @match *://4get.dcs0.hu/*?*
  353. // @match *://4get.psily.garden/*?*
  354. // @match *://4get.lvkaszus.pl/*?*
  355. // @match *://4get.kizuki.lol/*?*
  356.  
  357. // @match *://search.ahwx.org/search.php?*
  358. // @match *://search2.ahwx.org/search.php?*
  359. // @match *://search3.ahwx.org/search.php?*
  360. // @match *://ly.owo.si/search.php?*
  361. // @match *://librey.franklyflawless.org/search.php?*
  362. // @match *://librey.org/search.php?*
  363. // @match *://search.davidovski.xyz/search.php?*
  364. // @match *://search.milivojevic.in.rs/search.php?*
  365. // @match *://glass.prpl.wtf/search.php?*
  366. // @match *://librex.uk.to/search.php?*
  367. // @match *://librey.ix.tc/search.php?*
  368. // @match *://search.funami.tech/search.php?*
  369. // @match *://librex.retro-hax.net/search.php?*
  370. // @match *://librex.nohost.network/search.php?*
  371. // @match *://search.pabloferreiro.es/search.php?*
  372. // @match *://librey.baczek.me/search.php?*
  373. // @match *://lx.benike.me/search.php?*
  374. // @match *://search.seitan-ayoub.lol/search.php?*
  375. // @match *://librey.myroware.net/search.php?*
  376. // @match *://librey.nezumi.party/search.php?*
  377. // @match *://search.zeroish.xyz/search.php?*
  378.  
  379. // @match *://stract.com/*?*
  380.  
  381. // @match *://search.albony.xyz/*?*
  382. // @match *://search.garudalinux.org/*?*
  383. // @match *://search.dr460nf1r3.org/*?*
  384. // @match *://search.nezumi.party/*?*
  385. // @match *://s.tokhmi.xyz/*?*
  386. // @match *://search.sethforprivacy.com/*?*
  387. // @match *://whoogle.dcs0.hu/*?*
  388. // @match *://whoogle.lunar.icu/*?*
  389. // @match *://gowogle.voring.me/*?*
  390. // @match *://whoogle.privacydev.net/*?*
  391. // @match *://whoogle.hostux.net/*?*
  392. // @match *://wg.vern.cc/*?*
  393. // @match *://whoogle.hxvy0.gq/*?*
  394. // @match *://whoogle.ungovernable.men/*?*
  395. // @match *://whoogle2.ungovernable.men/*?*
  396. // @match *://whoogle3.ungovernable.men/*?*
  397. // @match *://wgl.frail.duckdns.org/*?*
  398. // @match *://whoogle.no-logs.com/*?*
  399. // @match *://whoogle.ftw.lol/*?*
  400. // @match *://whoogle-search--replitcomreside.repl.co/*?*
  401. // @match *://search.notrustverify.ch/*?*
  402. // @match *://whoogle.datura.network/*?*
  403. // @match *://whoogle.yepserver.xyz/*?*
  404.  
  405. // @match *://www.etools.ch/searchSubmit.do*
  406. // @match *://www.etools.ch/mobileSearch.do*
  407.  
  408. // @match *://www.mojeek.com/*?*
  409. // @match *://www.mojeek.co.uk/*?*
  410.  
  411. // @match *://wiby.me/?*
  412. // @match *://yep.com/web?*
  413. // @match *://www.torry.io/search*
  414. // @match *://www.qwant.com/?*
  415. // @match *://www.ecosia.org/*?*
  416. // @match *://search.becovi.com/serp.php?*
  417. // @match *://good-search.org/*search/?*
  418. // @match *://www.alltheinternet.com/?*
  419. // @match *://www.searchalot.com/?*
  420. // @match *://search.aol.com/*search*
  421. // @match *://www.onesearch.com/*search*
  422. // @match *://www.info.com/serp?*
  423. // @match *://oceanhero.today/web?*
  424.  
  425. // @match *://swisscows.com/*/web?*
  426.  
  427. // @match *://search.lilo.org/?*
  428. // @match *://search.entireweb.com/*?*
  429. // @match *://www.tadadoo.com/*?*
  430. // @match *://search.gmx.com/web/result?*
  431. // @match *://search.gmx.com/web?*
  432. // @match *://youcare.world/all?*
  433. // @match *://search.lycos.com/web/?*
  434. // @match *://alohafind.com/search/?*
  435. // @match *://spot.ecloud.global/search*
  436. // @match *://qmamu.com/*?*
  437. // @match *://search.carrot2.org/*
  438. // @match *://www.nona.de/?*
  439. // @match *://www.sapo.pt/pesquisa/web/tudo?*
  440. // @match *://www.exalead.com/search/web/results/?*
  441. // @match *://cgi.search.biglobe.ne.jp/cgi-bin/search2-b?*
  442. // @match *://search.goo.ne.jp/web.jsp?*
  443. // @match *://search.walla.co.il/?*
  444. // @match *://coccoc.com/*?*
  445. // @match *://search.seznam.cz/?*
  446. // @match *://www.startsiden.no/sok/?*
  447. // @match *://search.marginalia.nu/*?*
  448. // @match *://mwmbl.org/?*
  449. // @match *://search.naver.com/search.naver?*
  450. // @match *://gibiru.com/results.html?*
  451. // @match *://www.lukol.com/s.php?*
  452. // @match *://www.draze.com/web/*?*
  453.  
  454. // @match *://www.yelliot.com/search/?*
  455. // @match *://fr.yelliot.com/search/?*
  456. // @match *://ar.yelliot.com/search/?*
  457. // @match *://es.yelliot.com/search/?*
  458. // @match *://de.yelliot.com/search/?*
  459. // @match *://it.yelliot.com/search/?*
  460. // @match *://ru.yelliot.com/search/?*
  461. // @match *://cn.yelliot.com/search/?*
  462. // @match *://in.yelliot.com/search/?*
  463. // @match *://pt.yelliot.com/search/?*
  464.  
  465. // @match *://efind.com/search*
  466. // @match *://fireball.de/de/*?*
  467. // @match *://freespoke.com/search/web?*
  468. // @match *://gogoprivate.com/search*
  469. // @match *://resulthunter.com/*?*
  470. // @match *://search.givewater.com/serp?*
  471. // @match *://results.excite.com/serp?*
  472. // @match *://www.webcrawler.com/serp?*
  473. // @match *://www.metacrawler.com/serp?*
  474. // @match *://www.dogpile.com/serp?*
  475. // @match *://www.infospace.com/serp?*
  476. // @match *://www.refseek.com/*?*
  477. // @match *://www.zapmeta.com/*?*
  478. // @match *://www.izito.com/*?*
  479. // @match *://www.ask.com/web?*
  480. // @match *://www.pronto.com/web?*
  481. // @match *://anoox.com/find.php?*
  482.  
  483. // @match *://kagi.com/search*
  484.  
  485. // @grant none
  486. // @run-at document-end
  487. // @license GPL-2.0-only
  488. // ==/UserScript==
  489.  
  490. (function () {
  491. 'use strict';
  492.  
  493. // Define URL modification rules with precompiled regex
  494. const urlModificationRules = [
  495. // {
  496. // matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?(?:https?:\/\/)(?:[\w-]+\.|)((?:imdb|imgur|instagram|medium|odysee|quora|reddit|tiktok|twitter|wikipedia|youtube)\.(?:[a-z]+).*?)(?:$|\/RK=.*|&sa=.*)/),
  497. // replaceWith: 'https://farside.link/$1'
  498. // },
  499. {
  500. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/((?!test)[a-z]+)\.?m?\.wikipedia\.org\/(?:[a-z]+|wiki)\/(?!Special:Search)(.*?)(?:$|\/RK=.*|&sa=.*)/),
  501. replaceWith: 'https://www.wikiwand.com/$1/$2'
  502. },
  503. {
  504. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/zh\.?m?\.wikipedia\.org\/(?:zh-hans|wiki)\/(.*?)(?:$|\/RK=.*|&sa=.*)/),
  505. replaceWith: 'https://www.wikiwand.com/zh-hans/$1'
  506. },
  507. {
  508. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/wikipedia\.org\/(?:[a-z]+|wiki)\/(?!Special:Search)(.*?)(?:$|\/RK=.*|&sa=.*)/),
  509. replaceWith: 'https://www.wikiwand.com/en/$1'
  510. },
  511. {
  512. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(?:old|www)\.reddit\.com\/((?:r|u)\/.*?)(?:$|\/RK=.*|&sa=.*)/),
  513. replaceWith: 'https://old.reddit.com/$1'
  514. // replaceWith: 'https://safereddit.com/$1'
  515. // replaceWith: 'https://lr.vern.cc/$1'
  516. },
  517. {
  518. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/www\.quora\.com\/((?=.*-)[\w-]+|profile\/.*?)(?:$|\/RK=.*|&sa=.*)/),
  519. replaceWith: 'https://quetre.iket.me/$1'
  520. },
  521. // Unfortunately, nitter has been discontinued.
  522. // {
  523. // matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/twitter\.com\/([A-Za-z_][\w]+)(\/status\/(?:\d+))?(?:.*?)(?:$|\/RK=.*|&sa=.*)/),
  524. // replaceWith: 'https://nitter.catsarch.com/$1$2'
  525. // },
  526. {
  527. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(?:www\.)?stackoverflow\.com\/(questions\/\d+(?:\/[\w-]+)?)(?:.*?)(?:$|\/RK=.*|&sa=.*)/),
  528. replaceWith: 'https://ao.vern.cc/$1'
  529. },
  530. {
  531. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(.*?(?:medium.*?|towardsdatascience|betterprogramming|plainenglish|gitconnected|aninjusticemag|betterhumans|uxdesign|uxplanet)\.\w+\/(?!tag)(?=.*-)(?:[\w\/-]+|[\w@.]+\/[\w-]+))(?:\?source=.*)?(?:$|\/RK=.*|&sa=.*)/),
  532. replaceWith: 'https://freedium.cfd/https://$1'
  533. },
  534. {
  535. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(?:www\.|m\.)?youtube\.com\/(watch(?:\/?\?v=|\/)[\w-]{11})[\s\S]*/),
  536. replaceWith: 'https://piped.video/$1'
  537. // replaceWith: 'https://vid.puffyan.us/$1'
  538. },
  539. {
  540. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(?:www\.|m\.)?youtube\.com\/((?:@|playlist\?|channel\/|user\/|shorts\/).*?)(?:$|\/RK=.*|&sa=.*)/),
  541. replaceWith: 'https://piped.video/$1'
  542. // replaceWith: 'https://vid.puffyan.us/$1'
  543. },
  544. {
  545. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/music\.youtube\.com\/((?:playlist\?|watch\?|channel\/|browse\/).*?)(?:$|\/RK=.*|&sa=.*)/),
  546. replaceWith: 'https://hyperpipe.surge.sh/$1'
  547. },
  548. {
  549. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/www\.twitch\.tv\/(\w+)(?:.*?)(?:$|\/RK=.*|&sa=.*)/),
  550. replaceWith: 'https://ttv.vern.cc/$1'
  551. },
  552. {
  553. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(?:m|www)\.imdb\.com\/((?:title|name)\/\w+)(?:.*?)(?:$|\/RK=.*|&sa=.*)/),
  554. replaceWith: 'https://ld.vern.cc/$1'
  555. },
  556. {
  557. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/www\.goodreads\.com\/((?:(?:[a-z]+\/)?book\/show|work\/quotes|series|author\/show)\/[\w.-]+)(?:.*?)(?:$|\/RK=.*|&sa=.*)/),
  558. replaceWith: 'https://bl.vern.cc/$1'
  559. },
  560. {
  561. // only support English Fandom sites
  562. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/((?!www|community).*?)\.fandom\.com\/wiki\/(.*?)(?:$|\/RK=.*|&sa=.*)/),
  563. replaceWith: 'https://antifandom.com/$1/wiki/$2'
  564. },
  565. {
  566. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/www\.urbandictionary\.com\/(define\.php\?term=.*?)(?:$|\/RK=.*|&sa=.*)/),
  567. replaceWith: 'https://rd.vern.cc/$1'
  568. },
  569. {
  570. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/www\.reuters\.com\/((?=.*\/)(?=.*-).*?)(?:$|\/RK=.*|&sa=.*)/),
  571. replaceWith: 'https://nu.vern.cc/$1'
  572. },
  573. {
  574. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(www\.ft\.com\/content\/[\w-]+)(?:.*?)(?:$|\/RK=.*|&sa=.*)/),
  575. replaceWith: 'https://archive.today/https://$1'
  576. },
  577. {
  578. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(www\.bloomberg\.com\/(?:(?:[a-z]+\/)?news|opinion)\/.*?)(?:$|\/RK=.*|&sa=.*)/),
  579. replaceWith: 'https://archive.today/https://$1'
  580. },
  581. {
  582. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/www\.npr\.org\/(?:\d{4}\/\d{2}\/\d{2}|sections)\/(?:[A-Za-z-]+\/\d{4}\/\d{2}\/\d{2}\/)?(\d+)\/(?:.*?)(?:$|\/RK=.*|&sa=.*)/),
  583. replaceWith: 'https://text.npr.org/$1'
  584. },
  585. {
  586. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/news\.ycombinator\.com\/item\?id=(\d+)(?:.*?)(?:$|\/RK=.*|&sa=.*)/),
  587. replaceWith: 'https://www.hckrnws.com/stories/$1'
  588. },
  589. {
  590. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(?:[a-z]+)\.slashdot\.org(.*?)(?:$|\/RK=.*|&sa=.*)/),
  591. replaceWith: 'https://slashdot.org$1'
  592. },
  593. {
  594. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(?:(?:.*)(?:arxiv\.org\/pdf|arxiv-export-lb\.library\.cornell\.edu\/(?:pdf|abs)))\/(\d{4}\.\d{4,5}(v\d)?)(?:.*)/),
  595. replaceWith: 'https://arxiv.org/abs/$1'
  596. },
  597. {
  598. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(ieeexplore\.ieee\.org\/document\/\d+)\/(?:.*?)(?:$|\/RK=.*|&sa=.*)/),
  599. replaceWith: 'https://$1'
  600. },
  601. {
  602. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/github\.ink(.*?)(?:$|\/RK=.*|&sa=.*)/),
  603. replaceWith: 'https://github.com$1'
  604. },
  605. {
  606. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/www\.snopes\.com(.*?)(?:$|\/RK=.*|&sa=.*)/),
  607. replaceWith: 'https://sd.vern.cc$1'
  608. },
  609. {
  610. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/www\.instructables\.com\/(.*?)(?:$|\/RK=.*|&sa=.*)/),
  611. replaceWith: 'https://ds.vern.cc/$1'
  612. // replaceWith: 'https://structables.private.coffee/$1'
  613. },
  614. {
  615. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/genius\.com\/((?=[\w-]+lyrics|search\?q=).*?)(?:$|\/RK=.*|&sa=.*)/),
  616. replaceWith: 'https://dm.vern.cc/$1'
  617. },
  618. {
  619. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(.*?)\.bandcamp\.com\/(?:$|\/RK=.*|&sa=.*)/),
  620. replaceWith: 'https://tn.vern.cc/artist.php?name=$1'
  621. },
  622. {
  623. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(.*?)\.bandcamp\.com\/(.*?)\/(.*?)(?:$|\/RK=.*|&sa=.*)/),
  624. replaceWith: 'https://tn.vern.cc/release.php?artist=$1&type=$2&name=$3'
  625. },
  626. {
  627. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/bandcamp\.com\/search\?q=(.*?)(?:$|\/RK=.*|&sa=.*)/),
  628. replaceWith: 'https://tn.vern.cc/search.php?query=$1'
  629. },
  630. {
  631. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/f4\.bcbits\.com\/img\/(.*?)(?:$|\/RK=.*|&sa=.*)/),
  632. replaceWith: 'https://tn.vern.cc/image.php?file=$1'
  633. },
  634. {
  635. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/t4\.bcbits\.com\/stream\/(.*?)\/(.*?)\/(.*?)\?token=(.*?)(?:$|\/RK=.*|&sa=.*)/),
  636. replaceWith: 'https://tn.vern.cc/audio.php?directory=$1&format=$2&file=$3&token=$4'
  637. },
  638. {
  639. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(?:[\w.]+)?imgur.com\/((?:a\/)?(?!gallery)[\w.]+)(?:.*?)(?:$|\/RK=.*|&sa=.*)/),
  640. replaceWith: 'https://rimgo.totaldarkness.net/$1'
  641. },
  642. {
  643. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/www\.pixiv\.net\/(?:[a-z]+\/)?(artworks\/\d+|tags\/\w+|users\/\d+).*/),
  644. replaceWith: 'https://pixivfe.exozy.me/$1'
  645. },
  646. {
  647. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/knowyourmeme\.com\/(.*?)(?:$|\/RK=.*|&sa=.*)/),
  648. replaceWith: 'https://mm.vern.cc/$1'
  649. },
  650. {
  651. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/tenor\.com\/((?:view|search)\/.*?)(?:$|\/RK=.*|&sa=.*)/),
  652. replaceWith: 'https://sp.vern.cc/$1'
  653. },
  654. {
  655. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))?https?:\/\/(?:\w+\.)?ifunny\.co\/(picture\/.*?)(?:$|\/RK=.*|&sa=.*)/),
  656. replaceWith: 'https://uf.vern.cc/$1'
  657. },
  658. {
  659. matchRegex: new RegExp(/^(?:.*?(?:\/RU=|&q=|&as=))https?:\/\/(.*?)(?:$|\/RK=.*|&sa=.*)/),
  660. replaceWith: 'https://$1'
  661. },
  662. // Add more rules here as needed
  663. ];
  664.  
  665. // Define enhanced selector rules for each search engine
  666. const selectorRules = {
  667. 'google': [
  668. {
  669. selector: 'div.MjjYud div div div span a',
  670. childSelector: 'div cite',
  671. updateChildText: true,
  672. containProtocol: true,
  673. urlDisplayMethod: 1
  674. },
  675. {
  676. selector: 'div.PKBwyd div.yuRUbf div span a',
  677. childSelector: 'div cite',
  678. updateChildText: true,
  679. containProtocol: true,
  680. urlDisplayMethod: 1
  681. },
  682. {
  683. // selector for sub-results
  684. selector: 'div.MjjYud div div a'
  685. },
  686. {
  687. // selector for sidebar links
  688. selector: 'div.TQc1id#rhs a'
  689. },
  690. {
  691. // selector for 'discussions and forums' widget
  692. selector: 'div.MjjYud div.LJ7wUe a.v4kUNc',
  693. childSelector: 'div.VZGVuc div.bgBiT.wHYlTd',
  694. updateTextByOverwrite: true,
  695. useTopLevelDomain: true,
  696. urlDisplayMethod: 3
  697. },
  698. {
  699. // selector for 'videos' widget
  700. selector: 'div.e4xoPb div.RzdJxc a.xMqpbd'
  701. },
  702. {
  703. selector: 'div.EyBRub div.eA0Zlc div a'
  704. },
  705. {
  706. // selector for results in google image search tab
  707. selector: 'div.islrc div.isv-r a'
  708. }
  709. ],
  710. 'bing': [
  711. {
  712. selector: 'ol#b_results li.b_algo h2 a'
  713. },
  714. {
  715. selector: 'ol#b_results li.b_algo a.tilk',
  716. childSelector: 'cite',
  717. updateTextByOverwrite: true,
  718. urlDisplayMethod: 2
  719. },
  720. {
  721. selector: 'ol#b_results li.b_algo li a'
  722. },
  723. {
  724. selector: 'ol#b_results li.b_algo div.pageRecoContainer a'
  725. },
  726. {
  727. selector: 'div#b_content div.lite-entcard-blk a'
  728. }
  729. ],
  730. 'yahoo': [
  731. {
  732. parentSelector: 'div#left div#web ol li div div.compTitle h3.title',
  733. linkNodeSelector: 'a',
  734. textNodeSelector: 'span.p-abs',
  735. childSelector: 'span',
  736. updateChildText: true,
  737. containProtocol: false,
  738. multiElementsForUrlDisplay: 2
  739. },
  740. {
  741. selector: 'div#left div#web ol li div ul.compArticleList a'
  742. },
  743. {
  744. selector: 'div#left div#web ol li div div.compGenericCardList a'
  745. },
  746. {
  747. selector: 'div#right ol.cardReg.searchRightTop a'
  748. }
  749. ],
  750. 'yahoojp': [
  751. {
  752. parentSelector: 'div.sw-CardBase div.sw-Card__title',
  753. linkNodeSelector: 'a.sw-Card__titleInner',
  754. textNodeSelector: 'div.sw-Card__titleCiteWrapper cite ol',
  755. childSelector: 'li',
  756. updateChildText: true,
  757. containProtocol: true,
  758. multiElementsForUrlDisplay: 1
  759. },
  760. {
  761. selector: 'div.sw-CardBase p.Algo__osl a'
  762. },
  763. {
  764. selector: 'div.sw-CardBase div.sw-Card.AnswerKnowledgePanel__title div.sw-Tooltip__balloonInner a',
  765. updateTextByOverwrite: true,
  766. urlDisplayMethod: 2
  767. },
  768. {
  769. selector: 'div.sw-CardBase div.sw-Card.AnswerKnowledgePanel__title a'
  770. },
  771. {
  772. selector: 'div.sw-CardBase div.sw-Card.AnswerKnowledgePanel__info a'
  773. }
  774. ],
  775. 'baidu': [
  776. {
  777. originalUrlSelector: 'div#content_left div.c-container',
  778. originalUrlAttribute: 'mu',
  779. linkNodeSelector: ['h3.c-title a', 'h3.t.kg-title_7kFVp a', 'div.c-row a.siteLink_9TPP3', 'div.c-showurl a.cu-line-clamp-1', 'ul.subLink_answer li a', 'span.detail-btn_2Ar6f a']
  780. },
  781. {
  782. selector: 'div#content_left div.c-container h3.c-title a'
  783. },
  784. {
  785. selector: 'div#content_left div.c-container a.siteLink_9TPP3'
  786. },
  787. {
  788. selector: 'div#content_left div.c-container ul.subLink_answer li a'
  789. }
  790. ],
  791. 'yandex': [
  792. {
  793. selector: 'ul#search-result li div.Organic-Subtitle div a',
  794. updateChildText: true,
  795. containProtocol: false,
  796. urlDisplayMethod: 1,
  797. },
  798. {
  799. selector: 'ul#search-result li div.Organic div a',
  800. }
  801. ],
  802. 'searx': [
  803. {
  804. selector: 'article.result a.url_wrapper',
  805. childSelector: 'span span',
  806. updateChildText: true,
  807. containProtocol: true,
  808. multiElementsForUrlDisplay: 1
  809. },
  810. {
  811. selector: 'article.result h3 a'
  812. },
  813. {
  814. selector: 'aside.infobox div.urls ul li a'
  815. }
  816. ],
  817. 'startpage': [
  818. {
  819. selector: 'div.result div.upper a',
  820. updateTextByOverwrite: true,
  821. urlDisplayMethod: 2
  822. },
  823. {
  824. selector: 'div.result a.result-link'
  825. },
  826. {
  827. selector: 'div.bg-sitelinks div.sitelink-container a.sitelink'
  828. },
  829. {
  830. selector: 'div.search-expander-top a'
  831. },
  832. {
  833. selector: 'div.sx-kp-inner a'
  834. },
  835. // video page
  836. {
  837. selector: 'div.result div.details a'
  838. }
  839. ],
  840. 'brave': [
  841. {
  842. selector: 'div.snippet a.h',
  843. childSelector: 'div.site cite.snippet-url span',
  844. updateChildText: true,
  845. containProtocol: false,
  846. multiElementsForUrlDisplay: 1
  847. },
  848. {
  849. selector: 'div#discussions.snippet a',
  850. },
  851. {
  852. selector: 'div#infobox-snippet.snippet a'
  853. },
  854. // video page
  855. {
  856. selector: 'div.video-snippet a'
  857. }
  858. ],
  859. 'duckduckgo': [
  860. {
  861. selector: 'a.eVNpHGjtxRBq_gLOfGDr.LQNqh2U1kzYxREs65IJu'
  862. },
  863. {
  864. selector: 'a.Rn_JXVtoPVAFyGkcaXyK',
  865. childSelector: 'span',
  866. updateChildText: true,
  867. containProtocol: true,
  868. multiElementsForUrlDisplay: 1
  869. },
  870. {
  871. // Selector for sub-results
  872. selector: 'ul.b269SZlC2oyR13Fcc4Iy li a.f3uDrYrWF3Exrfp1m3Og'
  873. },
  874. {
  875. selector: 'div.react-module div section div a'
  876. },
  877. // video page
  878. {
  879. selector: 'div.tile.tile--vid div.tile__body a'
  880. }
  881. ],
  882. 'ghostery': [
  883. {
  884. selector: 'li.result h2 a'
  885. },
  886. {
  887. selector: 'li.result div.snippet div.address a.url',
  888. updateTextByOverwrite: true,
  889. urlDisplayMethod: 2
  890. }
  891. ],
  892. 'presearch': [
  893. {
  894. selector: 'div.relative div.w-auto a',
  895. childSelector: 'div',
  896. updateChildText: true,
  897. urlDisplayMethod: 3,
  898. },
  899. {
  900. selector: 'div.relative div.inline-block a'
  901. },
  902. {
  903. parentSelector: 'div.relative div.flex div.mr-2',
  904. linkNodeSelector: 'a',
  905. textNodeSelector: 'div.text-results-link',
  906. updateTextByOverwrite: true,
  907. urlDisplayMethod: 3
  908. },
  909. // video page
  910. {
  911. selector: 'div.relative div.flex a.flex'
  912. }
  913. ],
  914. 'metager': [
  915. {
  916. selector: 'h2.result-title a'
  917. },
  918. {
  919. selector: 'div.result-subheadline a',
  920. updateTextByOverwrite: true,
  921. urlDisplayMethod: 3
  922. },
  923. {
  924. selector: 'div.quicktip div.quicktip-headline h1 a'
  925. },
  926. {
  927. selector: 'div.quicktip div.quicktip-detail h2 a'
  928. }
  929. ],
  930. '4get': [
  931. {
  932. parentSelector: 'div.text-result',
  933. linkNodeSelector: 'a.hover',
  934. textNodeSelector: 'div.url',
  935. childSelector: 'a.part',
  936. updateChildText: true,
  937. containProtocol: true,
  938. multiElementsForUrlDisplay: 4
  939. },
  940. {
  941. selector: 'div.text-result div.sublinks a'
  942. },
  943. {
  944. parentSelector: 'div.right-wrapper div.answer',
  945. linkNodeSelector: 'a.answer-title',
  946. textNodeSelector: 'div.url',
  947. childSelector: 'a.part',
  948. updateChildText: true,
  949. containProtocol: true,
  950. multiElementsForUrlDisplay: 4
  951. }
  952. ],
  953. 'librey': [
  954. {
  955. selector: 'div.text-result-wrapper a',
  956. updateTextWithoutOverwrite: true,
  957. useTopLevelDomain: true,
  958. urlDisplayMethod: 2
  959. },
  960. {
  961. selector: 'p.special-result-container a',
  962. updateTextWithoutOverwrite: true,
  963. urlDisplayMethod: 2
  964. },
  965. ],
  966. 'stract': [
  967. {
  968. selector: 'div.grid div div.flex div div a.text-link'
  969. },
  970. {
  971. selector: 'div.grid div div.flex div div div a',
  972. updateTextByOverwrite: true,
  973. urlDisplayMethod: 2
  974. },
  975. {
  976. selector: 'div.mb-5.text-xl a'
  977. },
  978. {
  979. selector: 'div.text-sm a.text-link'
  980. }
  981. ],
  982. 'whoogle': [
  983. {
  984. selector: 'div#main div.ZINbbc.has-favicon div.egMi0 a',
  985. childSelector: 'div.sCuL3 div.BNeawe',
  986. updateTextByOverwrite: true,
  987. containProtocol: false,
  988. urlDisplayMethod: 1
  989. },
  990. {
  991. selector: 'div#main div.ZINbbc div.yStFkb div.ZINbbc.has-favicon a',
  992. childSelector: 'div.BNeawe.UPmit.AP7Wnd',
  993. updateTextByOverwrite: true,
  994. containProtocol: false,
  995. urlDisplayMethod: 1
  996. },
  997. ],
  998. 'etools': [
  999. {
  1000. // searchSubmit.do
  1001. selector: 'td.record a.title'
  1002. },
  1003. {
  1004. // mobileSearch.do
  1005. selector: 'p a.title'
  1006. }
  1007. ],
  1008. 'mojeek': [
  1009. {
  1010. selector: 'ul.results-standard li h2 a.title'
  1011. },
  1012. {
  1013. selector: 'ul.results-standard li a.ob',
  1014. childSelector: 'span.url',
  1015. updateChildText: true,
  1016. containProtocol: true,
  1017. urlDisplayMethod: 1
  1018. },
  1019. {
  1020. selector: 'div.infobox p a'
  1021. },
  1022. {
  1023. selector: 'div.results.news-results li a'
  1024. },
  1025. {
  1026. selector: 'div.right-col div.results ul li a'
  1027. }
  1028. ],
  1029. 'wiby': [
  1030. {
  1031. parentSelector: 'body blockquote',
  1032. linkNodeSelector: 'a.tlink',
  1033. textNodeSelector: 'p.url',
  1034. updateTextByOverwrite: true,
  1035. urlDisplayMethod: 2
  1036. }
  1037. ],
  1038. 'yep': [
  1039. {
  1040. selector: 'div.css-102xgmn-card div div a',
  1041. childSelector: 'div span',
  1042. updateChildText: true,
  1043. containProtocol: false,
  1044. urlDisplayMethod: 1
  1045. }
  1046. ],
  1047. 'torry': [
  1048. {
  1049. selector: 'div.searpList p a.toranclick',
  1050. updateTextByOverwrite: true,
  1051. urlDisplayMethod: 2
  1052. },
  1053. {
  1054. selector: 'div.searpList div h2 a.toranclick',
  1055. },
  1056. {
  1057. selector: 'div.searpList ul li a',
  1058. }
  1059. ],
  1060. 'qwant': [
  1061. {
  1062. selector: 'div[data-testid="breadcrumbs"] a.external',
  1063. childSelector: 'span',
  1064. updateChildText: true,
  1065. containProtocol: false,
  1066. multiElementsForUrlDisplay: 1
  1067. },
  1068. {
  1069. selector: 'a.external'
  1070. },
  1071. {
  1072. selector: 'div[data-testid="videosList"] a'
  1073. }
  1074. ],
  1075. 'ecosia': [
  1076. {
  1077. parentSelector: 'div.mainline__result-wrapper div.result__header div.result__info',
  1078. linkNodeSelector: 'a',
  1079. textNodeSelector: 'div.result__link',
  1080. childSelector: 'span',
  1081. updateChildText: true,
  1082. containProtocol: true,
  1083. multiElementsForUrlDisplay: 1
  1084. },
  1085. {
  1086. selector: 'div.mainline__result-wrapper div.result__header div.result__title a'
  1087. },
  1088. {
  1089. selector: 'div.mainline__result-wrapper div ul li a'
  1090. },
  1091. {
  1092. selector: 'aside.sidebar article div.entity-links ul li a'
  1093. },
  1094. {
  1095. selector: 'aside.sidebar article div.entity__content p a'
  1096. },
  1097. {
  1098. selector: 'div.videos__result-wrapper a'
  1099. }
  1100. ],
  1101. 'oscobo': [
  1102. {
  1103. selector: 'div.result a',
  1104. childSelector: 'span.siteTitleWrap span.favicons',
  1105. updateTextWithoutOverwrite: true,
  1106. containProtocol: true,
  1107. urlDisplayMethod: 1
  1108. }
  1109. ],
  1110. 'good': [
  1111. {
  1112. selector: 'div.content div.margin-bottom--small.box a.link--search',
  1113. childSelector: 'p.url',
  1114. updateTextByOverwrite: true,
  1115. urlDisplayMethod: 2
  1116. },
  1117. {
  1118. selector: 'div.sx-kp-top a'
  1119. },
  1120. {
  1121. selector: 'div.sx-kp-tab-content-wrap section ul.sx-kp-social-links a'
  1122. },
  1123. {
  1124. selector: 'div.sx-kp-tab-content-wrap section div.sx-kp-attributions a'
  1125. }
  1126. ],
  1127. 'alltheinternet': [
  1128. {
  1129. parentSelector: 'div.gs-webResult.gs-result',
  1130. linkNodeSelector: 'a.gs-title',
  1131. textNodeSelector: 'div.gsc-url-top div.gs-visibleUrl-long',
  1132. updateTextByOverwrite: true,
  1133. urlDisplayMethod: 2
  1134. }
  1135. ],
  1136. 'searchalot': [
  1137. {
  1138. parentSelector: 'div.gs-webResult.gs-result',
  1139. linkNodeSelector: 'a.gs-title',
  1140. textNodeSelector: 'div.gsc-url-top div.gs-visibleUrl-long',
  1141. updateTextByOverwrite: true,
  1142. urlDisplayMethod: 2
  1143. }
  1144. ],
  1145. 'aol': [
  1146. {
  1147. parentSelector: 'div#left div#web ol li div div.compTitle',
  1148. linkNodeSelector: 'h3.title a',
  1149. textNodeSelector: 'div span',
  1150. updateTextByOverwrite: true,
  1151. urlDisplayMethod: 3
  1152. },
  1153. {
  1154. selector: 'div#left div#web ol li div div.compList a'
  1155. },
  1156. {
  1157. selector: 'div#right ol.cardReg.searchRightTop a'
  1158. }
  1159. ],
  1160. 'onesearch': [
  1161. {
  1162. parentSelector: 'div#left div#web ol li div div.compTitle',
  1163. linkNodeSelector: 'h3.title a',
  1164. textNodeSelector: 'div span',
  1165. updateTextByOverwrite: true,
  1166. urlDisplayMethod: 3
  1167. },
  1168. {
  1169. selector: 'div#left div#web ol li div div.compList a'
  1170. },
  1171. {
  1172. selector: 'div#right ol.cardReg.searchRightTop a'
  1173. }
  1174. ],
  1175. 'info': [
  1176. {
  1177. parentSelector: 'div.web-yahoo__result',
  1178. linkNodeSelector: 'a.web-yahoo__title',
  1179. textNodeSelector: 'span.web-yahoo__url',
  1180. updateTextWithoutOverwrite: true,
  1181. urlDisplayMethod: 2
  1182. },
  1183. {
  1184. selector: 'div.sidebar-results a'
  1185. }
  1186. ],
  1187. 'oceanhero': [
  1188. {
  1189. selector: 'div div div a',
  1190. childSelector: 'span cite',
  1191. updateChildText: true,
  1192. containProtocol: false,
  1193. urlDisplayMethod: 1
  1194. },
  1195. {
  1196. selector: 'section div ul li a'
  1197. },
  1198. {
  1199. selector: 'div div div p a'
  1200. }
  1201. ],
  1202. 'swisscows': [
  1203. {
  1204. selector: 'article.item-web a.site',
  1205. updateTextWithoutOverwrite: true,
  1206. containProtocol: false,
  1207. urlDisplayMethod: 1
  1208. },
  1209. {
  1210. selector: 'article.item-web a'
  1211. }
  1212. ],
  1213. 'lilo': [
  1214. {
  1215. selector: 'div.lilo-text-result div p a.has-text-grey-darker',
  1216. // Displayed URL modification not working correctly in Lilo
  1217. // Reason is unknown, the displayed URL will return to the original URL after modification
  1218. // childSelector: 'span',
  1219. // updateChildText: true,
  1220. // containProtocol: true,
  1221. // multiElementsForUrlDisplay: 2
  1222. },
  1223. {
  1224. selector: 'div.lilo-text-result div a.has-text-primary'
  1225. },
  1226. {
  1227. selector: 'div.column.is-two-fifths a'
  1228. }
  1229. ],
  1230. 'entireweb': [
  1231. {
  1232. parentSelector: 'div.web-result',
  1233. linkNodeSelector: 'a.web-result-title',
  1234. textNodeSelector: 'div.web-result-domain',
  1235. updateTextWithoutOverwrite: true,
  1236. urlDisplayMethod: 3
  1237. },
  1238. {
  1239. selector: 'div#infobox-list.card div.card-body a'
  1240. },
  1241. {
  1242. parentSelector: 'div.gsc-webResult.gsc-result',
  1243. linkNodeSelector: 'a.gs-title',
  1244. textNodeSelector: 'div.gsc-url-top',
  1245. updateTextByOverwrite: true,
  1246. containProtocol: false,
  1247. urlDisplayMethod: 1
  1248. }
  1249. ],
  1250. 'tadadoo': [
  1251. {
  1252. parentSelector: 'div.web-result',
  1253. linkNodeSelector: 'a.web-result-title',
  1254. textNodeSelector: 'div.web-result-domain',
  1255. updateTextWithoutOverwrite: true,
  1256. urlDisplayMethod: 3
  1257. },
  1258. {
  1259. selector: 'div#infobox-list.card div.card-body a'
  1260. }
  1261. ],
  1262. 'gmx': [
  1263. {
  1264. selector: 'div.eMd a.eMdhl'
  1265. },
  1266. {
  1267. selector: 'div.eMd a.eMdu',
  1268. childSelector: 'span',
  1269. updateChildText: true,
  1270. containProtocol: true,
  1271. multiElementsForUrlDisplay: 2
  1272. },
  1273. ],
  1274. 'youcare': [
  1275. {
  1276. selector: 'div.search-result-item-text a.search-result-item-text__title'
  1277. },
  1278. {
  1279. selector: 'div.search-result-item-text div div a.search-result-item-text-sitename'
  1280. },
  1281. {
  1282. selector: 'div.search-result-item-text div div a.search-result-item-text__header-url',
  1283. updateTextWithoutOverwrite: true,
  1284. containProtocol: true,
  1285. urlDisplayMethod: 1
  1286. },
  1287. {
  1288. selector: "div.search-results-view__side a"
  1289. }
  1290. ],
  1291. 'lycos': [
  1292. {
  1293. parentSelector: 'div.results li.result-item',
  1294. linkNodeSelector: 'a.result-link',
  1295. textNodeSelector: 'span.result-url',
  1296. updateTextByOverwrite: true,
  1297. urlDisplayMethod: 3
  1298. },
  1299. {
  1300. selector: 'div.col-aside a'
  1301. }
  1302. ],
  1303. 'alohafind': [
  1304. {
  1305. parentSelector: 'div.gsc-webResult.gsc-result',
  1306. linkNodeSelector: 'a.gs-title',
  1307. textNodeSelector: 'div.gs-visibleUrl-short',
  1308. updateTextByOverwrite: true,
  1309. urlDisplayMethod: 3
  1310. }
  1311. ],
  1312. 'spot': [
  1313. {
  1314. selector: 'div.result h4 a'
  1315. },
  1316. {
  1317. selector: 'div.result a.external-link',
  1318. updateTextByOverwrite: true,
  1319. urlDisplayMethod: 2
  1320. },
  1321. {
  1322. selector: 'div.infobox div.footer div.links a'
  1323. }
  1324. ],
  1325. 'qmamu': [
  1326. {
  1327. selector: 'div.sc-1i4c0yr-4.cxFATD a'
  1328. },
  1329. {
  1330. selector: 'div.sc-meawca-31.liCyKS a',
  1331. childSelector: 'span.sc-meawca-10.czAks',
  1332. updateChildText: true,
  1333. containProtocol: true,
  1334. urlDisplayMethod: 1
  1335. }
  1336. ],
  1337. 'carrot2': [
  1338. {
  1339. selector: 'div.ResultList a.Result',
  1340. childSelector: 'span.url span',
  1341. updateChildText: true,
  1342. urlDisplayMethod: 2
  1343. },
  1344. {
  1345. selector: 'div.sc-meawca-31.liCyKS a',
  1346. childSelector: 'span.sc-meawca-10.czAks',
  1347. updateChildText: true,
  1348. containProtocol: true,
  1349. urlDisplayMethod: 1
  1350. }
  1351. ],
  1352. 'nona': [
  1353. {
  1354. selector: 'section.result-section article.teaser div.teaser__container a.teaser__topline',
  1355. updateTextByOverwrite: true,
  1356. urlDisplayMethod: 2
  1357. },
  1358. {
  1359. selector: 'section.result-section article.teaser div.teaser__container a.teaser__link'
  1360. },
  1361. {
  1362. selector: 'section.result-section article.entity-teaser div.entity-teaser__wrapper a'
  1363. }
  1364. ],
  1365. 'sapo': [
  1366. {
  1367. parentSelector: 'div.gs-webResult.gs-result',
  1368. linkNodeSelector: 'a.gs-title',
  1369. textNodeSelector: 'div.gsc-url-top div.gs-visibleUrl-breadcrumb',
  1370. childSelector: 'span',
  1371. updateChildText: true,
  1372. containProtocol: false,
  1373. multiElementsForUrlDisplay: 1
  1374. }
  1375. ],
  1376. 'exalead': [
  1377. {
  1378. selector: 'li.media div.media-body a.ellipsis',
  1379. updateTextByOverwrite: true,
  1380. urlDisplayMethod: 3
  1381. },
  1382. {
  1383. selector: 'li.media div.media-body a'
  1384. }
  1385. ],
  1386. 'biglobe': [
  1387. {
  1388. selector: 'div#searchResult ol li h3 a'
  1389. },
  1390. {
  1391. selector: 'div#searchResult ol li span.url a',
  1392. updateTextByOverwrite: true,
  1393. urlDisplayMethod: 2
  1394. }
  1395. ],
  1396. 'goo': [
  1397. {
  1398. parentSelector: 'div.result',
  1399. linkNodeSelector: 'p.title a',
  1400. textNodeSelector: 'p.url span.cM',
  1401. updateTextByOverwrite: true,
  1402. urlDisplayMethod: 3
  1403. },
  1404. {
  1405. selector: 'div.aside div.talentTxt a'
  1406. },
  1407. ],
  1408. 'walla': [
  1409. {
  1410. parentSelector: 'div.gs-webResult.gs-result',
  1411. linkNodeSelector: 'a.gs-title',
  1412. textNodeSelector: 'div.gsc-url-top div.gs-visibleUrl-breadcrumb',
  1413. childSelector: 'span',
  1414. updateChildText: true,
  1415. containProtocol: false,
  1416. multiElementsForUrlDisplay: 1
  1417. }
  1418. ],
  1419. 'coccoc': [
  1420. {
  1421. selector: 'div.searchResultsMain-HyzAT a.url-AQP5U',
  1422. childSelector: 'span',
  1423. updateChildText: true,
  1424. containProtocol: true,
  1425. multiElementsForUrlDisplay: 1
  1426. },
  1427. {
  1428. selector: 'div.searchResultsMain-HyzAT h3.title-qgBH2 a'
  1429. },
  1430. {
  1431. selector: 'div.searchResultsMain-HyzAT div.shortButtonSitelinks-BENQp ul li a'
  1432. },
  1433. {
  1434. selector: 'div.searchResultsRight-IDPLb div.newRightWiki-DoD9w a'
  1435. },
  1436. {
  1437. selector: 'div.searchResultsRight-IDPLb div.newRightWiki-6sbvE a'
  1438. }
  1439. ],
  1440. 'seznam': [
  1441. {
  1442. selector: 'div.f2c528 h3 a'
  1443. },
  1444. {
  1445. selector: 'div.f2c528 a.d5e75c',
  1446. updateTextByOverwrite: true,
  1447. urlDisplayMethod: 3
  1448. },
  1449. ],
  1450. 'startsiden': [
  1451. {
  1452. selector: 'li.result a.result__link-wrapper',
  1453. childSelector: 'div.result__url',
  1454. updateChildText: true,
  1455. containProtocol: false,
  1456. urlDisplayMethod: 1
  1457. },
  1458. {
  1459. selector: 'div.f2c528 a.d5e75c',
  1460. updateTextByOverwrite: true,
  1461. urlDisplayMethod: 3
  1462. },
  1463. ],
  1464. 'marginalia': [
  1465. {
  1466. selector: 'section.card.search-result div.url a',
  1467. updateTextByOverwrite: true,
  1468. urlDisplayMethod: 2
  1469. },
  1470. {
  1471. selector: 'section.card.search-result h2 a.title'
  1472. },
  1473. {
  1474. selector: 'section.card.search-result div.additional-results li a'
  1475. }
  1476. ],
  1477. 'mwmbl': [
  1478. {
  1479. selector: 'ul.results li.result div.result-link a',
  1480. childSelector: 'span.link',
  1481. updateTextByOverwrite: true,
  1482. urlDisplayMethod: 2
  1483. },
  1484. ],
  1485. 'naver': [
  1486. {
  1487. selector: 'li.bx div.total_wrap div.source_box a.thumb'
  1488. },
  1489. {
  1490. selector: 'li.bx div.total_wrap div.source_box a.txt',
  1491. updateTextByOverwrite: true,
  1492. containProtocol: false,
  1493. urlDisplayMethod: 1
  1494. },
  1495. {
  1496. selector: 'li.bx div.total_wrap a.link_tit'
  1497. },
  1498. {
  1499. selector: 'li.bx div.snippet_rel_wrap a.link_item'
  1500. },
  1501. {
  1502. selector: 'li.bx div.source_cluster_wrap a'
  1503. },
  1504. {
  1505. selector: 'section.sc_new a'
  1506. }
  1507. ],
  1508. 'gibiru': [
  1509. {
  1510. parentSelector: 'div.gs-webResult.gs-result',
  1511. linkNodeSelector: 'a.gs-title',
  1512. textNodeSelector: 'div.gsc-url-top div.gs-visibleUrl-breadcrumb',
  1513. childSelector: 'span',
  1514. updateChildText: true,
  1515. containProtocol: false,
  1516. multiElementsForUrlDisplay: 1
  1517. }
  1518. ],
  1519. 'lukol': [
  1520. {
  1521. parentSelector: 'div.gsc-webResult.gsc-result',
  1522. linkNodeSelector: 'a.gs-title',
  1523. textNodeSelector: 'div.gsc-url-bottom div.gs-visibleUrl-long',
  1524. updateTextByOverwrite: true,
  1525. urlDisplayMethod: 2
  1526. }
  1527. ],
  1528. 'draze': [
  1529. {
  1530. parentSelector: 'div.gsc-webResult.gsc-result',
  1531. linkNodeSelector: 'a.gs-title',
  1532. textNodeSelector: 'div.gsc-url-top div.gs-visibleUrl-breadcrumb',
  1533. childSelector: 'span',
  1534. updateChildText: true,
  1535. containProtocol: false,
  1536. multiElementsForUrlDisplay: 1
  1537. }
  1538. ],
  1539. 'yelliot': [
  1540. {
  1541. parentSelector: 'div.gsc-webResult.gsc-result',
  1542. linkNodeSelector: 'a.gs-title',
  1543. textNodeSelector: 'div.gsc-url-top div.gs-visibleUrl-breadcrumb',
  1544. childSelector: 'span',
  1545. updateChildText: true,
  1546. containProtocol: false,
  1547. multiElementsForUrlDisplay: 1
  1548. }
  1549. ],
  1550. 'efind': [
  1551. {
  1552. parentSelector: 'article.result',
  1553. linkNodeSelector: 'h3 a',
  1554. textNodeSelector: 'div.external-link div',
  1555. childSelector: 'span',
  1556. updateChildText: true,
  1557. containProtocol: false,
  1558. multiElementsForUrlDisplay: 2
  1559. },
  1560. {
  1561. selector: 'aside.infobox a'
  1562. }
  1563. ],
  1564. 'fireball': [
  1565. {
  1566. selector: 'div.search-result a.search-result-title'
  1567. },
  1568. {
  1569. selector: 'div.search-result a.search-result-url',
  1570. updateTextByOverwrite: true,
  1571. urlDisplayMethod: 2
  1572. },
  1573. {
  1574. selector: 'div.search-result a.search-result-check'
  1575. }
  1576. ],
  1577. 'freespoke': [
  1578. {
  1579. selector: 'div.result-block a.title-source-link',
  1580. childSelector: 'span.breadcrumb-container',
  1581. updateTextByOverwrite: true,
  1582. containProtocol: false,
  1583. urlDisplayMethod: 1
  1584. },
  1585. {
  1586. selector: 'div.ant-col.component-col div.WebSearchResult div.main-container a'
  1587. },
  1588. {
  1589. selector: 'div.ant-col.sidebar div.se-widget a'
  1590. },
  1591. {
  1592. selector: 'div.ant-col.sidebar div.KnowledgePanelResults div.ExpandableContainer a'
  1593. },
  1594. {
  1595. selector: 'div.ant-col.test.ant-col-xs-24 div.se-widget a'
  1596. },
  1597. {
  1598. selector: 'div.ant-col.ant-col-xs-24 div.KnowledgePanelResults div.ExpandableContainer a'
  1599. }
  1600. ],
  1601. 'gogoprivate': [
  1602. {
  1603. parentSelector: 'div.gsc-webResult.gsc-result',
  1604. linkNodeSelector: 'div.gs-title a[target="_PARENT"]',
  1605. textNodeSelector: 'div.gsc-url-top div.gs-visibleUrl-breadcrumb',
  1606. childSelector: 'span',
  1607. updateChildText: true,
  1608. containProtocol: false,
  1609. multiElementsForUrlDisplay: 1
  1610. },
  1611. {
  1612. selector: 'div.vidbox#imgbox a'
  1613. }
  1614. ],
  1615. 'resulthunter': [
  1616. {
  1617. parentSelector: 'div.gsc-webResult.gsc-result',
  1618. linkNodeSelector: 'a.web-result-title',
  1619. textNodeSelector: 'div.web-result-domain',
  1620. updateTextWithoutOverwrite: true,
  1621. urlDisplayMethod: 3
  1622. },
  1623. {
  1624. parentSelector: 'div.gsc-webResult.gsc-result',
  1625. linkNodeSelector: 'a.gs-title',
  1626. textNodeSelector: 'div.gsc-url-top div.gs-visibleUrl-breadcrumb',
  1627. childSelector: 'span',
  1628. updateChildText: true,
  1629. containProtocol: false,
  1630. multiElementsForUrlDisplay: 1
  1631. }
  1632. ],
  1633. 'givewater': [
  1634. {
  1635. parentSelector: 'div.web-bing__result',
  1636. linkNodeSelector: 'a.web-bing__title',
  1637. textNodeSelector: 'span.web-bing__url',
  1638. updateTextByOverwrite: true,
  1639. urlDisplayMethod: 2
  1640. }
  1641. ],
  1642. 'excite': [
  1643. {
  1644. parentSelector: 'div.web-bing__result',
  1645. linkNodeSelector: 'a.web-bing__title',
  1646. textNodeSelector: 'span.web-bing__url',
  1647. updateTextByOverwrite: true,
  1648. urlDisplayMethod: 2
  1649. }
  1650. ],
  1651. 'webcrawler': [
  1652. {
  1653. parentSelector: 'div.web-bing__result',
  1654. linkNodeSelector: 'a.web-bing__title',
  1655. textNodeSelector: 'span.web-bing__url',
  1656. updateTextByOverwrite: true,
  1657. urlDisplayMethod: 2
  1658. }
  1659. ],
  1660. 'metacrawler': [
  1661. {
  1662. parentSelector: 'div.web-bing__result',
  1663. linkNodeSelector: 'a.web-bing__title',
  1664. textNodeSelector: 'span.web-bing__url',
  1665. updateTextByOverwrite: true,
  1666. urlDisplayMethod: 2
  1667. }
  1668. ],
  1669. 'dogpile': [
  1670. {
  1671. parentSelector: 'div.web-bing__result',
  1672. linkNodeSelector: 'a.web-bing__title',
  1673. textNodeSelector: 'span.web-bing__url',
  1674. updateTextByOverwrite: true,
  1675. urlDisplayMethod: 2
  1676. }
  1677. ],
  1678. 'infospace': [
  1679. {
  1680. parentSelector: 'div.web-bing div.result',
  1681. linkNodeSelector: 'a.title',
  1682. textNodeSelector: 'span.url',
  1683. updateTextByOverwrite: true,
  1684. urlDisplayMethod: 2
  1685. }
  1686. ],
  1687. 'refseek': [
  1688. {
  1689. selector: 'div.sticky a'
  1690. },
  1691. {
  1692. parentSelector: 'div.gsc-webResult.gsc-result',
  1693. linkNodeSelector: 'a.gs-title',
  1694. textNodeSelector: 'div.gsc-url-top div.gs-visibleUrl-short',
  1695. updateTextByOverwrite: true,
  1696. urlDisplayMethod: 3
  1697. }
  1698. ],
  1699. 'zapmeta': [
  1700. {
  1701. parentSelector: 'ol.organic-results__list li',
  1702. linkNodeSelector: 'div.organic-results__title a',
  1703. textNodeSelector: 'div.organic-results__display-url',
  1704. updateTextByOverwrite: true,
  1705. useTopLevelDomain: true,
  1706. urlDisplayMethod: 3
  1707. }
  1708. ],
  1709. 'izito': [
  1710. {
  1711. parentSelector: 'ol.organic-results__list li',
  1712. linkNodeSelector: 'div.organic-results__title a',
  1713. textNodeSelector: 'div.organic-results__display-url',
  1714. updateTextByOverwrite: true,
  1715. useTopLevelDomain: true,
  1716. urlDisplayMethod: 3
  1717. }
  1718. ],
  1719. 'ask': [
  1720. {
  1721. selector: 'div.result-title a'
  1722. },
  1723. {
  1724. selector: 'div.result-url-section a',
  1725. childSelector: 'span.result-url',
  1726. updateChildText: true,
  1727. urlDisplayMethod: 3
  1728. }
  1729. ],
  1730. 'pronto': [
  1731. {
  1732. selector: 'div.result-title a'
  1733. },
  1734. {
  1735. selector: 'div.result-url-section a',
  1736. childSelector: 'span.result-url',
  1737. updateChildText: true,
  1738. urlDisplayMethod: 3
  1739. }
  1740. ],
  1741. 'anoox': [
  1742. {
  1743. selector: 'div.search_item div.ad_brief_desc a'
  1744. },
  1745. {
  1746. selector: 'div.search_item div.adv_url_con a',
  1747. updateTextByOverwrite: true,
  1748. urlDisplayMethod: 2
  1749. }
  1750. ],
  1751. 'kagi': [
  1752. {
  1753. selector: 'div._0_SRI.search-result div._0_TITLE.__sri-title a.__sri_title_link'
  1754. },
  1755. {
  1756. selector: 'div._0_SRI.search-result div.__sri-url-box a.__sri-url',
  1757. childSelector: 'div span',
  1758. updateChildText: true,
  1759. containProtocol: false,
  1760. urlDisplayMethod: 1
  1761. },
  1762. {
  1763. selector: 'div.sri-group div.sr-group a._0_URL'
  1764. },
  1765. {
  1766. selector: 'div.widgetContent div.widgetItem a'
  1767. },
  1768. {
  1769. selector: 'div.widgetContent div._0_SRI.search-result a'
  1770. },
  1771. {
  1772. selector: 'div._0_right_sidebar a'
  1773. },
  1774. {
  1775. selector: 'div.videoResultItem._0_SRI a'
  1776. },
  1777. {
  1778. selector: 'div.newsResultItem div.newsResultTitle a._0_URL'
  1779. },
  1780. ]
  1781. // Additional search engines can be defined here...
  1782. };
  1783.  
  1784. // User-defined list of search engine instance URLs
  1785. const searchEngines = {
  1786. 'google': {
  1787. hosts: ['google.com'],
  1788. // search results container
  1789. // you can ignore this parameter if you don't want to set it, just delete it
  1790. // defult value is 'body'
  1791. resultContainerSelectors: [
  1792. 'div.GyAeWb#rcnt',
  1793. 'div.mJxzWe'
  1794. ]
  1795. },
  1796. 'bing': {
  1797. hosts: ['bing.com'],
  1798. resultContainerSelectors: ['div#b_content']
  1799. },
  1800. 'yahoo': {
  1801. hosts: ['search.yahoo.com'],
  1802. resultContainerSelectors: ['div#results div#cols']
  1803. },
  1804. 'yahoojp': {
  1805. hosts: ['search.yahoo.co.jp'],
  1806. resultContainerSelectors: ['div#contents div#contents__wrap']
  1807. },
  1808. 'baidu': {
  1809. hosts: ['baidu.com'],
  1810. resultContainerSelectors: ['div#wrapper_wrapper div#container']
  1811. },
  1812. 'yandex': {
  1813. hosts: [
  1814. 'yandex.com',
  1815. 'yandex.ru'
  1816. ],
  1817. resultContainerSelectors: ['div.main__container']
  1818. },
  1819. 'searx': {
  1820. hosts: [
  1821. 'search.disroot.org',
  1822. 'searx.tiekoetter.com',
  1823. 'search.bus-hit.me',
  1824. 'search.inetol.net',
  1825. 'priv.au',
  1826. 'searx.be',
  1827. 'searxng.site',
  1828. 'search.hbubli.cc',
  1829. 'search.im-in.space',
  1830. 'opnxng.com',
  1831. 'search.upinmars.com',
  1832. 'search.sapti.me',
  1833. 'freesearch.club',
  1834. 'xo.wtf',
  1835. 'www.gruble.de',
  1836. 'searx.tuxcloud.net',
  1837. 'baresearch.org',
  1838. 'searx.daetalytica.io',
  1839. 'etsi.me',
  1840. 'search.leptons.xyz',
  1841. 'search.rowie.at',
  1842. 'search.mdosch.de',
  1843. 'searx.catfluori.de',
  1844. 'searx.si',
  1845. 'searx.namejeff.xyz',
  1846. 'search.itstechtime.com',
  1847. 's.mble.dk',
  1848. 'searx.kutay.dev',
  1849. 'ooglester.com',
  1850. 'searx.ox2.fr',
  1851. 'searx.techsaviours.org',
  1852. 'searx.perennialte.ch',
  1853. 's.trung.fun',
  1854. 'search.in.projectsegfau.lt',
  1855. 'search.projectsegfau.lt',
  1856. 'darmarit.org',
  1857. 'searx.lunar.icu',
  1858. 'nyc1.sx.ggtyler.dev',
  1859. 'search.rhscz.eu',
  1860. 'paulgo.io',
  1861. 'northboot.xyz',
  1862. 'searx.zhenyapav.com',
  1863. 'searxng.ch',
  1864. 'copp.gg',
  1865. 'searx.sev.monster',
  1866. 'searx.oakleycord.dev',
  1867. 'searx.juancord.xyz',
  1868. 'searx.work',
  1869. 'search.ononoki.org',
  1870. 'search.demoniak.ch',
  1871. 'searx.cthd.icu',
  1872. 'searx.fmhy.net',
  1873. 'searx.headpat.exchange',
  1874. 'sex.finaltek.net',
  1875. 'search.gcomm.ch',
  1876. 'search.smnz.de',
  1877. 'searx.ankha.ac',
  1878. 'search.lvkaszus.pl',
  1879. 'searx.nobulart.com',
  1880. 'sx.t-1.org',
  1881. 'www.jabber-germany.de',
  1882. 'sx.catgirl.cloud'
  1883. ],
  1884. resultContainerSelectors: [
  1885. 'main#main_results'
  1886. // 'maindiv#main_results div#urls'
  1887. // 'div#sidebar div#infoboxes'
  1888. ]
  1889. },
  1890. 'startpage': {
  1891. hosts: ['startpage.com']
  1892. },
  1893. 'brave': {
  1894. hosts: ['search.brave.com'],
  1895. resultContainerSelectors: [
  1896. 'main.main-column',
  1897. 'aside.sidebar'
  1898. ]
  1899. },
  1900. 'duckduckgo': {
  1901. hosts: ['duckduckgo.com'],
  1902. resultContainerSelectors: [
  1903. 'section[data-testid="mainline"][data-area="mainline"]',
  1904. 'section[data-testid="sidebar"][data-area="sidebar"]',
  1905. 'div#zero_click_wrapper.zci-wrap'
  1906. ]
  1907. },
  1908. 'ghostery': {
  1909. hosts: ['ghosterysearch.com'],
  1910. resultContainerSelectors: ['section.results']
  1911. },
  1912. 'presearch': {
  1913. hosts: ['presearch.com'],
  1914. resultContainerSelectors: ['div.w-full']
  1915. },
  1916. 'metager': {
  1917. hosts: [
  1918. 'metager.org',
  1919. 'metager.de'
  1920. ],
  1921. resultContainerSelectors: [
  1922. 'div#results',
  1923. 'div#additions-container'
  1924. ]
  1925. },
  1926. '4get': {
  1927. hosts: [
  1928. '4get.ca',
  1929. '4get.silly.computer',
  1930. '4get.plunked.party',
  1931. '4get.konakona.moe',
  1932. '4get.sijh.net',
  1933. '4get.hbubli.cc',
  1934. '4get.perennialte.ch',
  1935. '4get.zzls.xyz',
  1936. '4getus.zzls.xyz',
  1937. '4get.seitan-ayoub.lol',
  1938. '4get.dcs0.hu',
  1939. '4get.psily.garden',
  1940. '4get.lvkaszus.pl',
  1941. '4get.kizuki.lol'
  1942. ],
  1943. resultContainerSelectors: ['div#overflow']
  1944. },
  1945. 'librey': {
  1946. hosts: [
  1947. 'search.ahwx.org',
  1948. 'search2.ahwx.org',
  1949. 'search3.ahwx.org',
  1950. 'ly.owo.si',
  1951. 'librey.franklyflawless.org',
  1952. 'librey.org',
  1953. 'search.davidovski.xyz',
  1954. 'search.milivojevic.in.rs',
  1955. 'glass.prpl.wtf',
  1956. 'librex.uk.to',
  1957. 'librey.ix.tc',
  1958. 'search.funami.tech',
  1959. 'librex.retro-hax.net',
  1960. 'librex.nohost.network',
  1961. 'search.pabloferreiro.es',
  1962. 'librey.baczek.me',
  1963. 'lx.benike.me',
  1964. 'search.seitan-ayoub.lol',
  1965. 'librey.myroware.net',
  1966. 'librey.nezumi.party',
  1967. 'search.zeroish.xyz',
  1968. 'search.zeroish.xyz'
  1969. ],
  1970. resultContainerSelectors: [
  1971. 'div.text-result-container',
  1972. 'p.special-result-container'
  1973. ]
  1974. },
  1975. 'stract': {
  1976. hosts: ['stract.com'],
  1977. resultContainerSelectors: [
  1978. 'div.col-start-1',
  1979. 'div.row-start-2'
  1980. ]
  1981. },
  1982. 'whoogle': {
  1983. hosts: [
  1984. 'search.albony.xyz',
  1985. 'search.garudalinux.org',
  1986. 'search.dr460nf1r3.org',
  1987. 'search.nezumi.party',
  1988. 's.tokhmi.xyz',
  1989. 'search.sethforprivacy.com',
  1990. 'whoogle.dcs0.hu',
  1991. 'whoogle.lunar.icu',
  1992. 'gowogle.voring.me',
  1993. 'whoogle.privacydev.net',
  1994. 'whoogle.hostux.net',
  1995. 'wg.vern.cc',
  1996. 'whoogle.hxvy0.gq',
  1997. 'whoogle.ungovernable.men',
  1998. 'whoogle2.ungovernable.men',
  1999. 'whoogle3.ungovernable.men',
  2000. 'wgl.frail.duckdns.org',
  2001. 'whoogle.no-logs.com',
  2002. 'whoogle.ftw.lol',
  2003. 'whoogle-search--replitcomreside.repl.co',
  2004. 'search.notrustverify.ch',
  2005. 'whoogle.datura.network',
  2006. 'whoogle.yepserver.xyz'
  2007. ],
  2008. resultContainerSelectors: ['div#main']
  2009. },
  2010. 'etools': {
  2011. hosts: ['etools.ch'],
  2012. // resultContainerSelectors: ['table.result']
  2013. },
  2014. 'mojeek': {
  2015. hosts: [
  2016. 'mojeek.com',
  2017. 'mojeek.co.uk'
  2018. ],
  2019. resultContainerSelectors: ['div.container.serp-results']
  2020. },
  2021. 'wiby': {
  2022. hosts: ['wiby.me']
  2023. },
  2024. 'yep': {
  2025. hosts: ['yep.com']
  2026. },
  2027. 'torry': {
  2028. hosts: ['torry.io'],
  2029. resultContainerSelectors: ['div.searpListouterappend'],
  2030. attribute: 'data-target'
  2031. },
  2032. 'qwant': {
  2033. hosts: ['qwant.com'],
  2034. // resultContainerSelectors: [
  2035. // 'div[data-testid="containerWeb"]',
  2036. // 'div.is-sidebar'
  2037. // ]
  2038. },
  2039. 'ecosia': {
  2040. hosts: ['ecosia.org'],
  2041. resultContainerSelectors: ['main#main']
  2042. },
  2043. 'oscobo': {
  2044. hosts: ['search.becovi.com'],
  2045. resultContainerSelectors: ['div#results.col']
  2046. },
  2047. 'good': {
  2048. hosts: ['good-search.org'],
  2049. resultContainerSelectors: [
  2050. 'div.grid__item.two-thirds',
  2051. 'div.grid__item.one-third'
  2052. ]
  2053. },
  2054. 'alltheinternet': {
  2055. hosts: ['alltheinternet.com']
  2056. },
  2057. 'searchalot': {
  2058. hosts: ['searchalot.com']
  2059. },
  2060. 'aol': {
  2061. hosts: ['search.aol.com'],
  2062. resultContainerSelectors: ['div#results div#cols']
  2063. },
  2064. 'onesearch': {
  2065. hosts: ['onesearch.com'],
  2066. resultContainerSelectors: ['div#results div#cols']
  2067. },
  2068. 'info': {
  2069. hosts: ['info.com'],
  2070. resultContainerSelectors: ['div.layout__body']
  2071. },
  2072. 'oceanhero': {
  2073. hosts: ['oceanhero.today']
  2074. },
  2075. 'swisscows': {
  2076. hosts: ['swisscows.com'],
  2077. resultContainerSelectors: ['section.container.page-results']
  2078. },
  2079. 'lilo': {
  2080. hosts: ['search.lilo.org'],
  2081. resultContainerSelectors: ['div.container#content']
  2082. },
  2083. 'entireweb': {
  2084. hosts: ['search.entireweb.com'],
  2085. resultContainerSelectors: ['div.container.search-container']
  2086. },
  2087. 'tadadoo': {
  2088. hosts: ['tadadoo.com']
  2089. },
  2090. 'gmx': {
  2091. hosts: ['search.gmx.com']
  2092. },
  2093. 'youcare': {
  2094. hosts: ['youcare.world']
  2095. },
  2096. 'lycos': {
  2097. hosts: ['search.lycos.com'],
  2098. resultContainerSelectors: ['div.content.con-search']
  2099. },
  2100. 'alohafind': {
  2101. hosts: ['alohafind.com'],
  2102. resultContainerSelectors: ['section.layout']
  2103. },
  2104. 'spot': {
  2105. hosts: ['spot.ecloud.global'],
  2106. resultContainerSelectors: ['div.container.contents']
  2107. },
  2108. 'qmamu': {
  2109. hosts: ['qmamu.com'],
  2110. resultContainerSelectors: ['div.sc-7aqnu-1.ffCHAv']
  2111. },
  2112. 'carrot2': {
  2113. hosts: ['search.carrot2.org'],
  2114. resultContainerSelectors: ['div.Views']
  2115. },
  2116. 'nona': {
  2117. hosts: ['nona.de'],
  2118. resultContainerSelectors: ['main.search-results div.container']
  2119. },
  2120. 'sapo': {
  2121. hosts: ['sapo.pt'],
  2122. resultContainerSelectors: ['div.content div.ink-tabs.top']
  2123. },
  2124. 'exalead': {
  2125. hosts: ['exalead.com'],
  2126. resultContainerSelectors: ['ul.media-list']
  2127. },
  2128. 'biglobe': {
  2129. hosts: ['search.biglobe.ne.jp'],
  2130. resultContainerSelectors: ['div#contents div#searchResult'],
  2131. },
  2132. 'goo': {
  2133. hosts: ['search.goo.ne.jp'],
  2134. resultContainerSelectors: [
  2135. 'section[role="main"] div.section#main',
  2136. 'section[role="main"] aside[role="complementary"]'
  2137. ],
  2138. },
  2139. 'walla': {
  2140. hosts: ['search.walla.co.il'],
  2141. resultContainerSelectors: ['section.walla-core-container'],
  2142. },
  2143. 'coccoc': {
  2144. hosts: ['coccoc.com'],
  2145. resultContainerSelectors: ['div#root'],
  2146. },
  2147. 'seznam': {
  2148. hosts: ['search.seznam.cz'],
  2149. resultContainerSelectors: ['div.PageWrapper.SearchPage#searchpage-root'],
  2150. },
  2151. 'startsiden': {
  2152. hosts: ['startsiden.no'],
  2153. resultContainerSelectors: ['div.results ul.results__list'],
  2154. },
  2155. 'marginalia': {
  2156. hosts: ['search.marginalia.nu'],
  2157. resultContainerSelectors: ['section.sidebar-narrow section#results'],
  2158. },
  2159. 'mwmbl': {
  2160. hosts: ['mwmbl.org'],
  2161. resultContainerSelectors: ['div.main ul.results'],
  2162. },
  2163. 'naver': {
  2164. hosts: ['search.naver.com'],
  2165. resultContainerSelectors: ['div#main_pack.main_pack'],
  2166. },
  2167. 'gibiru': {
  2168. hosts: ['gibiru.com'],
  2169. resultContainerSelectors: ['div.container#web-results'],
  2170. },
  2171. 'lukol': {
  2172. hosts: ['lukol.com']
  2173. },
  2174. 'draze': {
  2175. hosts: ['draze.com'],
  2176. resultContainerSelectors: ['div.container div#content'],
  2177. },
  2178. 'yelliot': {
  2179. hosts: ['yelliot.com']
  2180. },
  2181. 'efind': {
  2182. hosts: ['efind.com'],
  2183. resultContainerSelectors: ['main#main_results'],
  2184. },
  2185. 'fireball': {
  2186. hosts: ['fireball.de'],
  2187. resultContainerSelectors: ['div.search-results'],
  2188. },
  2189. 'freespoke': {
  2190. hosts: ['freespoke.com'],
  2191. resultContainerSelectors: ['div.WebSearch div.wrapper'],
  2192. },
  2193. 'gogoprivate': {
  2194. hosts: ['gogoprivate.com'],
  2195. resultContainerSelectors: ['div#cse-body'],
  2196. },
  2197. 'resulthunter': {
  2198. hosts: ['resulthunter.com'],
  2199. resultContainerSelectors: ['main.main-content#content'],
  2200. },
  2201. 'givewater': {
  2202. hosts: ['search.givewater.com'],
  2203. resultContainerSelectors: ['div.mainline-results']
  2204. },
  2205. 'excite': {
  2206. hosts: ['results.excite.com'],
  2207. resultContainerSelectors: ['div.mainline-results']
  2208. },
  2209. 'webcrawler': {
  2210. hosts: ['webcrawler.com'],
  2211. resultContainerSelectors: ['div.web-bing'],
  2212. },
  2213. 'metacrawler': {
  2214. hosts: ['metacrawler.com'],
  2215. resultContainerSelectors: ['div.web-bing'],
  2216. },
  2217. 'dogpile': {
  2218. hosts: ['dogpile.com'],
  2219. resultContainerSelectors: ['div.web-bing'],
  2220. },
  2221. 'infospace': {
  2222. hosts: ['infospace.com'],
  2223. resultContainerSelectors: ['div.layout div.layout__body'],
  2224. },
  2225. 'refseek': {
  2226. hosts: ['refseek.com'],
  2227. resultContainerSelectors: ['div.main__container div.main__content'],
  2228. },
  2229. 'zapmeta': {
  2230. hosts: ['zapmeta.com'],
  2231. resultContainerSelectors: ['div.component-container__main ol.organic-results__list'],
  2232. },
  2233. 'izito': {
  2234. hosts: ['izito.com'],
  2235. resultContainerSelectors: ['div.component-container__main ol.organic-results__list'],
  2236. },
  2237. 'ask': {
  2238. hosts: ['ask.com'],
  2239. resultContainerSelectors: ['div.search-results div.results'],
  2240. },
  2241. 'pronto': {
  2242. hosts: ['pronto.com'],
  2243. resultContainerSelectors: ['div.search-results div.results'],
  2244. },
  2245. 'anoox': {
  2246. hosts: ['anoox.com'],
  2247. resultContainerSelectors: ['div#main_srch_window div#se_holder_center'],
  2248. },
  2249. 'kagi': {
  2250. hosts: ['kagi.com'],
  2251. resultContainerSelectors: ['main#main']
  2252. },
  2253. // ... more search engines
  2254. };
  2255.  
  2256. // Function to modify URLs and optionally text
  2257. const modifyUrls = (observer, resultContainer, engineInfo) => {
  2258. try {
  2259. const selectors = selectorRules[engineInfo.engine];
  2260. if (selectors) {
  2261. // Disconnect the observer to prevent recursive triggering
  2262. observer.disconnect();
  2263.  
  2264. // Modify search results
  2265. selectors.forEach(rule => {
  2266. // Get original URL from 'Baidu' search results to avoid unnecessary redirection
  2267. if (engineInfo.engine === 'baidu' && rule.originalUrlSelector) {
  2268. processBaiduElements(rule.linkNodeSelector, rule.originalUrlSelector, rule.originalUrlAttribute);
  2269. return; // Skip to the next iteration of the forEach loop
  2270. }
  2271.  
  2272. // URL modification based on custom RegEx rules
  2273. if (rule.selector) {
  2274. processElements(rule.selector, rule, engineInfo.attribute);
  2275. } else if (rule.parentSelector) {
  2276. processElements(rule.parentSelector, rule, engineInfo.attribute, true);
  2277. }
  2278. });
  2279.  
  2280. // Reconnect the observer after DOM modifications are done
  2281. observer.observe(resultContainer, { childList: true, subtree: true });
  2282. }
  2283. } catch (error) {
  2284. console.error("URL Modification Error: ", error);
  2285. }
  2286. };
  2287.  
  2288. // Get original URL from 'Baidu' search results and update the link elements to get rid of unnecessary redirection links
  2289. const processBaiduElements = (linkNodeSelector, selector, attribute) => {
  2290. const elements = document.querySelectorAll(selector);
  2291. if (elements.length > 0) {
  2292. elements.forEach(element => {
  2293. const originalUrl = element.getAttribute(attribute);
  2294. if (originalUrl && !originalUrl.includes('lightapp.baidu.com')) {
  2295. for (let i = 0; i < linkNodeSelector.length; i++) {
  2296. const linkElement = element.querySelector(linkNodeSelector[i]);
  2297. if (linkElement) {
  2298. linkElement.href = decodeURIComponent(originalUrl);
  2299. }
  2300. }
  2301. }
  2302. });
  2303. }
  2304. };
  2305.  
  2306. // Function to process elements specified by `selector` or `parentSelector`
  2307. const processElements = (selector, rule, additionalAttribute, isParentSelector) => {
  2308. const elements = document.querySelectorAll(selector);
  2309. if (elements.length > 0) {
  2310. elements.forEach(element => {
  2311. let linkElement = isParentSelector ? element.querySelector(rule.linkNodeSelector) : element;
  2312. let textElement = isParentSelector ? element.querySelector(rule.textNodeSelector) : element;
  2313.  
  2314. for (let i = 0; i < urlModificationRules.length; i++) {
  2315. try {
  2316. const urlRule = urlModificationRules[i];
  2317. let urlToModify = additionalAttribute ? linkElement.getAttribute(additionalAttribute) : linkElement.href;
  2318. urlToModify = decodeURIComponent(urlToModify);
  2319. // Update attribute
  2320. if (urlToModify && urlRule.matchRegex.test(urlToModify)) {
  2321. // Generate redirected URL
  2322. let newUrl = urlToModify.replace(urlRule.matchRegex, urlRule.replaceWith);
  2323. if (linkElement.href) {
  2324. linkElement.href = newUrl;
  2325. } else if (additionalAttribute) {
  2326. linkElement.setAttribute(additionalAttribute, newUrl);
  2327. }
  2328. newUrl = rule.useTopLevelDomain ? extractTopLevelDomain(newUrl) : newUrl;
  2329. updateTextContent(textElement, rule, removeUnnecessaryTailing(newUrl));
  2330. break;
  2331. }
  2332. } catch (error) {
  2333. console.error("Update Link/Text Error: ", error);
  2334. }
  2335. }
  2336. });
  2337. }
  2338. };
  2339.  
  2340. // Function to update text content (displayed URL)
  2341. const updateTextContent = (element, rule, newUrl) => {
  2342. if (rule.updateChildText || rule.updateTextWithoutOverwrite || rule.updateTextByOverwrite) {
  2343. try {
  2344. if (rule.multiElementsForUrlDisplay) {
  2345. updateMultiElementContent(element, rule, newUrl);
  2346. } else {
  2347. const targetElement = rule.childSelector ? element.querySelector(rule.childSelector) : element;
  2348. updateSingleElementText(targetElement, rule, newUrl);
  2349. }
  2350. } catch (error) {
  2351. console.error("Update Displayed URL Error: ", error);
  2352. }
  2353. }
  2354. };
  2355.  
  2356. // Function to update text for multi elements (e.g. DuckDuckGo, Brave)
  2357. const updateMultiElementContent = (targetElement, rule, newUrl) => {
  2358. if (!targetElement) {
  2359. console.error("Target DOM Element not found for Multi-Element Text update!");
  2360. return;
  2361. }
  2362. // Remove the "https://" protocol if containProtocol is false
  2363. newUrl = rule.containProtocol ? newUrl : removeProtocol(newUrl);
  2364. let formattedUrl = breadCumbFormat(newUrl, rule.containProtocol);
  2365. let urlParts = formattedUrl.split(' › ');
  2366.  
  2367. const spans = targetElement.querySelectorAll(rule.childSelector)
  2368.  
  2369. switch (rule.multiElementsForUrlDisplay) {
  2370. case 1:
  2371. parallelElements(urlParts, spans);
  2372. break;
  2373. case 2:
  2374. mixedElements(urlParts, spans, targetElement);
  2375. break;
  2376. case 3:
  2377. mixedElementsWithoutClear(urlParts, spans, targetElement);
  2378. break;
  2379. case 4:
  2380. fourGetSearchElements(newUrl, spans, targetElement);
  2381. }
  2382. };
  2383.  
  2384. // Case where URL parts are scattered into parallel elements
  2385. const parallelElements = (urlParts, elements) => {
  2386. if (elements && elements.length >= 2) {
  2387. elements.forEach(clearElementContent);
  2388. elements[0].textContent = urlParts[0]; // Update the first part
  2389. elements[1].textContent = ' › ' + urlParts.slice(1).join(' › '); // Update the second part
  2390. } else {
  2391. console.error("Script: Expected structure not found for Multi-Element (parallel elements) URL update!");
  2392. }
  2393. };
  2394.  
  2395. // Case where URL parts are scattered into non-parallel elements
  2396. const mixedElements = (urlParts, elements, parent) => {
  2397. if (elements && elements.length >= 1) {
  2398. elements.forEach(clearElementContent);
  2399. updateTextWithoutOverwriteChildNodes(parent, urlParts[0]); // Update the first part
  2400. elements[0].textContent = ' › ' + urlParts.slice(1).join(' › '); // Update the second part
  2401. } else {
  2402. console.error("Script: Expected structure not found for Multi-Element (mixed elements) URL update!");
  2403. }
  2404. };
  2405.  
  2406. // Same as case 2, but update elements without clearing their original contents
  2407. const mixedElementsWithoutClear = (urlParts, elements, parent) => {
  2408. if (elements && elements.length >= 1) {
  2409. updateTextWithoutOverwriteChildNodes(parent, urlParts[0]); // Update the first part
  2410. elements[0].textContent = ' › ' + urlParts.slice(1).join(' › '); // Update the second part
  2411. } else {
  2412. console.error("Script: Expected structure not found for Multi-Element (mixed elements with clear) URL update!");
  2413. }
  2414. };
  2415.  
  2416. // Case where search engine is 4get
  2417. const fourGetSearchElements = (newUrl, elements, parent) => {
  2418. // Convert NodeList to Array if necessary
  2419. const elementsArray = Array.isArray(elements) ? elements : Array.from(elements);
  2420.  
  2421. // Split the new URL into parts
  2422. const urlParts = splitUrlIntoParts(newUrl);
  2423.  
  2424. // Ensure the elements array length matches the number of URL parts
  2425. matchElementNumWithPartsFor4Get(urlParts, elementsArray, parent);
  2426.  
  2427. let prevCombinedLink = '';
  2428. // Update or add new elements based on the urlParts
  2429. urlParts.forEach((part, index) => {
  2430. let element = elementsArray[index];
  2431. if (!element) {
  2432. element = createPartElementFor4Get(parent);
  2433. elementsArray.push(element);
  2434. }
  2435. prevCombinedLink += part + '/';
  2436. element.href = prevCombinedLink;
  2437. element.textContent = part;
  2438. // Handle separators
  2439. if (index < urlParts.length - 1 && (!element.nextSibling || element.nextSibling.className !== 'separator')) {
  2440. let separator = createSeparatorElementFor4Get();
  2441. parent.insertBefore(separator, element.nextSibling);
  2442. }
  2443. });
  2444.  
  2445. // Remove any extra elements if the new URL has fewer parts than existing elements
  2446. while (elementsArray.length > urlParts.length) {
  2447. const elementToRemove = elementsArray.pop();
  2448. const separator = elementToRemove.nextSibling;
  2449. if (separator && separator.className === 'separator') {
  2450. separator.remove();
  2451. }
  2452. elementToRemove.remove();
  2453. }
  2454. };
  2455.  
  2456. // 4get specific fucntion
  2457. // Ensure the elements array length matches the number of URL parts, if not, add new < a > elements
  2458. const matchElementNumWithPartsFor4Get = (urlParts, elements, parent) => {
  2459. while (elements.length < urlParts.length) {
  2460. const newElement = createPartElementFor4Get(parent);
  2461. parent.appendChild(newElement);
  2462. elements.push(newElement);
  2463. }
  2464. };
  2465.  
  2466. // 4get specific fucntion
  2467. // Create a new <a> element that represents a URL component
  2468. const createPartElementFor4Get = () => {
  2469. const element = document.createElement('a');
  2470. element.className = 'part';
  2471. element.setAttribute('rel', 'noreferrer nofollow');
  2472. element.setAttribute('tabindex', '-1');
  2473. return element;
  2474. };
  2475.  
  2476. // 4get specific fucntion
  2477. // Create a new <span> element that represents a URL separator '/'
  2478. const createSeparatorElementFor4Get = () => {
  2479. const separator = document.createElement('span');
  2480. separator.className = 'separator';
  2481. return separator;
  2482. };
  2483.  
  2484. // Function to update text for a single element
  2485. const updateSingleElementText = (targetElement, rule, newUrl) => {
  2486. if (!targetElement) {
  2487. console.error("Target DOM Element not found for Single-Element Text update!");
  2488. return;
  2489. }
  2490. let formattedUrl = '';
  2491. switch (rule.urlDisplayMethod) {
  2492. case 1:
  2493. formattedUrl = breadCumbFormat(newUrl, rule.containProtocol);
  2494. break;
  2495. case 2:
  2496. formattedUrl = newUrl; // Full URL with protocol
  2497. break;
  2498. case 3:
  2499. formattedUrl = decodeURIComponent(removeProtocol(newUrl)); // Full URL without protocol
  2500. break;
  2501. }
  2502. if (rule.updateTextWithoutOverwrite) {
  2503. updateTextWithoutOverwriteChildNodes(targetElement, formattedUrl);
  2504. } else if (rule.updateTextByOverwrite) {
  2505. updateTextByOverwriteEverything(targetElement, formattedUrl);
  2506. } else {
  2507. targetElement.textContent = formattedUrl;
  2508. }
  2509. };
  2510.  
  2511. // Format URLs into Breadcrumb style, while leaving 'https://' intact
  2512. const breadCumbFormat = (url, containProtocol) => {
  2513. if (!containProtocol) {
  2514. url = removeProtocol(url);
  2515. }
  2516.  
  2517. const urlParts = splitUrlIntoParts(url, containProtocol);
  2518.  
  2519. // Join the URL parts with ' › '
  2520. const joinedUrl = urlParts.join(' › ');
  2521.  
  2522. // Decode the URL to convert encoded characters to their original form
  2523. return decodeURIComponent(joinedUrl);
  2524. };
  2525.  
  2526. // Function to update only the text node within an element, leave the child elements, if exist, intact
  2527. const updateTextWithoutOverwriteChildNodes = (element, newContent) => {
  2528. let currentIndex = 0;
  2529. const indexObject = { currentIndex };
  2530. collectNodes(element, node => {
  2531. if (currentIndex >= newContent.length) return; // Stop if we've used all the new content
  2532. replaceTextContent(node, oldText => replaceTextBasedOnIndex(oldText, newContent, indexObject));
  2533. });
  2534. };
  2535.  
  2536. // Function to collect all text nodes within an element
  2537. const collectNodes = (node, callback) => {
  2538. // View these elements as text node
  2539. const elementsToIncludeAsText = ['B'];
  2540. // Do not view these elements as text node
  2541. const elementsToExcludeAsText = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P'];
  2542.  
  2543. if (node.nodeType === Node.TEXT_NODE) {
  2544. callback(node);
  2545. } else if (node.nodeType === Node.ELEMENT_NODE && elementsToIncludeAsText.includes(node.tagName.toUpperCase())) {
  2546. callback(node);
  2547. } else if (node.nodeType === Node.ELEMENT_NODE && !elementsToExcludeAsText.includes(node.tagName.toUpperCase())) {
  2548. node.childNodes.forEach(child => collectNodes(child, callback));
  2549. }
  2550. };
  2551.  
  2552. // Function to replace the text content of a node
  2553. const replaceTextContent = (node, textUpdater) => {
  2554. if (node.nodeType === Node.TEXT_NODE) {
  2555. node.nodeValue = textUpdater(node.nodeValue);
  2556. } else if (node.innerHTML) { // For elements treated as text, like <b>
  2557. node.innerHTML = textUpdater(node.innerHTML);
  2558. }
  2559. };
  2560.  
  2561. // Function to replace text based on index
  2562. const replaceTextBasedOnIndex = (oldText, newContent, indexObject) => {
  2563. const newText = newContent.slice(indexObject.currentIndex, indexObject.currentIndex + oldText.length);
  2564. indexObject.currentIndex += oldText.length;
  2565. return newText;
  2566. };
  2567.  
  2568. // Function to update the content by overwriting everything
  2569. const updateTextByOverwriteEverything = (element, newContent) => {
  2570. clearElementContent(element);
  2571. element.textContent = newContent;
  2572. };
  2573.  
  2574. // Split URL into components, while preserving 'https://' in all occurrences
  2575. const splitUrlIntoParts = (url, containProtocol) => {
  2576. // Temporary replace 'https://' with a placeholder that is unlikely to be part of any URL
  2577. const placeholder = "HTTPS_PLACEHOLDER";
  2578. let tempUrl = url.replace(/https:\/\//g, placeholder);
  2579.  
  2580. // Split the URL by '/'
  2581. let parts = tempUrl.split('/');
  2582.  
  2583. // Replace the placeholder back with 'https://'
  2584. parts = parts.map(part => part.replace(new RegExp(placeholder, 'g'), 'https://'));
  2585.  
  2586. // Filter out any empty strings that may have resulted from the split
  2587. parts = parts.filter(part => part !== '');
  2588.  
  2589. // Ensure the first part always starts with 'https://', adjusting if necessary
  2590. if (containProtocol && parts.length > 0 && !parts[0].startsWith('https://')) {
  2591. parts[0] = 'https://' + parts[0];
  2592. }
  2593.  
  2594. return parts;
  2595. };
  2596.  
  2597. // Extract the top level domain from URL link
  2598. const extractTopLevelDomain = (url) => {
  2599. const parsedUrl = new URL(url);
  2600. return `${parsedUrl.protocol}//${parsedUrl.hostname}/`;
  2601. };
  2602.  
  2603. // Remove 'https://' from the URL link
  2604. const removeProtocol = (url) => {
  2605. return url.replace(/^https?:\/\//, '');
  2606. };
  2607.  
  2608. // Remove unnecessary tailing in the URL link (for link displaying)
  2609. const removeUnnecessaryTailing = (url) => {
  2610. // Remove tailing slash '/'
  2611. // Check if the URL ends with a slash and remove it if present
  2612. url = url.endsWith('/') ? url.slice(0, -1) : url;
  2613.  
  2614. // Remove parameters (the part behind ?)
  2615. if (url.includes('?') && !url.split('?')[1].startsWith('v=')) {
  2616. url = url.split('?')[0];
  2617. }
  2618.  
  2619. // Remove parameters (the part behind &)
  2620. url = url.split('&')[0];
  2621.  
  2622. // Remove article section indicator (the part behind #)
  2623. url = url.split('#')[0];
  2624.  
  2625. return url;
  2626. };
  2627.  
  2628. // Function to clear existing content of an element
  2629. const clearElementContent = (element) => {
  2630. element.textContent = '';
  2631. };
  2632.  
  2633. // Improved function to determine the search engine
  2634. const getSearchEngineInfo = () => {
  2635. try {
  2636. const host = window.location.host;
  2637. for (const engine in searchEngines) {
  2638. if (searchEngines[engine].hosts.some(instanceHost => host.includes(instanceHost))) {
  2639. // Default to 'body' if not specified
  2640. const selectors = searchEngines[engine].resultContainerSelectors || ['body'];
  2641. // Get the attribute if specified
  2642. const attribute = searchEngines[engine].attribute;
  2643. return {
  2644. engine,
  2645. selectors: selectors,
  2646. attribute: attribute
  2647. };
  2648. }
  2649. }
  2650. } catch (error) {
  2651. console.error("Error determining search engine: ", error);
  2652. }
  2653. };
  2654.  
  2655. // Function to observe and execute the URL modifier script
  2656. const observeToExecute = (selector, engineInfo) => {
  2657. const resultContainers = document.querySelectorAll(selector);
  2658. if (resultContainers) {
  2659. resultContainers.forEach(resultContainer => {
  2660. // Observe changes in each result container
  2661. const observer = new MutationObserver(() => modifyUrls(observer, resultContainer, engineInfo));
  2662. observer.observe(resultContainer, { childList: true, subtree: true });
  2663. modifyUrls(observer, resultContainer, engineInfo);
  2664. });
  2665. }
  2666. };
  2667.  
  2668. // Run the script for the current search engine
  2669. try {
  2670. const engineInfo = getSearchEngineInfo();
  2671. if (engineInfo) {
  2672. engineInfo.selectors.forEach(containerSelector => {
  2673. observeToExecute(containerSelector, engineInfo);
  2674. });
  2675. }
  2676. } catch (error) {
  2677. console.error("Error executing URL Modifier Script: ", error);
  2678. }
  2679. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址