Privacy Frontend Redirect

Redirect to privacy friendly front-ends of popular services.

当前为 2023-02-02 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Privacy Frontend Redirect
  3. // @match *://*/*
  4. // @grant none
  5. // @version 3.1.3
  6. // @author NoUser
  7. // @description Redirect to privacy friendly front-ends of popular services.
  8. // @run-at document-start
  9. // @namespace https://greasyfork.org/en/scripts/458875-privacy-frontend-redirect
  10. // @homepage https://greasyfork.org/en/scripts/458875-privacy-frontend-redirect
  11. // @license MIT
  12. // ==/UserScript==
  13.  
  14. // Attempt to prevent prefetching the non frontend services
  15. // const prefetchLinks = document.querySelectorAll("link[rel='prefetch']");
  16. // prefetchLinks.forEach(link => link.parentNode.removeChild(link));
  17.  
  18. const hostname = window.location.hostname;
  19. const hosts = {
  20. "www.youtube.com": ["invidious.privacydev.net", "invidious.dhusch.de", "vid.puffyan.us", "inv.vern.cc", "invidious.kavin.rocks", "invidious.tiekoetter.com", "inv.riverside.rocks", "vid.priv.au", "invidious.snopyta.org", "iv.ggtyler.dev", "invidious.namazso.eu", "invidious.nerdvpn.de", "invidious.silur.me", "tube.cadence.moe"],
  21. "www.youtube-nocookie.com": ["invidious.privacydev.net", "invidious.dhusch.de", "vid.puffyan.us", "inv.vern.cc", "invidious.kavin.rocks", "invidious.tiekoetter.com", "inv.riverside.rocks", "vid.priv.au", "invidious.snopyta.org", "iv.ggtyler.dev", "invidious.namazso.eu", "invidious.nerdvpn.de", "invidious.silur.me", "tube.cadence.moe"],
  22. "m.youtube.com": ["invidious.privacydev.net", "invidious.dhusch.de", "vid.puffyan.us", "inv.vern.cc", "invidious.kavin.rocks", "invidious.tiekoetter.com", "inv.riverside.rocks", "vid.priv.au", "invidious.snopyta.org", "iv.ggtyler.dev", "invidious.namazso.eu", "invidious.nerdvpn.de", "invidious.silur.me", "tube.cadence.moe"],
  23. "twitter.com": ["nitter.sneed.network", "canada.unofficialbird.com", "nitter.privacytools.io", "nitter.foss.wtf", "nitter.privacy.com.de", "nitter.1d4.us", "nitter.pussthecat.org", "nitter.poast.org", "twitter.censors.us"],
  24. "mobile.twitter.com": ["nitter.sneed.network", "canada.unofficialbird.com", "nitter.privacytools.io", "nitter.foss.wtf", "nitter.privacy.com.de", "nitter.1d4.us", "nitter.pussthecat.org", "nitter.poast.org", "twitter.censors.us"],
  25. "www.reddit.com": ["libreddit.eu.org", "libreddit.spike.codes", "lr.odyssey346.dev", "rd.funami.tech", "libreddit.dcs0.hu", "lr.vern.cc", "www.troddit.com"],
  26. "imgur.com": ["rimgo.pussthecat.org", "rimgo.totaldarkness.net", "rimgo.vern.cc", "imgur.artemislena.eu", "rimgo.privacydev.net", "rimgo.bus-hit.me"],
  27. "i.imgur.com": ["rimgo.pussthecat.org", "rimgo.totaldarkness.net", "rimgo.vern.cc", "imgur.artemislena.eu", "rimgo.privacydev.net", "rimgo.bus-hit.me"],
  28. "www.instagram.com": ["bibliogram.froth.zone", "ig.tokhmi.xyz", "bibliogram.priv.pw"],
  29. "www.tiktok.com": ["proxitok.pussthecat.org", "proxitok.esmailelbob.xyz", "tok.habedieeh.re", "tok.artemislena.eu", "proxitok.privacydev.net", "proxitok.manasiwibi.com"],
  30. "www.imdb.com": ["ld.vern.cc", "libremdb.esmailelbob.xyz", "lmdb.tokhmi.xyz", "libremdb.iket.me", "libremdb.pussthecat.org"],
  31. "translate.google.com": ["lingva.ml", "translate.plausibility.cloud", "lingva.lunar.icu", "translate.projectsegfau.lt", "translate.jae.fi"],
  32. "medium.com": ["scribe.rip", "scribe.nixnet.services", "scribe.citizen4.eu", "scribe.bus-hit.me", "scribe.froth.zone", "scribe.rawbit.ninja"],
  33. };
  34.  
  35. const getReplacement = (host) => {
  36. if (host in hosts) {
  37. let replacement = hosts[host];
  38. if (Array.isArray(replacement)) {
  39. replacement = replacement[Math.floor(Math.random() * replacement.length)];
  40. }
  41. return replacement;
  42. }
  43. };
  44.  
  45. const replaceUrl = (url, host) => {
  46. const replacement = getReplacement(host);
  47. if (replacement) {
  48. return url.replace(host, replacement);
  49. }
  50. return url;
  51. };
  52.  
  53. if (getReplacement(hostname)) {
  54. window.location.href = replaceUrl(window.location.href, hostname);
  55. }
  56.  
  57. window.addEventListener("load", function () {
  58. // Replace iframes
  59. const iframes = document.getElementsByTagName("iframe");
  60. Array.from(iframes).forEach(iframe => {
  61. let src = iframe.src;
  62. let url = new URL(src);
  63. let host = url.host;
  64. iframe.src = replaceUrl(src, host);
  65. });
  66. // Replace hrefs
  67. const links = document.getElementsByTagName("a");
  68. for (let i = 0; i < links.length; i++) {
  69. let link = links[i];
  70. let href = link.href;
  71. let url = new URL(href);
  72. let host = url.host;
  73. if (host in hosts) {
  74. let replacement = hosts[host];
  75. if (Array.isArray(replacement)) {
  76. replacement = replacement[Math.floor(Math.random() * replacement.length)];
  77. }
  78. link.href = href.replace(host, replacement);
  79. }
  80. }
  81. });