开源替代重定向器

将您从专有网络服务重定向到道德替代品(前端)。

  1. // ==UserScript==
  2. // @name Open-Source Alternative Redirector
  3. // @name:ar معيد التوجيه البديل مفتوح المصدر
  4. // @name:bg Алтернативно пренасочване с отворен код
  5. // @name:cs Open-Source alternativní přesměrovač
  6. // @name:da Open Source Alternativ Redirector
  7. // @name:de Open-Source-alternativer Redirector
  8. // @name:es Redirector alternativo de código abierto
  9. // @name:fi Open-Source Alternative Redirector
  10. // @name:fr Redirecteur alternatif open source
  11. // @name:he מפנה אלטרנטיבי בקוד פתוח
  12. // @name:it Reindirizzamento alternativo open source
  13. // @name:ja オープンソースの代替リダイレクター
  14. // @name:ko 오픈 소스 대체 리디렉터
  15. // @name:nl Alternatieve Open Source-redirector
  16. // @name:pl Alternatywny readresator typu open source
  17. // @name:ro Redirector alternativ cu sursă deschisă
  18. // @name:ru Альтернативный перенаправитель с открытым исходным кодом
  19. // @name:tr Açık Kaynak Alternatif Yönlendirici
  20. // @name:uk Альтернативний перенаправник з відкритим вихідним кодом
  21. // @name:zh-CN 开源替代重定向器
  22. // @name:zh-TW 開源替代重定向器
  23. // @namespace -
  24. // @version 11.2.0
  25. // @description Redirects you from proprietary web-services to ethical alternatives(front-end).
  26. // @description:ar يعيد توجيهك من خدمات الويب المسجلة الملكية إلى البدائل الأخلاقية (الواجهة الأمامية).
  27. // @description:bg Пренасочва ви от собствени уеб-услуги към етични алтернативи (front-end).
  28. // @description:cs Přesměruje vás z proprietárních webových služeb na etické alternativy (front-end).
  29. // @description:da Omdirigerer dig fra proprietære web-tjenester til etiske alternativer (front-end).
  30. // @description:de Leitet Sie von proprietären Webdiensten zu ethischen Alternativen (Front-End) weiter.
  31. // @description:es Lo redirige de servicios web propietarios a alternativas éticas (front-end).
  32. // @description:fi Ohjaa sinut patentoiduista verkkopalveluista eettisiin vaihtoehtoihin (käyttöliittymä).
  33. // @description:fr Vous redirige des services Web propriétaires vers des alternatives éthiques (front-end).
  34. // @description:he מפנה אותך משירותי אינטרנט קנייניים לחלופות אתיות (חזית).
  35. // @description:it Ti reindirizza da servizi web proprietari ad alternative etiche (front-end).
  36. // @description:ja 独自のWebサービスから倫理的な代替手段(フロントエンド)にリダイレクトします。
  37. // @description:ko 독점 웹 서비스에서 윤리적 대안(프론트 엔드)으로 리디렉션합니다.
  38. // @description:nl Leidt u om van propriëtaire webservices naar ethische alternatieven (front-end).
  39. // @description:pl Przekierowuje Cię z zastrzeżonych usług internetowych do etycznych alternatyw (front-end).
  40. // @description:ro Vă redirecționează de la servicii web proprietare la alternative etice (front-end).
  41. // @description:ru Перенаправляет вас с проприетарных веб-сервисов на этические альтернативы (интерфейс).
  42. // @description:tr Sizi tescilli web hizmetlerinden etik alternatiflere (ön uç) yönlendirir.
  43. // @description:uk Перенаправляє вас із власних веб-сервісів до етичних альтернатив (фронт-енд).
  44. // @description:zh-CN 将您从专有网络服务重定向到道德替代品(前端)。
  45. // @description:zh-TW 將您從專有網絡服務重定向到道德替代品(前端)。
  46. // @author NotYou
  47. // @include *youtube.com/*
  48. // @include *google.com/*
  49. // @include *google.*
  50. // @include *yahoo.com/*
  51. // @include *bing.com/*
  52. // @include *reddit.com/*
  53. // @include *twitter.com/*
  54. // @include *instagram.com/*
  55. // @include *wikipedia.org/*
  56. // @include *medium.com/*
  57. // @include *towardsdatascience.com/*
  58. // @include *i.imgur.com/*
  59. // @include *i.stack.imgur.com/*
  60. // @include *odysee.com/*
  61. // @include *tiktok.com/*
  62. // @include *quora.com/*
  63. // @run-at document-start
  64. // @compatible Firefox Version 48
  65. // @compatible Chrome Version 49
  66. // @compatible Edge Version 14
  67. // @compatible Opera Version 36
  68. // @compatible Safari Version 10.1
  69. // @license GPL-3.0-or-later
  70. // @icon data:image/png;base64,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
  71. // @grant none
  72. // ==/UserScript==
  73.  
  74. (function() {
  75. const DEBUG_MODE = false
  76.  
  77. let { host, href, search } = location,
  78.  
  79. // INSTANCES //
  80. invidious = 'yewtu.be',
  81. searx = 'search.mdosch.de',
  82. libreddit = 'reddit.invak.id',
  83. nitter = 'nitter.snopyta.org',
  84. bibliogram = 'bibliogram.pussthecat.org',
  85. wikiless = 'wikiless.org',
  86. lingva = 'lingva.ml',
  87. scribe = 'scribe.rip',
  88. rimgo = 'rimgo.pussthecat.org',
  89. librarian = 'librarian.pussthecat.org',
  90. proxitok = 'proxitok.pussthecat.org',
  91. quetre = 'qr.vern.cc',
  92. hyperpipe = 'hyperpipe.surge.sh',
  93.  
  94. data = [
  95. [['music.youtube.com'], youtubeMusicRedirect],
  96. [['youtube.com'], youtubeRedirect],
  97. [['google.'], googleRedirect],
  98. [['search.yahoo.com'], yahooRedirect],
  99. [['bing.com'], bingRedirect],
  100. [['reddit.com'], redditRedirect],
  101. [['twitter.com'], twitterRedirect],
  102. [['wikipedia.org'], wikipediaRedirect],
  103. [['medium.com', 'towardsdatascience.com'], mediumRedirect],
  104. [['i.imgur.com'], imgurRedirect],
  105. [['odysee.com'], odyseeRedirect],
  106. [['tiktok.com'], tiktokRedirect],
  107. [['quora.com'], quoraRedirect],
  108. ]
  109.  
  110. const LOGS_TITLE = 'REDIRECTOR LOGS\n'
  111. const HTTPS = 'https://'
  112. const DEFAULT_CATEGORY = 'general'
  113. const CATEGORIES = {
  114. IMAGES: 'images',
  115. VIDEOS: 'videos',
  116. NEWS: 'news',
  117. MAP: 'map',
  118. SCIENCE: 'science',
  119. }
  120.  
  121. mainRedirect(location, data)
  122.  
  123. function mainRedirect(loc, cases) {
  124. for (let i = 0; i < cases.length; i++) {
  125. let currentCase = cases[i]
  126. let domains = currentCase[0]
  127. let redirectFn = currentCase[1]
  128.  
  129. for (let j = 0; j < domains.length; j++) {
  130. let domain = domains[j]
  131. let hostHasDomain = hostHas(domain)
  132.  
  133. if(DEBUG_MODE) {
  134. console.log(LOGS_TITLE, 'DOMAIN:', domain, 'REDIRECT FN:', redirectFn, 'HOST HAS DOMAIN:', hostHasDomain)
  135. }
  136.  
  137. if(hostHasDomain) {
  138. return redirectFn()
  139. }
  140. }
  141. }
  142. }
  143.  
  144. function youtubeMusicRedirect() {
  145. return redirect(hyperpipe)
  146. }
  147.  
  148. function quoraRedirect() {
  149. return redirect(quetre)
  150. }
  151.  
  152. function tiktokRedirect() {
  153. return redirect(proxitok)
  154. }
  155.  
  156. function odyseeRedirect() {
  157. return redirect(librarian)
  158. }
  159.  
  160. function imgurRedirect() {
  161. return redirect(rimgo)
  162. }
  163.  
  164. function mediumRedirect() {
  165. if(!/^\/$/.test(location.pathname)) {
  166. return redirect(scribe)
  167. } else {
  168. let perfObs = PerformanceObserver
  169.  
  170. if(perfObs) {
  171. let obs = new PerformanceObserver((list) => {
  172. let entries = list.getEntries()
  173.  
  174. for (let i = 0; i < entries.length; i++) {
  175. let entry = entries[i]
  176.  
  177. if(entry.name.endsWith('graphql')) {
  178. mainRedirect(location, data)
  179. }
  180. }
  181. })
  182.  
  183. obs.observe({
  184. entryTypes: ['resource']
  185. })
  186. } else {
  187. return redirect(scribe)
  188. }
  189. }
  190.  
  191. function getPerformanceObserver() {
  192. }
  193. }
  194.  
  195. function wikipediaRedirect() {
  196. let _host = host.split('.')
  197. let lang = 'en'
  198.  
  199. if(_host.length > 2 && _host[0] !== 'www') {
  200. lang = _host[0]
  201. }
  202.  
  203. return redirect(wikiless, '?lang=' + lang)
  204. }
  205.  
  206. function twitterRedirect() {
  207. return redirect(nitter)
  208. }
  209.  
  210. function redditRedirect() {
  211. return redirect(libreddit)
  212. }
  213.  
  214. function youtubeRedirect() {
  215. return redirect(invidious)
  216. }
  217.  
  218. function bingRedirect() {
  219. if(createSearchExp('bing', 'com').test(href)) {
  220. let searchParams = new URLSearchParams(search)
  221. let searchQuery = searchParams.get('q')
  222. let category
  223.  
  224. category = chooseCase(location.pathname, {
  225. images: CATEGORIES.IMAGES,
  226. videos: CATEGORIES.VIDEOS,
  227. news: CATEGORIES.NEWS,
  228. maps: CATEGORIES.MAP,
  229. }, DEFAULT_CATEGORY, false)
  230.  
  231. let _search = createSearch(searchQuery, category)
  232.  
  233. return redirectSearx(_search)
  234. }
  235. }
  236.  
  237. function yahooRedirect() {
  238. if(createSearchExp('yahoo', 'com').test(href)) {
  239. let searchParams = new URLSearchParams(search)
  240. let searchQuery = searchParams.get('p')
  241. let category
  242.  
  243. category = chooseCase(location.host, {
  244. images: CATEGORIES.IMAGES,
  245. video: CATEGORIES.VIDEOS,
  246. news: CATEGORIES.NEWS,
  247. }, DEFAULT_CATEGORY, false)
  248.  
  249. let _search = createSearch(searchQuery, category)
  250.  
  251. return redirectSearx(_search)
  252. }
  253. }
  254.  
  255. function googleRedirect() {
  256. if(host.match(/translate\.google\..{2,3}/)){
  257. if(search === '') {
  258. location.replace('https://' + lingva)
  259. } else {
  260. let _search = new URLSearchParams(search),
  261. sourceLang = _search.get('sl'),
  262. targetLang = _search.get('tl'),
  263. text = _search.get('text')
  264.  
  265. location.replace(HTTPS + lingva + '/' + sourceLang + '/' + targetLang + '/' + text)
  266. }
  267. } else if(/www.google.+/.test(href) && createSearchExp('google').test(href)) {
  268. let searchParams = new URLSearchParams(search)
  269. let searchQuery = searchParams.get('q')
  270. let searchCategory = searchParams.get('tbm')
  271. let category
  272.  
  273. category = chooseCase(searchCategory, {
  274. isch: CATEGORIES.IMAGES,
  275. vid: CATEGORIES.VIDEOS,
  276. bks: CATEGORIES.SCIENCE,
  277. nws: CATEGORIES.NEWS,
  278. }, DEFAULT_CATEGORY)
  279.  
  280. let _search = createSearch(searchQuery, category)
  281.  
  282. return redirectSearx(_search)
  283. }
  284. }
  285.  
  286. function redirectSearx(_search) {
  287. return redirect(searx, _search , '/search')
  288. }
  289.  
  290. function createSearchExp(secondLevelDomain, topLevelDomain = '') {
  291. return new RegExp(secondLevelDomain + '\\.' + topLevelDomain + '.*\\/search')
  292. }
  293.  
  294. function createSearch(searchQuery, category = DEFAULT_CATEGORY) {
  295. return `?q=${searchQuery}&categories=${category}`
  296. }
  297.  
  298. function chooseCase(x, obj, defaultValue, isEqualsTo = true) {
  299. let cases = Object.keys(obj)
  300.  
  301. for (let i = 0; i < cases.length; i++) {
  302. let currentCase = cases[i]
  303. let currentValue = obj[currentCase]
  304.  
  305. if(isEqualsTo) {
  306. if(x === currentCase) {
  307. return currentValue
  308. }
  309. } else {
  310. if(x.indexOf(currentCase) > -1) {
  311. return currentCase
  312. }
  313. }
  314. }
  315.  
  316. return defaultValue
  317. }
  318.  
  319. function redirect(domain, _search = search, pathname = location.pathname) {
  320. if(!_search.startsWith('?')) {
  321. _search = '?' + _search
  322. }
  323.  
  324. let redirectUrl = HTTPS + domain + pathname + _search
  325.  
  326. if(DEBUG_MODE) {
  327. return console.log(LOGS_TITLE, 'URL:', redirectUrl, 'DOMAIN:', domain, 'SEARCH:', _search, 'PATHNAME:', pathname)
  328. } else {
  329. return location.replace(redirectUrl)
  330. }
  331. }
  332.  
  333. function hostHas(str) {
  334. return location.host.indexOf(str) != -1
  335. }
  336. })()

QingJ © 2025

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