Adds a button to archive the page on Archive.today for specific websites
// ==UserScript== // @name Unpaywall Button // @license MIT // @namespace http://tampermonkey.net/ // @version 1.0 // @description Adds a button to archive the page on Archive.today for specific websites // @author Your Name // @include *://cnn.com/* // @include *://*.cnn.com/* // @include *://bbc.com/* // @include *://*.bbc.com/* // @include *://nytimes.com/* // @include *://*.nytimes.com/* // @include *://foxnews.com/* // @include *://*.foxnews.com/* // @include *://huffpost.com/* // @include *://*.huffpost.com/* // @include *://reuters.com/* // @include *://*.reuters.com/* // @include *://bloomberg.com/* // @include *://*.bloomberg.com/* // @include *://theguardian.com/* // @include *://*.theguardian.com/* // @include *://forbes.com/* // @include *://*.forbes.com/* // @include *://usatoday.com/* // @include *://*.usatoday.com/* // @include *://npr.org/* // @include *://*.npr.org/* // @include *://washingtonpost.com/* // @include *://*.washingtonpost.com/* // @include *://aljazeera.com/* // @include *://*.aljazeera.com/* // @include *://abcnews.go.com/* // @include *://*.abcnews.go.com/* // @include *://cbsnews.com/* // @include *://*.cbsnews.com/* // @include *://nbcnews.com/* // @include *://*.nbcnews.com/* // @include *://news.yahoo.com/* // @include *://*.news.yahoo.com/* // @include *://latimes.com/* // @include *://*.latimes.com/* // @include *://politico.com/* // @include *://*.politico.com/* // @include *://wsj.com/* // @include *://*.wsj.com/* // @include *://thehill.com/* // @include *://*.thehill.com/* // @include *://vox.com/* // @include *://*.vox.com/* // @include *://buzzfeednews.com/* // @include *://*.buzzfeednews.com/* // @include *://time.com/* // @include *://*.time.com/* // @include *://cnbc.com/* // @include *://*.cnbc.com/* // @include *://businessinsider.com/* // @include *://*.businessinsider.com/* // @include *://axios.com/* // @include *://*.axios.com/* // @include *://slate.com/* // @include *://*.slate.com/* // @include *://newyorker.com/* // @include *://*.newyorker.com/* // @include *://vanityfair.com/* // @include *://*.vanityfair.com/* // @include *://nationalreview.com/* // @include *://*.nationalreview.com/* // @include *://dailywire.com/* // @include *://*.dailywire.com/* // @include *://drudgereport.com/* // @include *://*.drudgereport.com/* // @include *://breitbart.com/* // @include *://*.breitbart.com/* // @include *://theatlantic.com/* // @include *://*.theatlantic.com/* // @include *://newyorkpost.com/* // @include *://*.newyorkpost.com/* // @include *://independent.co.uk/* // @include *://*.independent.co.uk/* // @include *://telegraph.co.uk/* // @include *://*.telegraph.co.uk/* // @include *://dailymail.co.uk/* // @include *://*.dailymail.co.uk/* // @include *://express.co.uk/* // @include *://*.express.co.uk/* // @include *://mirror.co.uk/* // @include *://*.mirror.co.uk/* // @include *://thesun.co.uk/* // @include *://*.thesun.co.uk/* // @include *://metro.co.uk/* // @include *://*.metro.co.uk/* // @include *://sky.com/* // @include *://*.sky.com/* // @include *://euronews.com/* // @include *://*.euronews.com/* // @include *://rt.com/* // @include *://*.rt.com/* // @include *://france24.com/* // @include *://*.france24.com/* // @include *://dw.com/* // @include *://*.dw.com/* // @include *://ctvnews.ca/* // @include *://*.ctvnews.ca/* // @include *://globalnews.ca/* // @include *://*.globalnews.ca/* // @include *://cbc.ca/* // @include *://*.cbc.ca/* // @grant GM.xmlHttpRequest // @run-at document-end // ==/UserScript== (function() { 'use strict'; const hostnames = [ 'archive.is', 'archive.ph', 'archive.today', 'archive.fp', 'archive.li', 'archive.md', 'archive.vn' ]; function sleep(t) { return new Promise(resolve => setTimeout(resolve, t)); } function checkAvailability(hostname) { return new Promise(function(resolve, reject) { const onResponse = function(response) { if ((response.status >= 200 && response.status <= 400) || response.status === 429) { resolve(response); } else { reject(new Error('HOST_UNAVAILABLE')); } }; GM.xmlHttpRequest({ url: `https://${hostname}/`, method: 'GET', headers: { Range: 'bytes=0-63' }, onload: onResponse, onerror: onResponse }); }); } async function archivePage(url) { let workingHostname = null; for (const hostname of hostnames) { try { await checkAvailability(hostname); workingHostname = hostname; break; } catch (err) { if (err && 'message' in err && err.message === 'HOST_UNAVAILABLE') { console.debug(`${hostname} is NOT available`); } else { throw err; } } } if (workingHostname) { document.location.href = `https://${workingHostname}/?run=1&url=${encodeURIComponent(url)}`; } else { alert('All Archive.today domains seem to be down.'); } } function createButton() { const button = document.createElement('button'); button.innerText = 'Unpaywall'; button.style.position = 'fixed'; button.style.bottom = '10px'; button.style.right = '10px'; button.style.backgroundColor = 'rgba(0, 0, 0, 0.5)'; button.style.color = 'white'; button.style.border = 'none'; button.style.borderRadius = '5px'; button.style.padding = '10px'; button.style.cursor = 'pointer'; button.style.zIndex = '10000'; button.style.opacity = '0.8'; button.addEventListener('click', () => archivePage(window.location.href)); document.body.appendChild(button); } function main() { console.log('Unpaywall script running'); createButton(); } main(); })();