diff options
author | 2025-03-02 19:32:33 -0800 | |
---|---|---|
committer | 2025-03-02 19:32:33 -0800 | |
commit | 8b16dd20f6544af3eedf286e23c0d34ab525736c (patch) | |
tree | ec284e22a046c4c8e9626e3fa64a000a2747bf84 /bridges/TelegramBridge.php | |
parent | b183aa798af48af556496c42780d6e844172cf44 (diff) | |
parent | 00a24e2f694a319a5e6cb070dddfff2dae892378 (diff) | |
download | rss-bridge-master.tar.gz rss-bridge-master.tar.zst rss-bridge-master.zip |
Diffstat (limited to 'bridges/TelegramBridge.php')
-rw-r--r-- | bridges/TelegramBridge.php | 88 |
1 files changed, 57 insertions, 31 deletions
diff --git a/bridges/TelegramBridge.php b/bridges/TelegramBridge.php index 81c5aeb9..1f82c606 100644 --- a/bridges/TelegramBridge.php +++ b/bridges/TelegramBridge.php @@ -15,6 +15,14 @@ class TelegramBridge extends BridgeAbstract ] ] ]; + + const CONFIGURATION = [ + 'max_pages' => [ + 'required' => false, + 'defaultValue' => 1, + ], + ]; + const TEST_DETECT_PARAMETERS = [ 'https://t.me/s/rssbridge' => ['username' => 'rssbridge'], 'https://t.me/rssbridge' => ['username' => 'rssbridge'], @@ -26,7 +34,7 @@ class TelegramBridge extends BridgeAbstract 'https://rssbridge.t.me/' => ['username' => 'rssbridge'], ]; - const CACHE_TIMEOUT = 60 * 15; // 15 mins + const CACHE_TIMEOUT = 60 * 60; // 1h private $feedName = ''; private $enclosures = []; @@ -36,33 +44,56 @@ class TelegramBridge extends BridgeAbstract public function collectData() { - $html = getSimpleHTMLDOM($this->getURI()); - - $channelTitle = $html->find('div.tgme_channel_info_header_title span', 0)->plaintext ?? ''; - $channelTitle = htmlspecialchars_decode($channelTitle, ENT_QUOTES); - $this->feedName = $channelTitle . ' (@' . $this->normalizeUsername() . ')'; - $posts = $html->find('div.tgme_widget_message_wrap.js-widget_message_wrap'); - if (!$channelTitle && !$posts) { - throw new \Exception('Unable to find channel. The channel is non-existing or non-public.'); - } - foreach ($posts as $messageDiv) { - $this->itemTitle = ''; - $this->enclosures = []; - $item = []; - - $item['uri'] = $messageDiv->find('a.tgme_widget_message_date', 0)->href; - $item['content'] = $this->processContent($messageDiv); - $item['title'] = $this->itemTitle; - $item['timestamp'] = $messageDiv->find('span.tgme_widget_message_meta', 0)->find('time', 0)->datetime; - $item['enclosures'] = $this->enclosures; - - $messageOwner = $messageDiv->find('a.tgme_widget_message_owner_name', 0); - if ($messageOwner) { - $item['author'] = html_entity_decode(trim($messageOwner->plaintext), ENT_QUOTES); + $pages = 0; + $url = 'https://t.me/s/' . $this->normalizeUsername(); + + $max_pages = $this->getOption('max_pages'); + + // Hard-coded upper bound of 100 loops + while ($pages < $max_pages && $pages < 100) { + $pages++; + + $dom = getSimpleHTMLDOM($url); + + $channelTitle = $dom->find('div.tgme_channel_info_header_title span', 0)->plaintext ?? ''; + $channelTitle = htmlspecialchars_decode($channelTitle, ENT_QUOTES); + $this->feedName = $channelTitle . ' (@' . $this->normalizeUsername() . ')'; + + $messages = $dom->find('div.tgme_widget_message_wrap.js-widget_message_wrap'); + if (!$channelTitle && !$messages) { + throw new \Exception('Unable to find channel. The channel is non-existing or non-public.'); } - $this->items[] = $item; + foreach (array_reverse($messages) as $message) { + $this->itemTitle = ''; + $this->enclosures = []; + + $item = []; + + $item['uri'] = $message->find('a.tgme_widget_message_date', 0)->href; + $item['content'] = $this->processContent($message); + $item['title'] = $this->itemTitle; + $item['timestamp'] = $message->find('span.tgme_widget_message_meta', 0)->find('time', 0)->datetime; + $item['enclosures'] = $this->enclosures; + + $messageOwner = $message->find('a.tgme_widget_message_owner_name', 0); + if ($messageOwner) { + $item['author'] = html_entity_decode(trim($messageOwner->plaintext), ENT_QUOTES); + } + + array_unshift($this->items, $item); + } + + $more = $dom->find('> div.tgme_widget_message_centered.js-messages_more_wrap a', 0); + if ($more && str_contains($more->href, 'before')) { + $url = 'https://t.me/' . $more->href; + } else { + break; + } } + + $this->logger->info(sprintf('Fetched %s messages from %s pages (%s)', count($this->items), $pages, $url)); + $this->items = array_reverse($this->items); } @@ -369,12 +400,7 @@ EOD; private function normalizeUsername() { - // todo: can be replaced with ltrim($username, '@'); - $username = $this->getInput('username'); - if (substr($username, 0, 1) === '@') { - return substr($username, 1); - } - return $username; + return ltrim($this->getInput('username'), '@'); } public function detectParameters($url) |