// ==UserScript== // @name Twitter Original Image Link // @name:ja Twitter 原寸画像リンク // @description Simple script that replace an image link with an original image URL if you click links on Tweet for navigating the image on new tab or copying the URL. // @description:ja ツイート上の画像をクリックしたとき (新しいタブで開く・URLのコピー) に、画像のリンクを原寸画像のURLに置換する軽量スクリプトです。 // @namespace https://greasyfork.org/users/137 // @version 2.0.1 // @match https://twitter.com/* // @exclude https://twitter.com/settings* // @exclude https://twitter.com/tos* // @exclude https://twitter.com/privacy* // @exclude https://twitter.com/jobs* // @exclude https://twitter.com/account/* // @exclude https://twitter.com/intent/* // @exclude https://twitter.com/i/cards/* // @match https://tweetdeck.twitter.com/* // @license MPL-2.0 // @contributionURL https://www.amazon.co.jp/registry/wishlist/E7PJ5C3K7AM2 // @compatible Edge // @compatible Firefox Firefoxを推奨 / Firefox is recommended // @compatible Opera // @compatible Chrome // @grant dummy // @run-at document-start // @icon https://abs.twimg.com/favicons/twitter.ico // @author 100の人 // @homepageURL https://greasyfork.org/users/137 // @downloadURL none // ==/UserScript== 'use strict'; const tweetDeck = location.origin === 'https://tweetdeck.twitter.com'; function replaceImageLink(event) { /** @type {HTMLElement} */ const target = event.target; const localName = target.localName; if (tweetDeck ? localName !== 'a' || event.target.rel !== 'mediaPreview' : localName !== 'img') { return; } /** @type {HTMLAnchorElement} */ const anchor = tweetDeck ? target : event.target.closest('[href$="/photo/1"], [href$="/photo/2"], [href$="/photo/3"], [href$="/photo/4"]'); if (!tweetDeck && (!anchor || !anchor.matches('article *'))) { return; } const url = new URL(tweetDeck ? /https:\/\/[^"]+/.exec(target.style.backgroundImage)[0] : event.target.src); if (tweetDeck) { const result = /\.([a-z]{3})$/.exec(url.pathname); if (result) { url.searchParams.set('format', result[1]); } } url.searchParams.set('name', 'orig'); anchor.href = url; } addEventListener('click', replaceImageLink, true); addEventListener('auxclick', replaceImageLink, true);