Unpaywall Button

Adds a button to archive the page on Archive.today for specific websites

  1. // ==UserScript==
  2. // @name Unpaywall Button
  3. // @license MIT
  4. // @namespace http://tampermonkey.net/
  5. // @version 1.0
  6. // @description Adds a button to archive the page on Archive.today for specific websites
  7. // @author Your Name
  8. // @include *://cnn.com/*
  9. // @include *://*.cnn.com/*
  10. // @include *://bbc.com/*
  11. // @include *://*.bbc.com/*
  12. // @include *://nytimes.com/*
  13. // @include *://*.nytimes.com/*
  14. // @include *://foxnews.com/*
  15. // @include *://*.foxnews.com/*
  16. // @include *://huffpost.com/*
  17. // @include *://*.huffpost.com/*
  18. // @include *://reuters.com/*
  19. // @include *://*.reuters.com/*
  20. // @include *://bloomberg.com/*
  21. // @include *://*.bloomberg.com/*
  22. // @include *://theguardian.com/*
  23. // @include *://*.theguardian.com/*
  24. // @include *://forbes.com/*
  25. // @include *://*.forbes.com/*
  26. // @include *://usatoday.com/*
  27. // @include *://*.usatoday.com/*
  28. // @include *://npr.org/*
  29. // @include *://*.npr.org/*
  30. // @include *://washingtonpost.com/*
  31. // @include *://*.washingtonpost.com/*
  32. // @include *://aljazeera.com/*
  33. // @include *://*.aljazeera.com/*
  34. // @include *://abcnews.go.com/*
  35. // @include *://*.abcnews.go.com/*
  36. // @include *://cbsnews.com/*
  37. // @include *://*.cbsnews.com/*
  38. // @include *://nbcnews.com/*
  39. // @include *://*.nbcnews.com/*
  40. // @include *://news.yahoo.com/*
  41. // @include *://*.news.yahoo.com/*
  42. // @include *://latimes.com/*
  43. // @include *://*.latimes.com/*
  44. // @include *://politico.com/*
  45. // @include *://*.politico.com/*
  46. // @include *://wsj.com/*
  47. // @include *://*.wsj.com/*
  48. // @include *://thehill.com/*
  49. // @include *://*.thehill.com/*
  50. // @include *://vox.com/*
  51. // @include *://*.vox.com/*
  52. // @include *://buzzfeednews.com/*
  53. // @include *://*.buzzfeednews.com/*
  54. // @include *://time.com/*
  55. // @include *://*.time.com/*
  56. // @include *://cnbc.com/*
  57. // @include *://*.cnbc.com/*
  58. // @include *://businessinsider.com/*
  59. // @include *://*.businessinsider.com/*
  60. // @include *://axios.com/*
  61. // @include *://*.axios.com/*
  62. // @include *://slate.com/*
  63. // @include *://*.slate.com/*
  64. // @include *://newyorker.com/*
  65. // @include *://*.newyorker.com/*
  66. // @include *://vanityfair.com/*
  67. // @include *://*.vanityfair.com/*
  68. // @include *://nationalreview.com/*
  69. // @include *://*.nationalreview.com/*
  70. // @include *://dailywire.com/*
  71. // @include *://*.dailywire.com/*
  72. // @include *://drudgereport.com/*
  73. // @include *://*.drudgereport.com/*
  74. // @include *://breitbart.com/*
  75. // @include *://*.breitbart.com/*
  76. // @include *://theatlantic.com/*
  77. // @include *://*.theatlantic.com/*
  78. // @include *://newyorkpost.com/*
  79. // @include *://*.newyorkpost.com/*
  80. // @include *://independent.co.uk/*
  81. // @include *://*.independent.co.uk/*
  82. // @include *://telegraph.co.uk/*
  83. // @include *://*.telegraph.co.uk/*
  84. // @include *://dailymail.co.uk/*
  85. // @include *://*.dailymail.co.uk/*
  86. // @include *://express.co.uk/*
  87. // @include *://*.express.co.uk/*
  88. // @include *://mirror.co.uk/*
  89. // @include *://*.mirror.co.uk/*
  90. // @include *://thesun.co.uk/*
  91. // @include *://*.thesun.co.uk/*
  92. // @include *://metro.co.uk/*
  93. // @include *://*.metro.co.uk/*
  94. // @include *://sky.com/*
  95. // @include *://*.sky.com/*
  96. // @include *://euronews.com/*
  97. // @include *://*.euronews.com/*
  98. // @include *://rt.com/*
  99. // @include *://*.rt.com/*
  100. // @include *://france24.com/*
  101. // @include *://*.france24.com/*
  102. // @include *://dw.com/*
  103. // @include *://*.dw.com/*
  104. // @include *://ctvnews.ca/*
  105. // @include *://*.ctvnews.ca/*
  106. // @include *://globalnews.ca/*
  107. // @include *://*.globalnews.ca/*
  108. // @include *://cbc.ca/*
  109. // @include *://*.cbc.ca/*
  110. // @grant GM.xmlHttpRequest
  111. // @run-at document-end
  112. // ==/UserScript==
  113.  
  114. (function() {
  115. 'use strict';
  116.  
  117. const hostnames = [
  118. 'archive.is',
  119. 'archive.ph',
  120. 'archive.today',
  121. 'archive.fp',
  122. 'archive.li',
  123. 'archive.md',
  124. 'archive.vn'
  125. ];
  126.  
  127. function sleep(t) {
  128. return new Promise(resolve => setTimeout(resolve, t));
  129. }
  130.  
  131. function checkAvailability(hostname) {
  132. return new Promise(function(resolve, reject) {
  133. const onResponse = function(response) {
  134. if ((response.status >= 200 && response.status <= 400) || response.status === 429) {
  135. resolve(response);
  136. } else {
  137. reject(new Error('HOST_UNAVAILABLE'));
  138. }
  139. };
  140. GM.xmlHttpRequest({
  141. url: `https://${hostname}/`,
  142. method: 'GET',
  143. headers: {
  144. Range: 'bytes=0-63'
  145. },
  146. onload: onResponse,
  147. onerror: onResponse
  148. });
  149. });
  150. }
  151.  
  152. async function archivePage(url) {
  153. let workingHostname = null;
  154. for (const hostname of hostnames) {
  155. try {
  156. await checkAvailability(hostname);
  157. workingHostname = hostname;
  158. break;
  159. } catch (err) {
  160. if (err && 'message' in err && err.message === 'HOST_UNAVAILABLE') {
  161. console.debug(`${hostname} is NOT available`);
  162. } else {
  163. throw err;
  164. }
  165. }
  166. }
  167.  
  168. if (workingHostname) {
  169. document.location.href = `https://${workingHostname}/?run=1&url=${encodeURIComponent(url)}`;
  170. } else {
  171. alert('All Archive.today domains seem to be down.');
  172. }
  173. }
  174.  
  175. function createButton() {
  176. const button = document.createElement('button');
  177. button.innerText = 'Unpaywall';
  178. button.style.position = 'fixed';
  179. button.style.bottom = '10px';
  180. button.style.right = '10px';
  181. button.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
  182. button.style.color = 'white';
  183. button.style.border = 'none';
  184. button.style.borderRadius = '5px';
  185. button.style.padding = '10px';
  186. button.style.cursor = 'pointer';
  187. button.style.zIndex = '10000';
  188. button.style.opacity = '0.8';
  189.  
  190. button.addEventListener('click', () => archivePage(window.location.href));
  191.  
  192. document.body.appendChild(button);
  193. }
  194.  
  195. function main() {
  196. console.log('Unpaywall script running');
  197. createButton();
  198. }
  199.  
  200. main();
  201. })();

QingJ © 2025

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