如何使用Google App Script从Youtube搜索中制作RSS feed?

问题描述 投票:3回答:2

自从Youtube关闭了最新版本的API的搜索RSS feeds后,我一直在尝试用Google App Script重新创建RSS feeds。以下是我目前的成果(基于 本教程 用于将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);
}

当我把它发布成一个网络应用并进行测试时,结果页面看起来不错。我可以点击链接,它们会带我到正确的视频。然而,当我尝试订阅feed时(在我的例子中使用Inoreader),它说没有找到feed。如果我直接在我的阅读器中订阅网络应用的网址(同样是Inoreader),它似乎可以工作;但所有的条目都链接到网络应用,而不是youtube,并且在点击时从Google App Script返回一个错误。

理想的情况是,我希望网络应用能够接受任何搜索词,并返回订阅的feeds,通过 https:/script.google.commacrossLONG_KEYexec?SEARCH_TERM。 类似于上面链接的微博RSS功能。有谁在这样的事情上取得过成功,或者能给我一些建议?

google-apps-script rss youtube-api youtube-data-api
2个回答
0
投票

因此,看来我的问题是发布的网络应用的版本。我不知道不递增版本会缓存应用程序,因为它是在该修订版下首次发布时。我注意到,当我在测试应用程序时,代码更改会显示出来;但当查看发布的url输出时,它们并不存在。

文件> 管理版本允许我递增版本号,然后更改开始显示,我能够订阅feed。


0
投票

我如何使用Google App Script从Youtube搜索中制作RSS feed。

获取我的脚本的最新版本 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)
}

如何使用这个脚本。

部署:

  1. 创建脚本在 https:/script.google.com。
  2. 将代码粘贴到新的脚本中
  3. 资源 -> 高级谷歌服务 -> 启用YouTube数据API。
  4. 发布 -> 作为一个网络应用
  5. 抓取生成的URL,在URL尾部添加搜索查询,前面加"?"标记。
  6. 这样就完成了。

每修改一次代码,都需要你在部署窗口中添加新的项目版本。

例如:

从部署选项卡中输入URL https://script.google.com/macros/s/BLABLABLA/exec

我想让这个生成的搜索查询。#hot16challenge2

这个查询的URL编码版本。%23hot16challenge2

根据这个查询用RSS响应的最终URL。

https://script.google.com/macros/s/BLABLABLA/exec?%23hot16challenge2

© www.soinside.com 2019 - 2024. All rights reserved.