@Stefan93

Как исправить автопостинг из rss в телеграм?

Есть скрипт автопостинга из RSS в телеграм https://github.com/Barrnet/php_rss_telegram_bot

Задача в том, чтобы запускать его по крону каждый час.

Он работает, но не совсем так как надо. Идёт публикация дублей и срабатывает он в разное время, хотя крон настроен на каждый час и 0 минуту.

<?php 
/* 
**********************************
* Bot Telegram - Invio Messaggi **
**********************************
*/
require_once('bot_config.php');
/* Variabili statiche. Attenzione: Modificare solo le variabili in bot_config.php */
$max_age_articoli = time() - 1200;
/* Definisco a FALSE la data di ultimo avvio. Al primo avvio, considera il parametro max_age_articoli */
$last_send = false;
$last_send_title = "";
$dir = dirname(__FILE__);

/* Salvo nei log che il bot è stato avviato */
$time = date("m-d-y H:i", time());
$log_text = "[$time] Bot avviato. URL Feed: $rss".PHP_EOL;
file_put_contents($dir."/".$log_file, $log_text, FILE_APPEND | LOCK_EX);
echo $log_text;
/* Salvo il PID attuale in un file, cosi che il watchdogs possa controllarlo */
$pid = getmypid();
file_put_contents($dir."/".$pid_file, $pid);

/* Funzione invio messaggi alla chat telegram */
function telegram_send_chat_message($token, $chat, $messaggio) {
	/* prelievo timestamp attuale per eventuale log dell'errore */
	$time = time();
	/* Inizializzo variabile URL */
	$url = "https://api.telegram.org/bot$token/sendMessage?chat_id=$chat";
	/* Imposto variabile URL con il messaggio da inviare */
	$send_text=urlencode($messaggio);
	$url = $url ."&text=$send_text";
	//inizio sessione curl 
	$ch = curl_init();
	$optArray = array(
		CURLOPT_URL => $url,
		CURLOPT_RETURNTRANSFER => true
	);
	curl_setopt_array($ch, $optArray);
	$result = curl_exec($ch);
	/* In caso di errore, lo salvo nei log */
	if ($result == FALSE) {
		$time = date("m-d-y H:i", time());
		$log_text = "[$time] Invio messaggio fallito: $messaggio".PHP_EOL;
		file_put_contents($dir."/".$log_file, $log_text, FILE_APPEND | LOCK_EX);
	}
	curl_close($ch);
}

/* Inizio del ciclo del bot */
while (true) {
	/* Se $last_send non è stata parametizzata, significa che il bot è appena partito. La imposto quindi uguale a $max_age_articoli, che è il tempo attuale - 20 minuti. Pubblicherà quindi retroattivamente tutte le notizie più vecchie di 20 minuti*/
	if ($last_send == false) $last_send = $max_age_articoli;
	$ora_attuale = time();
	$articoli = @simplexml_load_file($rss);
	/* Se non è riuscito a scaricare il feed, pubblico un messaggio di errore nel log */
	if ($articoli === false) { 
		$time = date("m-d-y H:i", $ora_attuale);
		$log_text = "[$time] Il bot non è riuscito a contattare il Feed RSS. Connessione fallita a $rss.".PHP_EOL;
		file_put_contents($dir."/".$log_file, $log_text, FILE_APPEND | LOCK_EX);
	/* Vado avanti solo se $articoli non è in false, ciò vuol dire che simplexml è riuscito a caricare il feed e posso procedere a processare le notizie */	
	}else{
		/* Inverto l'ordine delle notizie, da decrescente a crescente */
		$xmlArray = array();
		foreach ($articoli->channel->item as $item) $xmlArray[] = $item;
		$xmlArray = array_reverse($xmlArray);
		
		/* Inizio ciclo invio notizie */
		foreach ($xmlArray as $item) {
			/* Estraggo il timestamp dell'articolo */
			$timestamp_articolo = strtotime($item->pubDate);
			/* Calcolo la differenza tra il timestamp attuale e quello dell'articolo */
			$diff_timestamp = time() - $timestamp_articolo;
			/* Controllo se la notizia è più recente dell'ultima pubblicata */
			/* Anche se dovrebbe *non farlo* ma lo fa per ignoti motivi, ho aggiunto un controllo che dovrebbe evitare di far pubblicare due volte la stessa notizia */
			/* Non pubblico gli articoli con meno di 5 minuti (300 secondi) di anzianità */
			if ($timestamp_articolo > $last_send AND $diff_timestamp > $ritardo AND $last_send_title != $item->title) {
				$messaggio = ucfirst($item->category) . " - " . $item->title . PHP_EOL;
				$messaggio .= $item->link . PHP_EOL;
				telegram_send_chat_message($token, $chat, $messaggio);
				$last_send = $timestamp_articolo;
				$last_send_title = $item->title;
			}
		}
	}
	sleep($attesa);
}
?>
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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