Отправляем поток из РСС в телеграм через Google Apps Script

Обновляем канал «Почитаем…»
Теперь новые статьи будут приходить в канал автономно, через гугл таблицы и без участия локального сервера с питоном.
Раньше работало через питон и базу данных на sqlite3

В гугл таблице нам нужны три листа: rss, rss_data, error

  • rss — будем хранить рсс потоки сайтов,
  • rss_data — будем хранить базу данных что отпарсилось и что отправлено,
  • error — будем хранить ошибки при отладке, если это потребуется
На листе rss, в первой колонке перечислены все рсс-потоки, при необходимости добавить или удалить, делаем это здесь.
На листе rss_data, первая строчка с наименованием колонок

У меня сейчас 110 источников, когда идет запись в таблицу, скрипт не успевает обработать все данные, и отваливается по тайм-ауту гугла. После нескольких запусков он все ссылки обработает и начинает укладываться в тайминг.
Возможно, в будущем, нужно скрипт делить на несколько

сообщения приходят в том же виде, что и раньше.

Парсинг потоков рсс через гугл таблицы

// Считываем базу данных РСС
function data_base_rss() {
  var app = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("rss_data")
  data_base= app.getRange(1,1, app.getLastRow(), app.getLastColumn()).getValues(); //только заполненный диапазон
  return(data_base)
}

// поиск по базе данных
function find_rss(url) {
  rezult = rss_data.findIndex(item => item[3] === url) //ищем в 4 столбце
  //console.log(rezult) //-1 если не найдено, и индекс положительный если нашлось это что нашлось лог
  return(rezult)
}


// Запись нового поста в таблицу
function data_write_rss(data) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("rss_data");
  var value = data
  sheet.getRange(sheet.getLastRow() + 1,1,1,4).setValues([value]);
  console.log(data)
}

// Запись error в таблицу
function error_log(data) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("error");
  //var sheet = spreadsheet.getActiveSheet();
  //var value = new Date(); // value you want to insert
  //var value = data
  sheet.getRange(sheet.getLastRow() + 1,1,1,3).setValues([data]);
  console.log(data)
}


//функция проверки новых постов текущего потока
function get_rss(rss_url) {
  var url =rss_url
  var date_rss =[]
  var xml = UrlFetchApp.fetch(url).getContentText()
  document = XmlService.parse(xml);
  root = document.getRootElement();
  channel = root.getChild('channel');
  items = channel.getChildren('item');
  items.forEach(item => {
    parsing_date=new Date(); // дата текущая
    title = item.getChild('title').getText();
    link = item.getChild('link').getText()
    try{
    author = item.getChild('author').getText();} //автор не у всех бывает
    catch(e){author =""}
    if (find_rss(link) == -1) {
      data_write_rss([parsing_date,title,author,link])  
    }
   });
  console.log(date_rss)
}

// Основная функция парсинга всех РСС потоков, ее нужно установить в запуск раз в 15 минут
function parse_rss() {
  var rss_data=data_base_rss()
  var app = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("rss")
  url_array = app.getRange(1,1, app.getLastRow(), 1).getValues(); //только заполненный первый столбец
  console.log(url_array);
  url_array.forEach(url => {
    console.log(url)
    try{ 
      get_rss(url)}
    catch(e){console.log("! недействительный URL", console.log(url),'Ошибка ' + e.name + ":" + e.message + "\n" + e.stack)
    //error_log([new Date(),url,'Ошибка ' + e.name + ":" + e.message + "\n" + e.stack]) //При необходимости записи ошибок снять комментарий     
    } //Обработка ошибки 
  })
}

Код отправки сообщений в телеграм:

const tokendr = "BOT_token"; 
const IDChattelegramdr = "ID_CHAT" 

function timerSENDtgDR() {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let ws = ss.getSheetByName("rss_data"); //таблица с которой берем данные
  let data = ws.getRange(2, 1, ws.getLastRow()-1, 5).getValues(); //диапазон с которого берем данные
  Logger.log ( data ); 
  for (i = 0; i < data.length; i++) {
    let dataInfo = data[i]; //строчка таблицы
    //Logger.log ( dataInfo );
    let telegram_send = dataInfo[4]; //пятая ячейка telegram_send
    Logger.log(telegram_send)
    if (telegram_send ===""){
      title = dataInfo[1];
      author = dataInfo[2];
      if (author !=''){
      author=author+"\n\n"    //если имя автора есть, добавить переносы строк
      }
      link = dataInfo[3];
      sendTextDR(IDChattelegramdr, "<b>"+title+"</b>\n\n" + author + link);
      ws.getRange(i+2 , 5, 1, 1).setValues([[new Date()]]);
      Utilities.sleep(500);// pause in the loop for 500 milliseconds
      Logger.log ("сообщение отправлено");
    }
  }
}
 
function sendTextDR(chatId, text, keyBoard) {
  let data = {
    method: 'post',
    payload: {
      method: 'sendMessage',
      chat_id: String(chatId),
      text: text,
      //parse_mode:'Markdown',
      parse_mode: 'html',
      reply_markup: JSON.stringify(keyBoard)
    }
  }
  UrlFetchApp.fetch('https://api.telegram.org/bot' + tokendr + '/', data);
}
Отправить
Поделиться
Твитнуть
Запинить

Считаю метрики, делаю сквозную аналитику и когортный анализ, составляю интерактивные дешборды, моделирую юнит-экономику


Обратиться с задачей