Greasy Fork is available in English.
打开网页时,查询可能的 RSS 链接并验证可用性,在网页右下角列举出来。
当前为
// ==UserScript==
// @name RSS 订阅链接查找器
// @namespace http://greasyfork.icu/users/1171320
// @version 0.1
// @description 打开网页时,查询可能的 RSS 链接并验证可用性,在网页右下角列举出来。
// @author Lama AI 辅助
// @match *://*/*
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @license MIT
// ==/UserScript==
(function() {
'use strict';
const rssLinks = new Set();
const possibleRssPaths = [
'/rss',
'/feed',
'/atom.xml',
'/rss.xml',
'/feed.xml'
// 可添加其他常见的 RSS 路径
];
const xmlRegex = /<\?xml.*?<rss|<feed/; // 用于检测返回内容是否为 XML/RSS/Atom
function addStyle() {
GM_addStyle(`
#rss-finder-container {
position: fixed;
bottom: 20px;
right: 20px;
background: #fff;
border: 1px solid #ccc;
padding: 10px;
max-height: 300px;
overflow-y: auto;
z-index: 9999;
}
#rss-finder-container h4{
margin:0px;
margin-bottom:5px;
}
#rss-finder-list {
list-style: none;
padding: 0;
}
#rss-finder-list li {
margin-bottom: 5px;
}
#rss-finder-list a {
color: blue;
text-decoration: none;
}
`);
}
function findRssLinks() {
// 查找 link 标签
const linkTags = document.querySelectorAll('link[type="application/rss+xml"], link[type="application/atom+xml"]');
linkTags.forEach(link => {
if (link.href) {
addRssLink(link.href);
}
});
// 尝试猜测 RSS 路径
possibleRssPaths.forEach(path => {
const guessedUrl = window.location.origin + path;
addRssLink(guessedUrl);
});
}
function addRssLink(url) {
if(rssLinks.has(url)) return;
GM_xmlhttpRequest({
method: 'GET',
url: url,
onload: function(response) {
if (response.status === 200 && xmlRegex.test(response.responseText)) {
rssLinks.add(url);
updateRssList();
}
},
onerror: function(error){
// 预加载失败,打印错误信息
console.log(`加载失败: ${url}`, error);
}
});
}
function updateRssList() {
let container = document.getElementById('rss-finder-container');
if(!container){
container = document.createElement('div');
container.id = 'rss-finder-container';
container.innerHTML = '<h4>可用RSS订阅:</h4><ul id="rss-finder-list"></ul>';
document.body.appendChild(container);
}
const list = container.querySelector('#rss-finder-list');
list.innerHTML = '';
rssLinks.forEach(url => {
const li = document.createElement('li');
const a = document.createElement('a');
a.href = url;
a.target = '_blank';
a.rel = 'noopener noreferrer';
a.textContent = url;
li.appendChild(a);
list.appendChild(li);
});
}
addStyle();
findRssLinks();
})();