Шляхом Альбірео

НовиниЗаписиPHPRSS рідер reddit каналу

2024.08.20
Парсінг новинного каналу з сайту reddit.com через json, та xml

Доступні новини з онлайн-сервіса Reddit. Переходячи за посиланням, Ви потрапите на сторінку іншого ресурсу. В цьому скрипті розглянуті два способи отримання інформації з одного каналу. Мультиканльність не розглядалася, хоча й можлива.

Warning: file_get_contents(https://www.reddit.com/r/UACommunity/new.json?sort=new&limit=10): failed to open stream: HTTP request failed! HTTP/1.1 403 Blocked in /volume1/web/albireo/albireo-data/pages/notabene/php/rss-text-analitic/rss-reddit-rider/index.php on line 62 Warning: Invalid argument supplied for foreach() in /volume1/web/albireo/albireo-data/pages/notabene/php/rss-text-analitic/rss-reddit-rider/index.php on line 65 Warning: simplexml_load_file(https://www.reddit.com/r/UACommunity/new.rss?t=week&limit=10): failed to open stream: HTTP request failed! HTTP/1.1 403 Blocked in /volume1/web/albireo/albireo-data/pages/notabene/php/rss-text-analitic/rss-reddit-rider/index.php on line 114 Warning: simplexml_load_file(): I/O warning : failed to load external entity "https://www.reddit.com/r/UACommunity/new.rss?t=week&limit=10" in /volume1/web/albireo/albireo-data/pages/notabene/php/rss-text-analitic/rss-reddit-rider/index.php on line 114 Warning: Invalid argument supplied for foreach() in /volume1/web/albireo/albireo-data/pages/notabene/php/rss-text-analitic/rss-reddit-rider/index.php on line 118
Останні нівини. Парсінг через json (варіант-1)
Останні нівини. Парсінг через xml (варіант-2)

NoteКод сторінки зі стилями Berry в межах фреймворка Альбірео.

/* Приклади новин з Reddit двома способами */

[HTML+PHP]

<?php // Перевірка досяжності ресурсу $URL = 'https://www.reddit.com/r/UACommunity/'; // $URL = 'https://www.reddit.com/r/MapPorn/'; // $URL = 'https://www.reddit.com/r/UkraineWarVideoReport/'; $NUMITEMS_1 = 10; $NUMITEMS_2 = 5; // Перевіряємо, чи досяжний ресурс if(isSiteAvailible($URL)) { $head_1 = "Останні нівини. Парсінг через <span class='bg-gray750 pad7-rl pad3-tb t-tahoma t100 t-gray300 rounded3'>json</span> (варіант-1)"; $head_2 = "Останні нівини. Парсінг через <span class='bg-gray750 pad7-rl pad3-tb t-tahoma t100 t-gray300 rounded3'>xml</span> (варіант-2)"; /** * * Якщо ресурс існує і доступний (Варіант-1) * * $URL = "https://www.reddit.com/r/Ukraine_UA/new.json?sort=new&limit=10" * **/ $data = json_decode(file_get_contents($URL . "new.json?sort=new&limit=10"), true); $count_1 = ''; foreach ($data['data']['children'] as $val) { $title = $val['data']['title']; $link_flair_richtext = $val['data']['link_flair_richtext']; $domain = $val['data']['domain'].'<br>'; $url = $val['data']['url']; $reddit_link = $val['data']['permalink'].'<br>'; $post_id = $val['data']['id'].'<br>'; $date = $val['data']['created_utc'].'<br>'; $user = $val['data']['author'].'<br>'; $flair = $val['data']['author_flair_text'].'<br>'; $up = $val['data']['ups'].'<br>'; $comments = $val['data']['num_comments'].'<br>'; $thumbnail_url = $val['data']['secure_media']['oembed']['thumbnail_url']; $media_domain_url = $val['data']['secure_media_embed']['media_domain_url'].'<br>'; $created = (new DateTime())->setTimestamp($date); $date_Y = $created->format('d.m.Y'); $date_H = $created->format('H:i'); // Перевіряємо, чи є мініатюра в новині if(isset($thumbnail_url)) $thumbnail = "<img class='left zoom thumbnail w150px' src='" . $thumbnail_url . "'>"; else $thumbnail = ""; $var_body_1 = " <!-- Block content --> <div class='mar30-b b-clearfix'> <ul class='list-unstyled'> <li class='t90'><span class='t-yellow250'>$date_Y</span> $date_H</li> <li><a href='$url'>$thumbnail</a> $title<span class='pad10-rl'>|</span><a href=$url title='Перейти до джерела'>далі..</a></li> </ul> </div> <!-- End block --> "; $body_1 = $body_1 . $var_body_1; $numitems_1 = ++$count_1; // Виходимо з циклу, якщо досягнута вказана кількість новин if ($numitems_1 >= $NUMITEMS_1) break; } /** * * Якщо ресурс існує і доступний (Варіант-2) * * $URL = "https://www.reddit.com/r/Ukraine_UA/top.rss?t=week&limit=10" * **/ $xml = simplexml_load_file($URL . "new.rss?t=week&limit=10"); $count_2 = ''; $category = $xml->category['term']; foreach ($xml->entry as $x) { $string = $x->content; $date = $x->published; $link = $x->link['href']; $title = $x->title; $created = new DateTime($date); $date_Y = $created->format('d.m.Y'); $date_H = $created->format('H:i'); // Витягуємо посилання на img preg_match('/src\s*=".*?[^\"]*?\/?\s*"/i',$string, $result); // Перевіряємо, чи є мініатюра в новині, якщо ні - то пропускаємо її if(isset($result[0])) { $string = "<img class='zoom thumbnail w200px' " . $result[0] . "><br>"; $var_body_2 = " <!-- Block content --> <div class='grid-var' style='--gap: 30px; --columns: auto auto;'> <div class='grid-item-var grid-item-var-tablet' style='--row:1/3; --row-tablet:1/3;'><a href='$link' title='Коментарі та подробиці на каналі'>$string</a></div> <div class='t-italic t-bold-light grid-item-var-tablet'><span class='t90 t-yellow250'>$date_Y</span> <span class='t90'>$date_H</span></div> <div class='t-italic t-bold-light grid-item-var-tablet'>Details: <a href='$link'>$category</a></div> </div> <div class='pad15-t t-italic t-bold-light grid-item-var-tablet t-justify' style='--column-tablet: 1/2;'>$title</div> <hr> <!-- End block --> ";} else { $var_body_2 = ""; } $body_2 = $body_2 . $var_body_2; $numitems_2 = ++$count_2; // Виходимо з циклу, якщо досягнута вказана кількість новин if ($numitems_2 >= $NUMITEMS_2) break; } // Якщо ресурс недоступний взагалі, то попереджаємо про це } else { echo 'Reddit-канал зараз недоступний, вибачте'; } ?> <div class="mar20-t b-flex flex-wrap-phone flex-jc-center"> <div class="w45 w100-phone mar20-b-phone"> <h5 class="mar30-tb"><?= $head_1 ?></h5> <div class="t-gray500"><?= $body_1 ?></div> </div> <div class="w10 hide-phone"></div> <div class="w45 w100-phone"> <h5 class="mar30-tb"><?= $head_2 ?></h5> <div class="t-gray500"><?= $body_2 ?></div> </div> </div> <?php /*** Function zone ***/ function extractString($string, $start, $end) { $string = " ".$string; $ini = strpos($string, $start); if ($ini == 0) return ""; $ini += strlen($start); $len = strpos($string, $end, $ini) - $ini; return substr($string, $ini, $len); } function isSiteAvailible($url) { // Перевірка правильності URL if(!filter_var($url, FILTER_VALIDATE_URL)){ return false; } // Ініціалізація cURL $curlInit = curl_init($url); // Встановлення параметрів запиту curl_setopt($curlInit, CURLOPT_CONNECTTIMEOUT,10); curl_setopt($curlInit, CURLOPT_HEADER,true); curl_setopt($curlInit, CURLOPT_NOBODY,true); curl_setopt($curlInit, CURLOPT_RETURNTRANSFER,true); curl_setopt($curlInit, CURLOPT_URL, $url); curl_setopt($curlInit, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); curl_setopt($curlInit, CURLOPT_FOLLOWLOCATION, false); curl_setopt($curlInit, CURLOPT_SSL_VERIFYPEER, false); // Отримання відповіді $response = curl_exec($curlInit); // Закриття сURL curl_close($curlInit); return $response ? true : false; } ?>