@AndAnd2

Как можно оптимизировать скрипт по парсингу RSS?

Скрипт переводит RSS ленту, но есть проблема.
Скрипт выдаёт ошибку: сильно высокое значение если есть строка: cache.put(id, rss, 3600);.
А если этой строки нет, то всё работает, лента парсится, но очень долго. минут 10 грузится, из за этого не могу прикрутить её к сайту, хостинг не рассчитан на такое долго время ожидания.
Спустя некоторое количество попыток исправления, мне в консоли вообще стало выдавать что превышена квота 1000 на translate в день.

Сам код:

function doGet() {

  var fromLang = "ru";    
  var toLang   = "en";    
  var rssFeed  = "https://theins.ru/feed.xml";  

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


function parseRSS(feed, fromLang, toLang) {
   
  var id = Utilities.base64Encode(feed + fromLang + toLang);
  
  var cache = CacheService.getPublicCache();
  var rss   = cache.get(id);
  
  if (rss != null) {
    return rss;
  }
  
  var item, title, desc; 
  
  var txt = UrlFetchApp.fetch(feed).getContentText();
  var doc = XmlService.parse(txt);

  var content = XmlService.getNamespace("http://purl.org/rss/1.0/modules/content/");
  var atom = XmlService.getNamespace("http://www.w3.org/2005/Atom");

  var root = doc.getRootElement();
  var channel = root.getChild("channel");

  channel.getChild("title").setText(channel.getChild("title").getText() + " (" + toLang + ")");
  channel.getChild("language").setText(toLang);

  var link = channel.getChild("link").getText();
  link += (link.split("?")[1] ? "&":"?") + "lang=" + toLang;
  channel.getChild("link").setText(link);

  var items = channel.getChildren("item");

  for (var i in items) {
    try {
      item  = items[i];
      
      channel.removeContent(item);

      var title = item.getChild("title").getText();
      var desc  = item.getChild("description").getText();
      var guid  = item.getChild("guid").getText();
      var cont  = item.getChild("encoded", content).getText();
          
      Utilities.sleep(1000)
      title = LanguageApp.translate(title, fromLang, toLang);
      desc  = LanguageApp.translate(desc,  fromLang, toLang, {contentType: "html"});
      guid += (guid.split("?")[1] ? "&":"?") + "lang=" + toLang;
      cont  = LanguageApp.translate(cont,  fromLang, toLang, {contentType: "html"});

      item.getChild("title").setText(title);
      item.getChild("description").setText(desc);
      item.getChild("guid").setText(guid);
      item.getChild("encoded", content).setText(cont);

      channel.addContent(item);
    } catch (e) {
      Logger.log(e);
    }
  }

  var rss = XmlService.getCompactFormat().setEncoding('UTF-8').format(doc);
  cache.put(id, rss, 3600); // Cache the feed for an hour
  return rss;
}
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 1
ProgrammerForever
@ProgrammerForever
Учитель, автоэлектрик, программист, музыкант
"Большое значение" - значит квота на размер данных, сохраняемых в кеш.
А долго работает потому что
Utilities.sleep(1000)
на каждой итерации.
Ещё вариант собирать большую строку и делать поменьше вызовов
LanguageApp.translate
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы