首页 > 解决方案 > 使用 Google 脚本解析 RSS 翻译

问题描述

我正在尝试在谷歌脚本中使用以下脚本来获取 RSS 翻译服务。

code.gs 如下:

    function doGet() {

  var fromLang = "en";    
  var toLang   = "es";    
  var rssFeed  = "https://XXXXXX.com/XXXX/feed/";  

  var feed = parseRSS(rssFeed, fromLang, toLang);      
  return ContentService.createTextOutput(feed)
           .setMimeType(ContentService.MimeType.RSS);    
}


function parseRSS(feed, fromLang, toLang) {

  var id = Utilities.base64Encode(feed + fromLang + toLang);

  // Cache the RSS feeds for an hour
  var cache = CacheService.getPublicCache();
  var rss   = cache.get(id);

  if (rss != null) {
    return rss;
  }

  var item, date, title, link, desc, guid; 

  var txt = UrlFetchApp.fetch(feed).getContentText();
  var doc = Xml.parse(txt, false);  

  title = doc.getElement().getElement("channel").getElement("title").getText();

  // The RSS Feed is translated using Google Translate
  rss = '<rss version="2.0">';
  rss += "<channel><title>";
  rss += LanguageApp.translate(title, fromLang, toLang);
  rss += " (" + title + ")</title>";

  var items = doc.getElement().getElement("channel").getElements("item");   

  // Parsing single items in the RSS Feed
  for (var i in items) {

    try {

      item  = items[i];

      title = item.getElement("title").getText();
      link  = item.getElement("link").getText();
      date  = item.getElement("pubDate").getText();
      desc  = item.getElement("description").getText();

      guid  = Utilities.base64Encode(link + fromLang + toLang);

      title = LanguageApp.translate(title, fromLang, toLang);
      desc  = LanguageApp.translate(desc,  fromLang, toLang, 
                                       {contentType: "html"});

      rss += "<item>";
      rss += "  <title>"   + title + "</title>";
      rss += "  <link>"    + link  + "</link>";
      rss += "  <pubDate>" + date  + "</pubDate>";
      rss += "  <guid>"    + guid  + "</guid>";
      rss += "  <description><![CDATA[" + desc + "]]></description>";
      rss += "</item>";

    } catch (e) {
      Logger.log(e);
    }
  }

  rss += "</channel></rss>";

  cache.put(id, rss, 3600);
  return rss;

}

该脚本有效,并为我提供了“ https://script.googleusercontent.com ”的链接。一些站点不正确地将此识别为 RSS 提要。我怎样才能让它作为 XML 或 HTML 和 W3 有效的 RSS 提要工作?

标签: google-app-enginegoogle-apps-scriptscriptingrss

解决方案


使用Apps Script 提供的内容服务时。请记住文档中提到的重定向条件:

出于安全原因,内容服务返回的内容不是从 script.google.com 提供的,而是重定向到 script.googleusercontent.com 上的一次性 URL。这意味着如果您使用内容服务将数据返回到另一个应用程序,您必须确保将 HTTP 客户端配置为遵循重定向。例如,在 cURL 命令行实用程序中,添加标志 -L。有关如何启用此行为的更多信息,请查看您的 HTTP 客户端的文档。

因此,在 此处测试时会抛出该错误,因为您试图从不遵循重定向的外部源获取信息。

在您的rssFeed变量中,您可以使用 docs: 中提供的 URL 对其进行测试http://xkcd.com/rss.xml

要尝试不同的 MYME 类型,请更改这行代码:

return ContentService.createTextOutput(feed)
           .setMimeType(ContentService.MimeType.RSS);   

return ContentService.createTextOutput(feed)
           .setMimeType(ContentService.MimeType.XML);   

编辑

如果您想在驱动器中保存文件,您的doGet()功能现在应该如下所示

function doGet() {

  var fromLang = "en";    
  var toLang   = "es";    
  var rssFeed  = "http://xkcd.com/rss.xml";  

  var feed = parseRSS(rssFeed, fromLang, toLang);   
  DriveApp.createFile("rssTest", feed, MimeType.HTML);
  return ContentService.createTextOutput(feed)
           .setMimeType(ContentService.MimeType.XML);    
}

推荐阅读