使用Google Script生成Youtube搜索RSS源时添加图片功能问题求助
自定义Youtube搜索RSS源添加图片修复方案
核心错误点
你原来的代码存在四个导致图片不显示的问题:
- 频道级
<image>标签嵌套错误,不符合RSS 2.0规范要求 - 取视频缩略图时遗漏
.url属性,直接传入了对象而非图片链接 - 自定义的
<thumbnail>标签绝大多数RSS阅读器无法识别 - 未声明媒体标签的命名空间,标准媒体元素无法被解析
修改后完整代码
function getSearchRSS(query){ let results = YouTube.Search.list('id, snippet', { q: query, maxResults: 50, order: 'date' }); let encoded_query = encodeURIComponent(query) let rss_url = ScriptApp.getService().getUrl() + "?" + encoded_query; // 修复频道级image标签,符合RSS 2.0规范 let channel = XmlService.createElement("channel") .addContent(XmlService.createElement("title").addContent(XmlService.createText("Youtube Search RSS Feed: " + query))) .addContent(XmlService.createElement("link").addContent(XmlService.createText("https://www.youtube.com/results?search_query=" + encoded_query))) .addContent(XmlService.createElement("description").addContent(XmlService.createText("Youtube Search RSS feed for search query '" + query + "' updated on " + (new Date())))) // 频道封面图用Youtube默认logo即可,也可替换为自定义图片链接 .addContent(XmlService.createElement("image") .addContent(XmlService.createElement("title").addContent(XmlService.createText("Youtube Search RSS Feed: " + query))) .addContent(XmlService.createElement("link").addContent(XmlService.createText("https://www.youtube.com/results?search_query=" + encoded_query))) .addContent(XmlService.createElement("url").addContent(XmlService.createText("https://www.youtube.com/img/desktop/yt_1200x1200.png"))) ) .addContent(XmlService.createElement("link", XmlService.getNamespace("atom", "http://www.w3.org/2005/Atom")).setAttribute("rel", "self").setAttribute("href", rss_url)); // 声明media命名空间,用于标准缩略图标签 const mediaNs = XmlService.getNamespace("media", "http://search.yahoo.com/mrss/"); for(let i = 0; i < results.items.length; ++i){ let video = results.items[i]; // 跳过非视频类搜索结果(频道、播放列表等)避免报错 if(video.id.kind !== "youtube#video") continue; let yt_url = "https://www.youtube.com/watch?v=" + video.id.videoId; let thumbnailUrl = video.snippet.thumbnails.medium?.url || video.snippet.thumbnails.default?.url; // 把缩略图插入description,兼容所有RSS阅读器 let descriptionContent = `<img src="${thumbnailUrl}" alt="${video.snippet.title}" /><br>${video.snippet.description}`; channel.addContent(XmlService.createElement("item") .addContent( XmlService.createElement("title").addContent(XmlService.createText(video.snippet.title)) ).addContent( XmlService.createElement("link").addContent(XmlService.createText(yt_url)) ).addContent( // 标准媒体缩略图标签,支持的阅读器会优先读取 XmlService.createElement("thumbnail", mediaNs).setAttribute("url", thumbnailUrl) ).addContent( XmlService.createElement("description").addContent(XmlService.createCdata(descriptionContent)) ).addContent( XmlService.createElement("pubDate").addContent(XmlService.createText(Utilities.formatDate(new Date(video.snippet.publishedAt), "EDT", "EEE, dd MMM yyyy HH:mm:ss Z"))) ).addContent( XmlService.createElement("guid").addContent(XmlService.createText(yt_url)) )) } // 给RSS根元素添加media命名空间 let rssRoot = XmlService.createElement("rss") .setAttribute("version", "2.0") .setAttribute("xmlns:atom", "http://www.w3.org/2005/Atom") .setAttribute("xmlns:media", "http://search.yahoo.com/mrss/") .addContent(channel); return XmlService.getPrettyFormat().format(XmlService.createDocument(rssRoot)); } function doGet(req) { let query = decodeURIComponent(req.queryString); return ContentService.createTextOutput(getSearchRSS(query)) .setMimeType(ContentService.MimeType.RSS) }
生效说明
修改代码后需要重新部署你的Google Apps Script项目,部署完成后原来的RSS访问地址无需更改,即可在阅读器中正常显示视频缩略图。
内容的提问来源于stack exchange,提问作者KiloJKilo
相关产品推荐
相关产品推荐

