F

Userscript to retrieve archived versions of dead links

  1. // ==UserScript==
  2. // @name F
  3. // @version 0.1.1
  4. // @description Userscript to retrieve archived versions of dead links
  5. // @license GPL-3.0
  6. // @author Heterosexual
  7. // @namespace https://github.com/heterosexual
  8. // @include *
  9. // @grant GM_registerMenuCommand
  10. // @grant GM_xmlhttpRequest
  11. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAMAAAAOusbgAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAB3RJTUUH4QgVEBkmE1ABfgAAAR1QTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////xWCkcwAAAF10Uk5TAAECAwQFBggJCw4PEBESFhobHh8hIyQnKSosLS83OTs+P0ZKVVZcXV5fbm9wgoeOkJObn6CjpKWmqqusra+wsba4vcPExsvMzc/S29ze3+Lj5ufs7e7v8PP09fj51vb7RgAAAAFiS0dEXgTWYbsAAAJwSURBVGje7Zv9d5JQGMclmIpQFMkQV+oqt2VZpHNWul60pXNbuDndaPn//xt5wRP38HJA8I7U5/OT93vO9fMD3OfAcx4SCQAA1oZULm/CoxUl7uQtFBZltIRnchJlSRmLdiQaZayCZyKFMn6+zKUc4tzZeGRQRiumfjP6x7VWQFmmM7Gy8SCLsuxgbGWTTgZlBe3aym7qDMrK811nOYc4P5qa7Bni1hTjtoQyrodnmoQyScOzHoey0i2etQzx3nw1yvuJ2/hm3Vs8dBHrC4svGjOKxvWsNBsWNRll6SqWHakCygT1yMqa1TTK5Bq2tVkxrnsR/b7wFDfI3r8NEMcr5sv7B0Wy4uLBfpmHUr2BUAzD0GQV9ExBOVLxsH1cISuuHLfrIhQQEIM4fjFFe0IRFb9sffbg4zOi4rdTL/68ICp+szZiRdPvamTFtTtdUxwpWyjtyoHFk95PByfPfbbKu6UCG/owmuJvAv/QDr9FtAqY4i9kJestpjMclyYrTnNcxvlYJ3X6p1Wy4uppvyNFLCChxMuoXCAGMYhBvHri708f23jyKKRYHgwv1cBi/dzOrw++/QT1cjhwPl0ls9K2EFjswifGb6uwLWWTibBEEEdjU8Xn6nsb6usH4f5wsZsr1Dl2v7lmx+lKJStWr9yOE5RMEIMYxCD+/8WxvZjH1ooICrSbVle8WBM1lNi9iapovwO1jc0O/dcwbwTubeOgBeTVj263e/IuzEN0tMq1xSJSiXsXRwDEIAYxiJcsFusxDaDENnIDrD+xDQtC5doMcWxjzj6D3X1ig91LGmVfTGwb3j+8t+H92D5XAABgZfkLa+RAgNiSWKYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTctMDgtMjFUMTY6MjU6MTkrMDA6MDC2yHQ/AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE3LTA4LTIxVDE2OjI1OjE5KzAwOjAwx5XMgwAAABt0RVh0U29mdHdhcmUAQVBORyBBc3NlbWJsZXIgMy4wXkUsHAAAAABJRU5ErkJggg==
  12. // ==/UserScript==
  13.  
  14. (() => {
  15. "use strict";
  16.  
  17. const archives = {
  18. "archive.org": 'https://archive.org/wayback/available?url=%s',
  19. "archive.is": 'https://archive.is/timegate/%s'
  20. };
  21.  
  22. function findArchived(url, id) {
  23. GM_xmlhttpRequest({
  24. method: "GET",
  25. url: url,
  26. onload: (data) => {
  27. if (id === "archive.org") {
  28. const decoded = JSON.parse(data.response);
  29. if(decoded.archived_snapshots.closest) {
  30. window.location.href = decoded.archived_snapshots.closest.url.replace("http://", "https://");
  31. }
  32. }
  33. if (id === "archive.is") {
  34. if (data.finalUrl != url) {
  35. window.location.href = data.finalUrl.replace("http://", "https://");
  36. }
  37. }
  38. },
  39. onerror: (data) => {
  40. console.log(data.response);
  41. }
  42. });
  43. }
  44.  
  45. GM_registerMenuCommand("F. Search for archived pages", () => {
  46. let link = prompt("Enter a link or leave blank to search for the current page");
  47.  
  48. /* Cancel */
  49. if (link === null) {
  50. return;
  51. }
  52.  
  53. /* Current page */
  54. if (link === "") {
  55. link = window.location.href;
  56. }
  57.  
  58. for (const id in archives) {
  59. findArchived(archives[id].replace(/%s/g, link), id);
  60. }
  61. });
  62. })();