NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Imgur links rewriting on Ptt // @namespace https://github.com/gslin/imgur-links-rewriting-on-ptt // @match https://www.ptt.cc/bbs/* // @match https://www.ptt.cc/man/* // @grant GM_xmlhttpRequest // @version 0.20210822.1 // @author Gea-Suan Lin <gslin@gslin.com> // @description Rewrite imgur links to bypass referrer check. // @license MIT // ==/UserScript== (() => { 'use strict'; const get_imgur_id = url => { return url.replace(/^https?:\/\/(i\.)?imgur\.com\/(\w+).*/, '$2'); }; document.querySelectorAll('a[href^="https://imgur.com/"], a[href^="https://i.imgur.com/"]').forEach(async el => { // Remove .richcontent if existing. const next = el.nextElementSibling; if (next && next.classList.contains('richcontent')) { next.remove(); } const href = el.getAttribute('href'); let imgur_id = ''; if (href.match(/^https:\/\/imgur\.com\/a\//)) { // album case. const res = await new Promise(resolve => { GM_xmlhttpRequest({ 'anonymous': true, 'headers': { 'Referer': 'https://imgur.com/', }, 'method': 'GET', 'onload': res => { resolve(res.responseText); }, 'url': href, }); }); const parser = new DOMParser(); const doc = parser.parseFromString(res, 'text/html'); const og_image = doc.querySelector('meta[property="og:image"]'); const img_url = og_image.getAttribute('content'); imgur_id = get_imgur_id(img_url); console.log(imgur_id); } else { // image case. imgur_id = get_imgur_id(href); } const container = document.createElement('div'); container.setAttribute('style', 'margin-top:0.5em;text-align:center;'); const img = document.createElement('img'); img.setAttribute('referrerpolicy', 'no-referrer'); img.setAttribute('src', 'https://i.imgur.com/' + imgur_id + '.webp'); container.appendChild(img); el.insertAdjacentElement('afterend', container); }); })();