Отправляем поток из РСС в телеграм через 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);
}