Greasy Fork 支持简体中文。

Copy RSS Feed

Automatically detect and quickly display the RSS subscription information of the current website for easy copying.

  1. // ==UserScript==
  2. // @name Copy RSS Feed
  3. // @name:zh 复制RSS地址
  4. // @name:zh-CN 复制RSS地址
  5. // @description Automatically detect and quickly display the RSS subscription information of the current website for easy copying.
  6. // @description:zh 自动检测并快捷展示当前网站的 RSS 订阅信息,方便复制(Copy RSS Feed)
  7. // @description:zh-CN 自动检测并快捷展示当前网站的 RSS 订阅信息,方便复制(Copy RSS Feed)
  8. // @author Wilsonyiyi
  9. // @namespace https://github.com/wilsonyiyi
  10. // @icon data:image/png;base64,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
  11. // @match *://*/*
  12. // @grant GM_setClipboard
  13. // @grant GM_addStyle
  14. // @license GPL3.0
  15. // @version 1.0.3
  16. // ==/UserScript==
  17.  
  18. (function() {
  19. 'use strict';
  20.  
  21. GM_addStyle(`
  22. #__wilsonyiyi__rss-float-container {
  23. position: fixed;
  24. right: -30px;
  25. top: 30%;
  26. height: 40px;
  27. z-index: 9999;
  28. display: flex;
  29. align-items: center;
  30. transition: all 0.3s ease;
  31. overflow: visible;
  32. }
  33. #__wilsonyiyi__rss-float-container:hover {
  34. right: 0;
  35. }
  36.  
  37. #__wilsonyiyi__rss-float-btn {
  38. width: 40px;
  39. height: 40px;
  40. background: #ff9800;
  41. border-top-left-radius: 20px;
  42. border-bottom-left-radius: 20px;
  43. box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
  44. cursor: pointer;
  45. display: flex;
  46. justify-content: center;
  47. align-items: center;
  48. user-select: none;
  49. position: relative;
  50. }
  51.  
  52. #__wilsonyiyi__rss-float-btn:hover {
  53. background: #ff7d00;
  54. }
  55.  
  56. #__wilsonyiyi__rss-float-btn svg {
  57. width: 24px;
  58. height: 24px;
  59. fill: white;
  60. }
  61.  
  62. #__wilsonyiyi__rss-label {
  63. height: 40px;
  64. line-height: 40px;
  65. background: #ff9800;
  66. color: white;
  67. font-family: Arial, sans-serif;
  68. font-size: 14px;
  69. padding: 0 15px;
  70. white-space: nowrap;
  71. max-width: 0;
  72. overflow: hidden;
  73. transition: max-width 0.3s ease;
  74. cursor: pointer;
  75. }
  76.  
  77. #__wilsonyiyi__rss-float-container:hover #__wilsonyiyi__rss-label {
  78. max-width: 200px;
  79. }
  80.  
  81. #__wilsonyiyi__rss-close-btn {
  82. width: 40px;
  83. height: 40px;
  84. background: #ff9800;
  85. display: flex;
  86. justify-content: center;
  87. align-items: center;
  88. cursor: pointer;
  89. max-width: 0;
  90. overflow: hidden;
  91. transition: max-width 0.3s ease;
  92. }
  93.  
  94. #__wilsonyiyi__rss-float-container:hover #__wilsonyiyi__rss-close-btn {
  95. max-width: 40px;
  96. }
  97.  
  98. #__wilsonyiyi__rss-close-btn svg {
  99. width: 16px;
  100. height: 16px;
  101. fill: white;
  102. min-width: 16px;
  103. }
  104.  
  105. #__wilsonyiyi__rss-toast {
  106. position: fixed;
  107. top: 20px;
  108. left: 50%;
  109. transform: translateX(-50%);
  110. background: rgba(0, 0, 0, 0.7);
  111. color: white;
  112. padding: 10px 20px;
  113. border-radius: 5px;
  114. z-index: 10000;
  115. font-family: Arial, sans-serif;
  116. font-size: 14px;
  117. opacity: 0;
  118. transition: opacity 0.3s ease;
  119. }
  120.  
  121. #__wilsonyiyi__rss-toast.show {
  122. opacity: 1;
  123. }
  124. `);
  125.  
  126. const findRssLinksByLinkTag = () => {
  127. const links = document.querySelectorAll('link[type="application/rss+xml"], link[type="application/atom+xml"]');
  128. return Array.from(links).map(link => link.href);
  129. };
  130.  
  131. const findRssLinksByATag = () => {
  132. const links = Array.from(document.querySelectorAll('a')).filter(x => x.href.endsWith('.xml'))
  133. return Array.from(links).map(link => link.href);
  134. }
  135.  
  136. const getRssLinks = () => {
  137. const r1 = findRssLinksByLinkTag()
  138. if (r1.length) return r1
  139.  
  140. const r2 = findRssLinksByATag()
  141. if (r2.length) return r2
  142.  
  143. return []
  144. }
  145.  
  146. const createFloatButton = (rssLink) => {
  147. const container = document.createElement('div');
  148. container.id = '__wilsonyiyi__rss-float-container';
  149.  
  150. const button = document.createElement('div');
  151. button.id = '__wilsonyiyi__rss-float-btn';
  152. button.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6.18,15.64A2.18,2.18 0 0,1 8.36,17.82C8.36,19 7.38,20 6.18,20C5,20 4,19 4,17.82A2.18,2.18 0 0,1 6.18,15.64M4,4.44A15.56,15.56 0 0,1 19.56,20H16.73A12.73,12.73 0 0,0 4,7.27V4.44M4,10.1A9.9,9.9 0 0,1 13.9,20H11.07A7.07,7.07 0 0,0 4,12.93V10.1Z"/></svg>';
  153.  
  154. const label = document.createElement('div');
  155. label.id = '__wilsonyiyi__rss-label';
  156. label.textContent = 'Copy RSS Feed';
  157.  
  158. const closeBtn = document.createElement('div');
  159. closeBtn.id = '__wilsonyiyi__rss-close-btn';
  160. closeBtn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"/></svg>';
  161.  
  162. container.appendChild(button);
  163. container.appendChild(label);
  164. container.appendChild(closeBtn);
  165.  
  166. document.body.appendChild(container);
  167.  
  168. const copyRssLink = () => {
  169. GM_setClipboard(rssLink);
  170. showToast('🎉 Copied 🎉');
  171. };
  172.  
  173. button.addEventListener('click', copyRssLink);
  174. label.addEventListener('click', copyRssLink);
  175.  
  176. closeBtn.addEventListener('click', (e) => {
  177. e.stopPropagation();
  178. container.style.display = 'none';
  179. });
  180.  
  181. return container;
  182. };
  183.  
  184. const createToast = () => {
  185. const toast = document.createElement('div');
  186. toast.id = '__wilsonyiyi__rss-toast';
  187. document.body.appendChild(toast);
  188. return toast;
  189. };
  190.  
  191. const showToast = (message) => {
  192. const toast = document.getElementById('__wilsonyiyi__rss-toast') || createToast();
  193. toast.textContent = message;
  194. toast.classList.add('show');
  195.  
  196. setTimeout(() => {
  197. toast.classList.remove('show');
  198. }, 2000);
  199. };
  200.  
  201. const init = () => {
  202. const rssLinks = getRssLinks();
  203.  
  204. if (rssLinks.length > 0) {
  205. createFloatButton(rssLinks[0]);
  206. createToast();
  207. }
  208. };
  209.  
  210. window.addEventListener('load', init);
  211. })();