Met RSS-Bridge kun je zelf allerhande online bronnen in een RSS-feed gieten. En gisteren deed ik dat voor Apache, het online magazine dat sinds het op Drupal draait (kortstondig?) geen RSS-feed meer beschikbaar stelt.
Mijn custom bridge ziet er in elk geval zo uit:
<?php class ApacheBridge extends BridgeAbstract { const MAINTAINER = 'ochtendgrijs'; const NAME = 'Apache'; const URI = 'https://www.apache.be/'; const CACHE_TIMEOUT = 3600; const DESCRIPTION = 'Inhoud heerst'; public function collectData() { $pageUrl = self::URI . 'artikels/nieuws'; $html = getSimpleHTMLDOM($pageUrl) or returnServerError('Could not request Apache: ' . $pageUrl); foreach ($html->find('article.node--type-article') as $element) { if (count($this->items) >= 20) { break; } $item = [ 'uri' => 'https://www.apache.be' . $element->find('div.article-list-text > a', 0)->href, 'title' => trim($element->find('div.article-list-titel span', 0)->plaintext), 'content' => '<p>' . trim($element->find('div.article-list-teaser', 0)->plaintext) . '</p>', 'timestamp' => strtotime(trim($element->find('span.article-list-datum', 0)->plaintext)), ]; $this->items[] = $item; } } }
Veel meer dan RSS-Bridge aan de hand van wat CSS-selectors vertellen waar het net bepaalde (meta)data kan terugvinden, is dat niet. (Het valt op, overigens, dat Apache niet bepaald semantische HTML gebruikt, maar dat terzijde.)
En de volledige berichten?
Hierboven maakten we een feed voor de artikelen op https://www.apache.be/artikels/nieuws. Op dat feed kunnen we ons nu gaan abonneren. (Samenvattingen) van nieuwe items verschijnen dan automatisch in onze reader.
Als bonus leg ik nog even uit hoe ik mijn eigen feedreader geïnstrueerd heb om meteen de volledige berichten op te halen.
In mijn reader haal ik met file_get_contents()
de betreffende webpagina’s op. Waarom die (eenvoudige) functie en geen geavanceerder bibliotheek? KISS!
Moet ik (t.t.z. voor artikelen achter een paywall) alleen nog een session cookie meesturen, nadat ik mijn reader zich met mijn e-mailadres en wachtwoord heb laten aanmelden.
Dat aanmelden moet met een POST request, en dat doe ik met cURL. De cookie sla ik lokaal op. Vervolgens haal ik uit dat tekstbestand de informatie (d.i. het ID en de value) die nodig is om Apache te bewijzen dat ik ben aangemeld.
Ondertussen werkt dit alles netjes, al zoek ik nog even uit hoe ik ook voor die POST request file_get_contents()
kan gebruiken (dat het kan, weet ik, en om de cookie op te slaan zou ik de headers kunnen parsen).