您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A thrown together script to open a tweets image in a new tab.
- // ==UserScript==
- // @name Open Tweet Image
- // @author Arctosmous
- // @namespace https://www.googledrive.com/host/0B0T32ON-a3StUWZGUW9TbFZCVHM/
- // @description A thrown together script to open a tweets image in a new tab.
- // @include https://twitter.com/*
- // @exclude https://twitter.com/settings/*
- // @grant none
- // @version 1.1.0
- // @noframes
- // ==/UserScript==
- var OpenTweetImage;
- (function (OpenTweetImage) {
- function GetOrigUrl(url) {
- if (url.indexOf(":") != url.lastIndexOf(":")) {
- url = url.substr(0, url.lastIndexOf(':'));
- }
- return url + ':orig';
- }
- var Gallery;
- (function (Gallery) {
- var lightbox = document.getElementsByClassName("Gallery-content")[0];
- var imageConainer = lightbox.getElementsByClassName("Gallery-media")[0];
- var openLink = document.createElement("a");
- openLink.id = "oti-link";
- openLink.target = "_blank";
- openLink.className = "modal-btn";
- openLink.style.position = "absolute";
- openLink.style.right = "-31px";
- openLink.style.padding = "0";
- openLink.style.height = "auto";
- openLink.style.top = "43px";
- openLink.style.color = "#fff";
- openLink.style.fontSize = "20px";
- lightbox.insertBefore(openLink, lightbox.childNodes[0]);
- var linkIcon = document.createElement("span");
- linkIcon.className = "Icon Icon--photo";
- openLink.appendChild(linkIcon);
- var observer = new MutationObserver(function (mutations) {
- mutations.forEach(function (mutation) {
- if (mutation.type == "childList") {
- if (imageConainer.children.length !== 0) {
- var image = imageConainer.children[0];
- openLink.href = GetOrigUrl(image.src);
- }
- else {
- openLink.href = "";
- }
- }
- });
- });
- observer.observe(imageConainer, {
- childList: true
- });
- })(Gallery || (Gallery = {}));
- var TweetTools = (function () {
- function TweetTools(tweet) {
- this.openButton = document.createElement("a");
- var t = this;
- t.tweet = tweet;
- t.GetMedia();
- t.actionFooter = tweet.getElementsByClassName("ProfileTweet-actionList")[0];
- // First and last buttons are too wide
- var twitterActions = t.actionFooter.getElementsByClassName("ProfileTweet-action");
- var replyTwitterAction = twitterActions[0];
- var moreTwitterAction = twitterActions[twitterActions.length - 1];
- replyTwitterAction.style.width = "60px";
- moreTwitterAction.style.width = "50px";
- var openContainer = document.createElement("div");
- openContainer.className = "ProfileTweet-action oti-new_tabs";
- openContainer.appendChild(t.openButton);
- openContainer.style.width = "50px";
- t.actionFooter.appendChild(openContainer);
- t.openButton.className = "ProfileTweet-actionButton u-textUserColorHover js-actionButton js-tooltip";
- t.openButton.title = "Open All";
- if (t.downloadableMedia.length == 1) {
- t.openButton.href = t.downloadableMedia[0];
- t.openButton.target = "_blank";
- }
- else {
- t.openButton.onclick = function () {
- t.downloadableMedia.forEach(function (mediaUrl) {
- window.open(mediaUrl, "_blank");
- });
- t.mobileMedia.forEach(function (mediaUrl) {
- window.open(mediaUrl, "_blank");
- });
- };
- }
- var openIcon = document.createElement("span");
- openIcon.className = "Icon Icon--collections";
- t.openButton.appendChild(openIcon);
- tweet.className += " has-oti-tools";
- }
- TweetTools.prototype.GetMp4Gif = function (media) {
- var t = this;
- var iframe = media.getElementsByTagName("iframe")[0];
- var fuckingIframesPosDoesntWorkAndYourBullshit = setInterval(function () {
- if (iframe.contentWindow != null) {
- var video = iframe.contentWindow.document.getElementsByTagName("video");
- if (video.length > 0) {
- t.downloadableMedia.push(video[0].src);
- clearInterval(fuckingIframesPosDoesntWorkAndYourBullshit);
- }
- }
- else {
- clearInterval(fuckingIframesPosDoesntWorkAndYourBullshit);
- }
- }, 500);
- };
- TweetTools.prototype.GetMedia = function () {
- var t = this;
- var media = t.tweet.getElementsByClassName("AdaptiveMedia")[0];
- t.downloadableMedia = [];
- t.mobileMedia = [];
- var images = media.getElementsByTagName("img");
- [].forEach.call(images, function (image) {
- var origImg = GetOrigUrl(image.src);
- t.downloadableMedia.push(origImg);
- });
- if (media.classList.contains("is-generic-video")) {
- if (media.getElementsByClassName("PlayableMedia--gif").length > 0) {
- if (media.getElementsByTagName("iframe").length > 0) {
- t.GetMp4Gif(media);
- }
- else {
- var playerContainer_1 = media.getElementsByClassName("PlayableMedia-player")[0];
- var mediaObserver_1 = new MutationObserver(function (mutations) {
- mutations.forEach(function (mutation) {
- if (mutation.type == "childList" && playerContainer_1.children.length) {
- t.GetMp4Gif(media);
- mediaObserver_1.disconnect();
- }
- });
- });
- mediaObserver_1.observe(playerContainer_1, {
- childList: true
- });
- }
- }
- else {
- t.mobileMedia.push("https://mobile.twitter.com" + t.tweet.dataset["permalinkPath"]);
- }
- }
- };
- return TweetTools;
- }());
- function initTools() {
- var tweets = document.querySelectorAll(".has-cards:not(.has-oti-tools):not(.cards-forward):not([data-card2-type])");
- [].forEach.call(tweets, function (tweet) {
- new TweetTools(tweet);
- });
- }
- var timelineObserver = new MutationObserver(function (mutations) {
- mutations.forEach(function (mutation) {
- if (mutation.type == "childList") {
- initTools();
- }
- });
- });
- var overlayObserver = new MutationObserver(function (mutations) {
- mutations.forEach(function (mutation) {
- if (mutation.type == "childList") {
- var overlayContainer = document.getElementsByClassName("PermalinkOverlay-body")[0];
- if (overlayContainer.children.length !== 0) {
- timelineObserver.disconnect();
- initTools();
- var overlayStreams = overlayContainer.getElementsByClassName(".stream-items");
- [].forEach.call(overlayStreams, function (stream) {
- timelineObserver.observe(stream, {
- childList: true
- });
- });
- }
- }
- });
- });
- var bodyObserver = new MutationObserver(function (mutations) {
- mutations.forEach(function (mutation) {
- if (mutation.type == "attributes") {
- timelineObserver.disconnect();
- overlayObserver.disconnect();
- initTools();
- if (document.body.classList.contains("overlay-enabled")) {
- var overlayContainer = document.getElementsByClassName("PermalinkOverlay-body")[0];
- overlayObserver.observe(overlayContainer, {
- childList: true
- });
- [].forEach.call(overlayContainer.getElementsByClassName("stream-items"), function (stream) {
- timelineObserver.observe(stream, {
- childList: true
- });
- });
- }
- else {
- timelineObserver.observe(document.getElementById("stream-items-id"), {
- childList: true
- });
- }
- }
- });
- });
- function initBodyObserver() {
- bodyObserver.observe(document.body, {
- attributes: true
- });
- }
- initBodyObserver();
- })(OpenTweetImage || (OpenTweetImage = {}));