google-app-engine - 使用 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 提要工作?
解决方案
使用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);
}
推荐阅读
- c++ - 在 C++ 中将 int 值分配给枚举,反之亦然
- java - 试图让 Eclipse 识别 jdk1.8,但我找不到该文件夹
- curl - 如何创建与 Curl 问题等效的 ColdFusion
- r - 在 R 中使用 doSNOW 和 foreach 时,您可以隐藏“类型:EXEC”和“类型:完成”输出吗?
- ruby - Chef powershell_out SystemCallError 文件名或扩展名太长。- CreateProcessAsUserW 失败
- python - 如何使用 Jupyter Notebook 读取本地 conf 文件?
- angular - 将焦点放在 Angular 上动态创建的输入上
- google-pay - google pay 的退款系统如何运作?
- c# - C# ASP.NET:“对象引用未设置为对象的实例。” System.Xml.Linq.XElement.Attribute(...) 返回 null
- java - 如何在字符串的每 3 个字符之后将给定的字符添加到字符串?