diff --git a/rss-to-telegram-bot.php b/rss-to-telegram-bot.php new file mode 100644 index 0000000..055e2ea --- /dev/null +++ b/rss-to-telegram-bot.php @@ -0,0 +1,218 @@ + $dates) { + foreach ($dates as $date => $links) { + if ($date !== $todayDate) { + unset($previousState[$url][$date]); + } + } + } + + // Save updated state + file_put_contents($stateFile, json_encode($previousState)); +} + +// Send news to Telegram channel +if (!empty($formattedMessages)) { + writeToLog("Sending " . count($formattedMessages) . " messages to Telegram"); + sendToTelegram($formattedMessages); +} else { + writeToLog("No new messages to send"); +} + +writeToLog("Script completed"); + +/** + * Write message to log file with timestamp + */ +function writeToLog($txt) +{ + global $logFile; + $timestamp = date('[Y-m-d H:i:s]'); + $logMessage = $timestamp . ' ' . $txt . "\n"; + error_log($logMessage, 3, $logFile); +} + +/** + * Read and filter today's news from RSS feed + */ +function readAndFilterRSS($url, $instantView, $targetDate, $sentLinks) +{ + global $formattedMessages; + + try { + // Load RSS feed using SimpleXML + $feed = simplexml_load_file($url); + if ($feed === false) { + writeToLog('Error: Failed to load RSS feed - ' . $url); + throw new Exception('Failed to load RSS feed: ' . $url); + } + + $channelTitle = (string)$feed->channel->title; + $newItems = []; + + // Process each item in the feed + foreach ($feed->channel->item as $item) { + $pubDate = new DateTime($item->pubDate); + + // Check if news is from target date and hasn't been sent already + if ($pubDate->format('Y-m-d') == $targetDate && !in_array((string)$item->link, $sentLinks)) { + $newItems[] = [ + 'title' => (string)$item->title, + 'link' => (string)$item->link, + ]; + + // Prepare formatted message for Telegram + $formattedMessages[] = prepareTelegramMessage($item, $instantView, $channelTitle); + } + } + + return $newItems; + + } catch (Exception $e) { + writeToLog('Error processing RSS feed: ' . $e->getMessage()); + return []; + } +} + +/** + * Extract links from news array + */ +function getNewsLinks($news) +{ + return array_map(function ($item) { + return $item['link']; + }, $news); +} + +/** + * Send messages to Telegram channel + */ +function sendToTelegram($messages) +{ + global $channelId, $apiToken; + + foreach ($messages as $message) { + $data = [ + 'chat_id' => $channelId, + 'text' => $message[0], + 'parse_mode' => "HTML", + ]; + + $response = file_get_contents("https://api.telegram.org/bot$apiToken/sendMessage?" . http_build_query($data)); + + if ($response !== false && $response !== "") { + writeToLog('Message sent successfully: ' . $message[1]); + } else { + writeToLog('Failed to send message: ' . $message[1]); + // Wait before retry + sleep(2); + } + } + + writeToLog('Total messages sent to Telegram channel: ' . count($messages)); +} + +/** + * Prepare formatted message for Telegram + */ +function prepareTelegramMessage($item, $instantView, $channelTitle) +{ + $itemTitle = (string)$item->title; + $itemLink = (string)$item->link; + $itemDesc = (string)$item->description; + $itemDesc = strip_tags($itemDesc, ",,,,"); + $itemPubDate = (string)$item->pubDate; + $timestamp = strtotime($itemPubDate); + $pubDate = date("d/m/Y", $timestamp); + + $message = ""; + + // Add instant view if available + if ($instantView !== "") { + $instViewUrl = "https://t.me/iv?url=" . $itemLink . "&rhash=" . $instantView; + $invisibleUrl = ""; + $message .= $invisibleUrl; + } + + // Format message + $message .= "Source: " . $channelTitle . " - " . $pubDate . "" . PHP_EOL; + $message .= PHP_EOL; + $message .= "" . $itemTitle . "" . PHP_EOL; + $message .= $itemDesc . PHP_EOL; + $message .= PHP_EOL; + $message .= $itemLink; + + return [$message, $itemTitle]; +}