您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
YouTube:ユーザー、マイリスト、チャンネル ニコニコ動画:ユーザー、マイリスト、タグ reddit:キーワード検索結果、サブレディット、スレッド twitter:キーワード検索、ユーザー
当前为
// ==UserScript== // @name YouTubeとニコニコ動画にRSSリンクを追加 // @description YouTube:ユーザー、マイリスト、チャンネル ニコニコ動画:ユーザー、マイリスト、タグ reddit:キーワード検索結果、サブレディット、スレッド twitter:キーワード検索、ユーザー // @version 0.4 // @run-at document-idle // @match *://www.youtube.com/playlist?list=* // @match *://www.youtube.com/channel/* // @match *://www.youtube.com/user/* // @match *://www.youtube.com/watch* // @match *://www.youtube.com/results* // @match *://www.nicovideo.jp/user/* // @match *://www.nicovideo.jp/mylist/* // @match *://www.nicovideo.jp/tag/* // @match *://www.nicovideo.jp/related_tag/* // @match *://www.nicovideo.jp/search/* // @match *://www.nicovideo.jp/watch/* // @match *://www.nicovideo.jp/mylist_search/* // @match *://www.reddit.com/* // @match *://twitter.com/* // @grant none // @namespace https://greasyfork.org/users/181558 // ==/UserScript== (function() { if (location.href.match(/\/\/twitter\.com\//)) twitterRSS(); else if (location.href.match(/\/\/www\.youtube\.com\/|\/\/www\.nicovideo\.jp\/|\/\/www\.reddit\.com\//)) youtubeRSS(); return; // --------------------------------------------------------------------------------------------------------------------- function youtubeRSS() { (function() { var rssICON = '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABdUlEQVQ4ja3TL2iWURTH8c+VJwwxjjeMBQUxGRdkGESHBothw3CDwfTaFiwDm1MQViyiQRG8iviCYBAGKg60GEwm/2AZQ8bixIXxXsNzH717dSLiKYdzOHzv+Z17TsjJcdzEOBrs0VrnOxtWfhsb6IecfMBB/2Yfm/IyPMXbAjuKyb8A9JrSNqyE6BrkBKZxEWf+AGhCTr5iL+7hDt6FaL2ryMkM7mLiN4CtkJNvGKuSQ7zBEgYhkpNJPMehUUA96VuYw3XsxyMs52Q8RKs4gbXRFmrApxANQjSPA7iMGaxUkHOjgFrCSzzEkxDbl3Iyiwd4gVNFzmM/B7tDwjHcwOecLOREiAa4gpOYLXVLu0kYYoBnWMRCyV/FF8yX+BVWa0C3ordDNBei09qlupSTiRBt4T6O5KQX4g/IL4DNqpvNMpdO6+tSe7jE77uuG+1hwIWygWOV3rM52af9FTifkylMlXj7vxxTXzv9np3nvJt157yO/nf0A3GlIF+BggAAAABJRU5ErkJggg==">'; setTimeout(addLinks, 200); //ページ継ぎ足しアドオンに対応 if (location.href.match(/related_tag|mylist_search/)) document.addEventListener("AutoPagerize_DOMNodeInserted", addLinks); //AutoPagerize系アドオンでuserやタグページを継ぎ足した時に2ページ目以降のリンクがおかしくなるのを修正 //userページ if (location.href.match(/www.nicovideo.jp\/user/)) document.addEventListener("AutoPagerize_DOMNodeInserted", function() { for (let ele of elegeta("//div[@class='section']/h5/a[contains(@href,'https://www.nicovideo.jp/user/')]")) ele.href = "https://www.nicovideo.jp/watch/" + ele.href.replace(/https?:\/\/www.nicovideo.jp\/user\/\d*\/watch\//, ""); }); //related_tagページ if (location.href.match(/www.nicovideo.jp\/related_tag/)) document.addEventListener("AutoPagerize_DOMNodeInserted", function() { for (let ele of elegeta("//a[contains(@href,'https://www.nicovideo.jp/related_tag/tag/')]")) ele.href = "https://www.nicovideo.jp/tag/" + ele.href.replace(/https?:\/\/www.nicovideo.jp\/related_tag\/tag\//, ""); }); // setTimeout(redini,220); if (location.href.match(/^https?:\/\/www\.reddit\.com\/|www\.youtube\.com/)) { document.addEventListener('keydown', function(e) { if (e.key == "Enter") { for (let ele of elegeta('//*[@class="rrss"]|//*[@class="multirss"]')) ele.remove(); setTimeout(redini, 1333); } }, false); document.addEventListener('click', function(e) { for (let ele of elegeta('//*[@class="rrss"]|//*[@class="multirss"]')) ele.remove(); setTimeout(redini, 1333); }, false); } function removelast() { // 前回つけたRSSを剥がす for (let ele of elegeta('//*[@class="rrss"]|//*[@class="multirss"]')) ele.remove(); } function redini() { if (location.href.match(/^https?:\/\/www\.reddit\.com\/|www\.youtube\.com/)) removelast(); if (location.href.match(/^https?:\/\/www\.reddit\.com\/search\/?\?q=/gmi) && eleget0('//input[@id="header-search-bar"]')) { // reddit search removelast(); var url = "https://www.reddit.com/search.rss?q=***&sort=new".replace("***", eleget0('//div[1]/div/h3/span').innerText); embedAD(eleget0('//div[1]/div/h3/span'), url, eleget0('//div[1]/div/h3/span').value); } else if (location.href.match(/^https?:\/\/www\.reddit\.com\/r\//gmi) && location.href.match(/search|comments/) == null) { // reddit subreddit removelast(); var url = location.href + (location.href.match(/\/$/) ? ".rss" : "/.rss"); embedAD(eleget0('//div[@role="navigation"]/button'), url); } else if (location.href.match(/^https?:\/\/www\.reddit\.com\/.+/gmi) && location.href.match(/\/comments\//)) { // reddit thread removelast(); var url = location.href + (location.href.match(/\/$/) ? ".rss" : "/.rss"); embedAD(eleget0('//div/div[3]/div[1]/div/h1'), url); } addRSSlink("://www.youtube.com/playlist?list=", '//h1[@id="title"]/yt-formatted-string/a|//yt-formatted-string[@class="style-scope ytd-playlist-sidebar-primary-info-renderer"]/a|//a[@class="yt-simple-endpoint style-scope yt-formatted-string"]|//a[@class="yt-simple-endpoint style-scope yt-formatted-string cleaned"]', '<a href="https://www.youtube.com/feeds/videos.xml?playlist_id=***">*RSS Feed*</a>', "list="); addRSSlink("://www.youtube.com/channel/", '//div[@id="meta"]/ytd-channel-name[@id="channel-name"]|//span[@id="channel-title"]', '<a href="https://www.youtube.com/feeds/videos.xml?channel_id=***">*RSS Feed*</a>', "channel/"); addRSSlink("://www.youtube.com/user/", '//div[@id="meta"]/ytd-channel-name|//span[@id="channel-title"]', '<a href="https://www.youtube.com/feeds/videos.xml?user=***">*RSS Feed*</a>', "user/"); addRAD("://www.youtube.com/channel/", '//div[@id="meta"]/ytd-channel-name[@id="channel-name"]|//span[@id="channel-title"]', 'https://www.youtube.com/feeds/videos.xml?channel_id=***', "channel/"); addRAD("://www.youtube.com/user/", '//div[@id="meta"]/ytd-channel-name|//span[@id="channel-title"]', 'https://www.youtube.com/feeds/videos.xml?user=***', "user/"); addRAD("://www.youtube.com/playlist", '//a[@class="yt-simple-endpoint style-scope yt-formatted-string"]|//a[@class="yt-simple-endpoint style-scope yt-formatted-string cleaned"]', 'https://www.youtube.com/feeds/videos.xml?playlist_id=***', "list="); } return; function embedAD(place, url, title = "") { if (!place) return; var link = document.body.parentNode.insertBefore(document.createElement("link"), document.body); link.title = title || place.innerText; //itemName.replace("***", word); link.rel = "alternate"; link.type = "application/rss+xml"; link.className = "rrss"; link.href = url; //.replace("***", encodeURIComponent(word.replace(wordtermRE, replaceStr))); if (!link.title) return; var url = link.href; var ele = place.appendChild(document.createElement('span')); // var ele = place.parentNode.insertBefore(document.createElement('span'),place.nextsibling); ele.setAttribute("style", "font-weight:normal;"); ele.className = "rrss"; let rssICON = '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABdUlEQVQ4ja3TL2iWURTH8c+VJwwxjjeMBQUxGRdkGESHBothw3CDwfTaFiwDm1MQViyiQRG8iviCYBAGKg60GEwm/2AZQ8bixIXxXsNzH717dSLiKYdzOHzv+Z17TsjJcdzEOBrs0VrnOxtWfhsb6IecfMBB/2Yfm/IyPMXbAjuKyb8A9JrSNqyE6BrkBKZxEWf+AGhCTr5iL+7hDt6FaL2ryMkM7mLiN4CtkJNvGKuSQ7zBEgYhkpNJPMehUUA96VuYw3XsxyMs52Q8RKs4gbXRFmrApxANQjSPA7iMGaxUkHOjgFrCSzzEkxDbl3Iyiwd4gVNFzmM/B7tDwjHcwOecLOREiAa4gpOYLXVLu0kYYoBnWMRCyV/FF8yX+BVWa0C3ordDNBei09qlupSTiRBt4T6O5KQX4g/IL4DNqpvNMpdO6+tSe7jE77uuG+1hwIWygWOV3rM52af9FTifkylMlXj7vxxTXzv9np3nvJt157yO/nf0A3GlIF+BggAAAABJRU5ErkJggg==">'; // ele.innerHTML = " <a style='float:right;' href=" + link.href + " rel=\"noopener noreferrer nofollow\" title='" + link.title + "'>" + rssICON + "</a>"; ele.innerHTML = " <a href=" + link.href + " rel=\"noopener noreferrer nofollow\" title='" + link.title + "'>" + rssICON + "</a>"; } //実際にリンクを付ける function addLinks() { //「新しいタブで開く」指定を外す for (let ele of elegeta('//a[@target="_blank"]')) ele.removeAttribute("target"); //前回つけたリンクがあれば除去 for (let ele of elegeta("//span[@class='multirss']|//a[@class='multirss']")) ele.parentNode.removeChild(ele); for (let ele of elegeta("//*[@class='rrss']|//*[@class='multirss']")) ele.parentNode.removeChild(ele); redini(); var nicodeleteOpt = /[\?&]f_range=.|[\?&]l_range=.|[\?&]opt_md=.*|[\?&]start=.*|[\?&]end=.*|[\?&]ref=[^&]*|[\?&]sort=.|[\?&]order=.|[\?&]page=\d*|[\?&]track=[^&]*|#+.*/g; addRSSlink("www.nicovideo.jp/user/", '//div[@class="profile"]', '<a href="https://www.nicovideo.jp/user/***/video?rss=2.0">*RSS Feed*</a>', "/user/", "", nicodeleteOpt); addRSSlink("www.nicovideo.jp/mylist/", '//div[@id="SYS_box_mylist_header"]/div/h1', '<a href="https://www.nicovideo.jp/mylist/***">*RSS Feed*</a>', "", "?rss=2.0", nicodeleteOpt); addRSSlink("www.nicovideo.jp/tag/", '//header[@class="contentHeader"]/h1/span', '<a href="https://www.nicovideo.jp/tag/***">*RSS Feed*</a>', "", "?sort=f&rss=2.0", nicodeleteOpt); addRAD("www.nicovideo.jp/user/", '//div[@class="profile"]', 'https://www.nicovideo.jp/user/***/video?rss=2.0', "/user/", "", nicodeleteOpt); addRSSlink2("www.nicovideo.jp/related_tag/", '//table[@class="font12"]/tbody/tr/td/a', '<a href="https://www.nicovideo.jp/tag/***?sort=f&rss=2.0">*RSS Feed*</a>', "", "", nicodeleteOpt); addRSSlink2("www.nicovideo.jp/search", "//ul[@class='tags']//a", '<a href="https://www.nicovideo.jp/tag/***?sort=f&rss=2.0">*RSS Feed*</a>', "", "", nicodeleteOpt); addRSSlink2("www.nicovideo.jp/tag", "//ul[@class='tags']//a", '<a href="https://www.nicovideo.jp/tag/***?sort=f&rss=2.0">*RSS Feed*</a>', "", "", nicodeleteOpt); addRSSlink2("www.nicovideo.jp/watch/", '//a[@class="Link TagItem-name"]', '<a href="https://www.nicovideo.jp/tag/***?sort=f&rss=2.0">*RSS Feed*</a>', "", "", nicodeleteOpt); if (/www.nicovideo.jp\/mylist_search\//.exec(location.href)) for (let ele of elegeta('//div/div/div/div/div/div/p/a')) addRSS(ele, ele.href + "?rss=2.0", ele.innerText); return; } function eleget0(xpath) { var ele = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); return ele.snapshotLength > 0 ? ele.snapshotItem(0) : ""; } function elegeta(xpath) { var ele = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); var array = []; for (var i = 0; i < ele.snapshotLength; i++) array[i] = ele.snapshotItem(i); return array; } function addRAD(inurl, xpath, newurl, part, after, urlGarbage = /$^/) { // RSS auto-discoveryを付ける if (location.href.indexOf(inurl) == -1) return var place = eleget0(xpath); var link = place.parentNode.insertBefore(document.createElement("link"), place); var url2 = after ? ('<a href="' + url + after + '">*RSS Feed*</a>') : newurl.replace("***", location.href.split(part)[1].match(/[^\?&\/]*/g)[0]);; // link.innerHTML = 'rel="alternate" type="application/rss+xml" title="RSS" href="' + url2 + '"'; link.rel = "alternate" link.type = "application/rss+xml" link.title = document.title; link.href = url2; link.setAttribute("class", "multirss"); } function addRSS(place, url, title) { var link = place.parentNode.insertBefore(document.createElement("a"), place); link.href = url; link.setAttribute("title", title + "のRSSを購読"); link.setAttribute("class", "multirss"); link.innerHTML = rssICON; var rac = document.createElement("link"); rac.rel = "alternate" rac.type = "application/rss+xml" rac.title = title; rac.href = url rac.setAttribute("class", "multirss"); link.appendChild(rac); } function addRSSlink(inurl, xpath, newurl, part, after, urlGarbage = /$^/) { if (location.href.indexOf(inurl) == -1) return var ele = eleget0(xpath); var text = newurl + location.href.split(part)[1]; var url = location.href.replace(urlGarbage, ""); var link = document.createElement("span"); var url2 = after ? ('<a href="' + url + after + '">*RSS Feed*</a>') : newurl.replace("***", location.href.split(part)[1].match(/[^\?&\/]*/g)[0]); var bgcol = "background-color:#c9e9ff;"; link.setAttribute("title", ele.innerText + "のRSSを購読"); link.setAttribute("class", "multirss"); link.innerHTML = url2.replace("*RSS Feed*", rssICON) ele.parentNode.appendChild(link); addRAD1(ele, url2); return; } function addRSSlink2(inurl, xpath, newurl, part, after, urlGarbage = /$^/) { if (location.href.indexOf(inurl) == -1) return for (let ele of elegeta(xpath)) { var url = location.href.replace(urlGarbage, ""); var link = document.createElement("span"); var url2 = newurl.replace("***", encodeURIComponent(ele.innerText)); var bgcol = "background-color:#c9e9ff;"; link.setAttribute("title", ele.innerText + "のRSSを購読"); link.setAttribute("class", "multirss"); link.innerHTML = url2.replace("*RSS Feed*", rssICON) ele.parentNode.insertBefore(link, ele); addRAD1(ele, url2) } return; } function addRAD1(ele, url2) { var rac = document.createElement("link"); rac.rel = "alternate" rac.type = "application/rss+xml" rac.title = ele.innerText; rac.href = url2.match(/\"(.*)\"/)[1]; rac.setAttribute("class", "multirss"); ele.appendChild(rac); } })(); } // --------------------------------------------------------------------------------------------------------------------- function twitterRSS() { (function() { setTimeout(addAutoDiscovery, 1333); //addAutoDiscovery(); return; function addAutoDiscovery() { // Twitter検索へのRSSリンクとRSS Autodiscoveryを埋め込む for (let ele of elegeta('//*[@class="rrss"]')) ele.remove(); embedAutoDiscovery('//div[@class="ProfileHeaderCard"]/h2/a/span', /(^@)/, "from:@", "from:*** | Queryfeed Twitterユーザー", "https://Queryfeed.net/tw?q=***") embedAutoDiscovery('//div[@class="ProfileHeaderCard"]/h2/a/span', /(^@)/, "from:@", "from:*** (filter:images OR filter:videos) | Queryfeed Twitterユーザー 画像か動画", "https://Queryfeed.net/tw?q=***%20 (filter:images OR filter:videos)") embedAutoDiscovery('//div[@class="ProfileHeaderCard"]/h2/a/span', /(^@)/, "from:@", "from:*** (filter:videos) | Queryfeed Twitterユーザー 動画", "https://Queryfeed.net/tw?q=***%20 (filter:videos)") embedAutoDiscovery('//h1[@class="SearchNavigation-titleText"]', /(.)/, "$1", "*** | Queryfeed Twitterキーワード", "https://Queryfeed.net/tw?q=***") embedAutoDiscovery('//h1[@class="SearchNavigation-titleText"]', /(.)/, "$1", "*** | Queryfeed Twitterキーワード 画像か動画", "https://Queryfeed.net/tw?q=***%20 (filter:images OR filter:videos)") embedAutoDiscovery('//h1[@class="SearchNavigation-titleText"]', /(.)/, "$1", "*** | Queryfeed Twitterキーワード 動画", "https://Queryfeed.net/tw?q=***%20 (filter:videos)") return; if (location.href.match(/twitter/)) { document.addEventListener('keydown', function(e) { if (e.key == "Enter") setTimeout(addAutoDiscovery, 1333); }, false); document.addEventListener('click', function(e) { setTimeout(addAutoDiscovery, 1333); }, false); } } function embedAutoDiscovery(wordXP, wordtermRE, replaceStr, itemName, url) { // if (location.href.indexOf("google") == -1) return var ele = eleget0(wordXP); if (!ele || !(ele.innerText.match(wordtermRE))) return; var word = ele.innerText; if (itemName.match(/\(En\)/) && !(word.match(/^[\x20-\x7e]*$/))) return; // google news en なら半角英数以外を含んだらやらない var link = document.body.parentNode.insertBefore(document.createElement("link"), document.body); link.title = itemName.replace("***", word); link.rel = "alternate" link.type = "application/rss+xml" link.className = "rrss"; link.href = url.replace("***", encodeURIComponent(word.replace(wordtermRE, replaceStr))); var place = eleget0('//div/h2/a/span[@class="username u-dir"]|//h1[@class="SearchNavigation-titleText"]'); // var place = eleget0("//div[text()='ニュース']|//a[text()='ニュース']"); if (!place) return; var url = link.href; var ele = place.appendChild(document.createElement('span')); ele.className = "rrss"; ele.setAttribute("style", "font-weight:normal;"); let rssICON = '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABdUlEQVQ4ja3TL2iWURTH8c+VJwwxjjeMBQUxGRdkGESHBothw3CDwfTaFiwDm1MQViyiQRG8iviCYBAGKg60GEwm/2AZQ8bixIXxXsNzH717dSLiKYdzOHzv+Z17TsjJcdzEOBrs0VrnOxtWfhsb6IecfMBB/2Yfm/IyPMXbAjuKyb8A9JrSNqyE6BrkBKZxEWf+AGhCTr5iL+7hDt6FaL2ryMkM7mLiN4CtkJNvGKuSQ7zBEgYhkpNJPMehUUA96VuYw3XsxyMs52Q8RKs4gbXRFmrApxANQjSPA7iMGaxUkHOjgFrCSzzEkxDbl3Iyiwd4gVNFzmM/B7tDwjHcwOecLOREiAa4gpOYLXVLu0kYYoBnWMRCyV/FF8yX+BVWa0C3ordDNBei09qlupSTiRBt4T6O5KQX4g/IL4DNqpvNMpdO6+tSe7jE77uuG+1hwIWygWOV3rM52af9FTifkylMlXj7vxxTXzv9np3nvJt157yO/nf0A3GlIF+BggAAAABJRU5ErkJggg==">'; ele.innerHTML = " <a href=" + link.href + " rel=\"noopener noreferrer nofollow\" title='" + link.title + "'>" + rssICON + "</a>"; return; } function addLink(site, placexpath, terms, beforetitle, title, append, deleteoption, option) { if (location.href.indexOf(site) == -1) return; var place = eleget0(placexpath); if (!place) return; var url = window.location.href; if (terms !== "") url = url.replace(/&tbm=.*/, ""); if (terms !== "none") url = url + terms; url = url.replace(deleteoption, '') + option; var ele = document.createElement('span'); ele.setAttribute("style", "font-weight:normal;"); ele.innerHTML = beforetitle + "<a href=" + url + " rel=\"noopener noreferrer nofollow\">" + title + "</a>" + append; place.appendChild(ele); return; } function eleget0(xpath) { var ele = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); return ele.snapshotLength > 0 ? ele.snapshotItem(0) : ""; } function elegeta(xpath) { var ele = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); var array = []; for (var i = 0; i < ele.snapshotLength; i++) array[i] = ele.snapshotItem(i); return array; } })(); } })();