[
'name' => 'Username',
'type' => 'text',
'required' => true,
'exampleValue' => '@rssbridge',
]
]
];
const TEST_DETECT_PARAMETERS = [
'https://t.me/s/rssbridge' => ['username' => 'rssbridge'],
'https://t.me/rssbridge' => ['username' => 'rssbridge'],
'http://t.me/rssbridge' => ['username' => 'rssbridge'],
'https://telegram.me/s/rssbridge' => ['username' => 'rssbridge'],
'https://telegram.me/rssbridge' => ['username' => 'rssbridge'],
'http://telegram.me/rssbridge' => ['username' => 'rssbridge'],
];
const CACHE_TIMEOUT = 900; // 15 mins
private $feedName = '';
private $enclosures = [];
private $itemTitle = '';
private $backgroundImageRegex = "/background-image:url\('(.*)'\)/";
private $detectParamsRegex = '/^https?:\/\/(?:t|telegram)\.me\/(?:s\/)?([\w]+)$/';
public function detectParameters($url)
{
$params = [];
if (preg_match($this->detectParamsRegex, $url, $matches) > 0) {
$params['username'] = $matches[1];
return $params;
}
return null;
}
public function collectData()
{
$html = getSimpleHTMLDOM($this->getURI());
$channelTitle = htmlspecialchars_decode(
$html->find('div.tgme_channel_info_header_title span', 0)->plaintext,
ENT_QUOTES
);
$this->feedName = $channelTitle . ' (@' . $this->processUsername() . ')';
foreach ($html->find('div.tgme_widget_message_wrap.js-widget_message_wrap') as $index => $messageDiv) {
$this->itemTitle = '';
$this->enclosures = [];
$item = [];
$item['uri'] = $this->processUri($messageDiv);
$item['content'] = $this->processContent($messageDiv);
$item['title'] = $this->itemTitle;
$item['timestamp'] = $this->processDate($messageDiv);
$item['enclosures'] = $this->enclosures;
$author = trim($messageDiv->find('a.tgme_widget_message_owner_name', 0)->plaintext);
$item['author'] = html_entity_decode($author, ENT_QUOTES);
$this->items[] = $item;
}
$this->items = array_reverse($this->items);
}
public function getURI()
{
if (!is_null($this->getInput('username'))) {
return self::URI . '/s/' . $this->processUsername();
}
return parent::getURI();
}
public function getName()
{
if (!empty($this->feedName)) {
return $this->feedName . ' - Telegram';
}
return parent::getName();
}
private function processUsername()
{
if (substr($this->getInput('username'), 0, 1) === '@') {
return substr($this->getInput('username'), 1);
}
return $this->getInput('username');
}
private function processUri($messageDiv)
{
return $messageDiv->find('a.tgme_widget_message_date', 0)->href;
}
private function processDate($messageDiv)
{
$messageMeta = $messageDiv->find('span.tgme_widget_message_meta', 0);
return $messageMeta->find('time', 0)->datetime;
}
private function processContent($messageDiv)
{
$message = '';
if ($messageDiv->find('div.tgme_widget_message_forwarded_from', 0)) {
$message = $messageDiv->find('div.tgme_widget_message_forwarded_from', 0)->innertext . '
';
}
if ($messageDiv->find('a.tgme_widget_message_reply', 0)) {
$message .= $this->processReply($messageDiv);
}
if ($messageDiv->find('div.tgme_widget_message_sticker_wrap', 0)) {
$message .= $this->processSticker($messageDiv);
}
if ($messageDiv->find('div.tgme_widget_message_poll', 0)) {
$message .= $this->processPoll($messageDiv);
}
if ($messageDiv->find('video', 0)) {
$message .= $this->processVideo($messageDiv);
}
if ($messageDiv->find('a.tgme_widget_message_photo_wrap', 0)) {
$message .= $this->processPhoto($messageDiv);
}
if ($messageDiv->find('a.not_supported', 0)) {
$message .= $this->processNotSupported($messageDiv);
}
if ($messageDiv->find('div.tgme_widget_message_text.js-message_text', 0)) {
$message .= $messageDiv->find('div.tgme_widget_message_text.js-message_text', 0);
$this->itemTitle = $this->ellipsisTitle(
$messageDiv->find('div.tgme_widget_message_text.js-message_text', 0)->plaintext
);
}
if ($messageDiv->find('div.tgme_widget_message_document', 0)) {
$message .= $this->processAttachment($messageDiv);
}
if ($messageDiv->find('a.tgme_widget_message_link_preview', 0)) {
$message .= $this->processLinkPreview($messageDiv);
}
if ($messageDiv->find('a.tgme_widget_message_location_wrap', 0)) {
$message .= $this->processLocation($messageDiv);
}
return $message;
}
private function processReply($messageDiv)
{
$reply = $messageDiv->find('a.tgme_widget_message_reply', 0);
$author = $reply->find('span.tgme_widget_message_author_name', 0)->plaintext;
$text = '';
if ($reply->find('div.tgme_widget_message_metatext', 0)) {
$text = $reply->find('div.tgme_widget_message_metatext', 0)->innertext;
}
if ($reply->find('div.tgme_widget_message_text', 0)) {
$text = $reply->find('div.tgme_widget_message_text', 0)->innertext;
}
return <<{$author}
{$text}
{$reply->href}
EOD;
}
private function processSticker($messageDiv)
{
if (empty($this->itemTitle)) {
$this->itemTitle = '@' . $this->processUsername() . ' posted a sticker';
}
$stickerDiv = $messageDiv->find('div.tgme_widget_message_sticker_wrap', 0);
if ($stickerDiv->find('picture', 0)) {
$stickerDiv->find('picture', 0)->find('div', 0)->style = '';
$stickerDiv->find('picture', 0)->style = '';
return $stickerDiv;
} elseif (preg_match($this->backgroundImageRegex, $stickerDiv->find('i', 0)->style, $sticker)) {
return <<
EOD;
}
}
private function processPoll($messageDiv)
{
$poll = $messageDiv->find('div.tgme_widget_message_poll', 0);
$title = $poll->find('div.tgme_widget_message_poll_question', 0)->plaintext;
$type = $poll->find('div.tgme_widget_message_poll_type', 0)->plaintext;
if (empty($this->itemTitle)) {
$this->itemTitle = $title;
}
$pollOptions = '';
foreach ($poll->find('div.tgme_widget_message_poll_option') as $option) {
$pollOptions .= '- ' . $option->children(0)->plaintext . ' - ' .
$option->find('div.tgme_widget_message_poll_option_text', 0)->plaintext . '
';
}
$pollOptions .= '
';
return <<$type
{$pollOptions}
EOD;
}
private function processLinkPreview($messageDiv)
{
$image = '';
$title = '';
$site = '';
$description = '';
$preview = $messageDiv->find('a.tgme_widget_message_link_preview', 0);
if (trim($preview->innertext) === '') {
return '';
}
if (
$preview->find('i', 0) &&
preg_match($this->backgroundImageRegex, $preview->find('i', 0)->style, $photo)
) {
$image = '';
}
if ($preview->find('div.link_preview_title', 0)) {
$title = $preview->find('div.link_preview_title', 0)->plaintext;
}
if ($preview->find('div.link_preview_site_name', 0)) {
$site = $preview->find('div.link_preview_site_name', 0)->plaintext;
}
if ($preview->find('div.link_preview_description', 0)) {
$description = $preview->find('div.link_preview_description', 0)->plaintext;
}
return <<{$image}
{$title} - {$site}
{$description}
EOD;
}
private function processVideo($messageDiv)
{
if (empty($this->itemTitle)) {
$this->itemTitle = '@' . $this->processUsername() . ' posted a video';
}
if ($messageDiv->find('i.tgme_widget_message_video_thumb')) {
preg_match($this->backgroundImageRegex, $messageDiv->find('i.tgme_widget_message_video_thumb', 0)->style, $photo);
} elseif ($messageDiv->find('i.link_preview_video_thumb')) {
preg_match($this->backgroundImageRegex, $messageDiv->find('i.link_preview_video_thumb', 0)->style, $photo);
}
$this->enclosures[] = $photo[1];
return <<