如何使用 Google App 脚本从 Youtube 搜索创建 RSS 提要?
How can I make an RSS feed from Youtube search using Google App Script?
自从 Youtube 关闭了使用其最新版本 API 进行搜索的 RSS 提要后,我一直在尝试使用 Google App Script 重新创建它们。到目前为止,这是我所拥有的(基于 this tutorial 将 Twitter 小部件转换为 RSS):
function getSearches(a){
try{
var rss,title,link;
title="Youtube RSS Feed";
link="http://www.youtube.com";
var d=ScriptApp.getService().getUrl()+"?"+a;
rss='<?xml version="1.0"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">';
rss+='<channel><title>'+title+'</title>';
rss+='<link>'+link+'</link>';
rss+='<atom:link href="'+d+'" rel="self" type="application/rss+xml" />';
rss+='<description>Youtube RSS feed updated on '+new Date()+'.</description>';
var results = YouTube.Search.list('id, snippet', {
q: a,
maxResults: 50,
order: 'date'
});
for(var i = 0; i < results.items.length; i++){
var item = results.items[i];
rss += "<item>";
rss += "<title>" + item.snippet.title + "</title>";
rss += "<link>http://www.youtube.com/watch?v=" + item.id.videoId + "</link>";
rss += "<description>" + item.snippet.description + "</description>";
rss += "<pubDate>" + Utilities.formatDate(new Date(item.snippet.publishedAt), "EDT", "EEE, dd MMM yyyy HH:mm:ss Z") + "</pubDate>";
rss += "<guid>http://www.youtube.com/watch?v=" + item.id.videoId + "</guid>";
rss += "</item>";
}
rss+="</channel></rss>";
Logger.log(rss)
return rss
}
catch(e){
return"Something went wrong. Please retry after few minutes"
}
}
function doGet(e){
//var a = e.queryString();
var a = getSearches("search term");
return ContentService.createTextOutput(a).setMimeType(ContentService.MimeType.RSS);
}
当我将其发布为 Web 应用程序并对其进行测试时,生成的页面看起来不错。我可以单击 link,它们会将我带到正确的视频。但是,当我尝试订阅提要时(在我的例子中使用 Inoreader),它说没有找到提要。如果我直接在我的 reader 中订阅 Web 应用程序 url(同样,Inoreader),它似乎可以工作;但所有条目 link 到网络应用程序,而不是 youtube,并且 return 单击时来自 Google 应用程序脚本的错误。
理想情况下,我希望网络应用程序能够接受任何搜索词和 return 通过 https://script.google.com/macros/s/LONG_KEY/exec?SEARCH_TERM 订阅的供稿,类似于上面的推特 RSS linked职能。有没有人成功过这样的事情或者可以给我指点?
所以看来我的问题是发布的网络应用程序的版本。我不知道不增加版本会缓存应用程序,就像它在该修订版下首次发布时一样。我注意到在测试应用程序时出现了代码更改;但是在查看已发布的 url 输出时,它们并不存在。
文件 > 管理版本允许我增加版本号,然后更改开始显示,我能够订阅提要。
如何使用 Google 应用程序脚本从 Youtube 搜索创建 RSS 提要:
在 GitHub
获取我的脚本的最新版本
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;
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()))))
.addContent(XmlService.createElement("link", XmlService.getNamespace("atom", "http://www.w3.org/2005/Atom")).setAttribute("rel", "self").setAttribute("href", rss_url));
for(let i = 0; i < results.items.length; ++i){
let video = results.items[i];
let yt_url = "https://www.youtube.com/watch?v=" + video.id.videoId;
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("description").addContent(XmlService.createText(video.snippet.description))
).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))
))
}
return XmlService.getPrettyFormat().format(XmlService.createDocument(
XmlService.createElement("rss").setAttribute("version", "2.0").addContent(channel)
));
}
function doGet(req) {
let query = decodeURIComponent(req.queryString);
return ContentService.createTextOutput(getSearchRSS(query))
.setMimeType(ContentService.MimeType.RSS)
}
如何使用这个脚本:
要部署:
- 在 https://script.google.com/
上创建脚本
- 将代码粘贴到新脚本
- 资源 -> 高级 Google 服务 -> 启用 YouTube 数据 API
- 发布 -> 作为网络应用程序
- 抓取生成的 URL,在 URL 的末尾添加搜索查询,并在其前面加上“?”马克.
- 完成。
每次代码更改都需要您在部署中添加新的项目版本window:
例如:
URL 来自部署选项卡:https://script.google.com/macros/s/BLABLABLA/exec
我希望生成的搜索查询:#hot16challenge2
URL-此查询的编码版本:%23hot16challenge2
最终 URL 根据此查询使用 RSS 进行响应:
https://script.google.com/macros/s/BLABLABLA/exec?%23hot16challenge2
自从 Youtube 关闭了使用其最新版本 API 进行搜索的 RSS 提要后,我一直在尝试使用 Google App Script 重新创建它们。到目前为止,这是我所拥有的(基于 this tutorial 将 Twitter 小部件转换为 RSS):
function getSearches(a){
try{
var rss,title,link;
title="Youtube RSS Feed";
link="http://www.youtube.com";
var d=ScriptApp.getService().getUrl()+"?"+a;
rss='<?xml version="1.0"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">';
rss+='<channel><title>'+title+'</title>';
rss+='<link>'+link+'</link>';
rss+='<atom:link href="'+d+'" rel="self" type="application/rss+xml" />';
rss+='<description>Youtube RSS feed updated on '+new Date()+'.</description>';
var results = YouTube.Search.list('id, snippet', {
q: a,
maxResults: 50,
order: 'date'
});
for(var i = 0; i < results.items.length; i++){
var item = results.items[i];
rss += "<item>";
rss += "<title>" + item.snippet.title + "</title>";
rss += "<link>http://www.youtube.com/watch?v=" + item.id.videoId + "</link>";
rss += "<description>" + item.snippet.description + "</description>";
rss += "<pubDate>" + Utilities.formatDate(new Date(item.snippet.publishedAt), "EDT", "EEE, dd MMM yyyy HH:mm:ss Z") + "</pubDate>";
rss += "<guid>http://www.youtube.com/watch?v=" + item.id.videoId + "</guid>";
rss += "</item>";
}
rss+="</channel></rss>";
Logger.log(rss)
return rss
}
catch(e){
return"Something went wrong. Please retry after few minutes"
}
}
function doGet(e){
//var a = e.queryString();
var a = getSearches("search term");
return ContentService.createTextOutput(a).setMimeType(ContentService.MimeType.RSS);
}
当我将其发布为 Web 应用程序并对其进行测试时,生成的页面看起来不错。我可以单击 link,它们会将我带到正确的视频。但是,当我尝试订阅提要时(在我的例子中使用 Inoreader),它说没有找到提要。如果我直接在我的 reader 中订阅 Web 应用程序 url(同样,Inoreader),它似乎可以工作;但所有条目 link 到网络应用程序,而不是 youtube,并且 return 单击时来自 Google 应用程序脚本的错误。
理想情况下,我希望网络应用程序能够接受任何搜索词和 return 通过 https://script.google.com/macros/s/LONG_KEY/exec?SEARCH_TERM 订阅的供稿,类似于上面的推特 RSS linked职能。有没有人成功过这样的事情或者可以给我指点?
所以看来我的问题是发布的网络应用程序的版本。我不知道不增加版本会缓存应用程序,就像它在该修订版下首次发布时一样。我注意到在测试应用程序时出现了代码更改;但是在查看已发布的 url 输出时,它们并不存在。
文件 > 管理版本允许我增加版本号,然后更改开始显示,我能够订阅提要。
如何使用 Google 应用程序脚本从 Youtube 搜索创建 RSS 提要:
在 GitHub
获取我的脚本的最新版本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;
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()))))
.addContent(XmlService.createElement("link", XmlService.getNamespace("atom", "http://www.w3.org/2005/Atom")).setAttribute("rel", "self").setAttribute("href", rss_url));
for(let i = 0; i < results.items.length; ++i){
let video = results.items[i];
let yt_url = "https://www.youtube.com/watch?v=" + video.id.videoId;
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("description").addContent(XmlService.createText(video.snippet.description))
).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))
))
}
return XmlService.getPrettyFormat().format(XmlService.createDocument(
XmlService.createElement("rss").setAttribute("version", "2.0").addContent(channel)
));
}
function doGet(req) {
let query = decodeURIComponent(req.queryString);
return ContentService.createTextOutput(getSearchRSS(query))
.setMimeType(ContentService.MimeType.RSS)
}
如何使用这个脚本:
要部署:
- 在 https://script.google.com/ 上创建脚本
- 将代码粘贴到新脚本
- 资源 -> 高级 Google 服务 -> 启用 YouTube 数据 API
- 发布 -> 作为网络应用程序
- 抓取生成的 URL,在 URL 的末尾添加搜索查询,并在其前面加上“?”马克.
- 完成。
每次代码更改都需要您在部署中添加新的项目版本window:
例如:
URL 来自部署选项卡:https://script.google.com/macros/s/BLABLABLA/exec
我希望生成的搜索查询:#hot16challenge2
URL-此查询的编码版本:%23hot16challenge2
最终 URL 根据此查询使用 RSS 进行响应:
https://script.google.com/macros/s/BLABLABLA/exec?%23hot16challenge2