{"id":22,"date":"2007-04-29T16:55:13","date_gmt":"2007-04-29T14:55:13","guid":{"rendered":"http:\/\/robert.kolatzek.org\/wblog\/?p=22"},"modified":"2007-04-29T16:55:13","modified_gmt":"2007-04-29T14:55:13","slug":"rss_und_atom_mit_php_lesen","status":"publish","type":"post","link":"https:\/\/blog.kolatzek.org\/wblog\/22\/rss_und_atom_mit_php_lesen","title":{"rendered":"RSS und Atom Serverseitig mit PHP verarbeiten"},"content":{"rendered":"<p>Wie versprochen, komme ich zur Sache und lasse mich in der wahrscheinlich interessantesten Kategorie &#8222;Software &amp; Co&#8220; \u00fcber eine Endeckung. Vielleicht kennen es schon einige&#8230; Egal! F\u00fcr mich war das neu und hat mich auf neue Ideen Gebracht.<\/p>\n<p>Es geht &#8211; wie der Titel bereist erw\u00e4hnt um PHP-Skript, der auf dem Server RSS, Atom oder RDF (mit anderen Worten Content-Syndication &#8211; Definition <a href=\"http:\/\/www.drweb.de\/weblogs\/rss_content_syndication.shtml\">hier<\/a> oder <a href=\"http:\/\/www.drweb.de\/weblogs\/rss_content_syndication.shtml\">hier<\/a>) verarbeitet. Der Name lautet: <a href=\"http:\/\/simplepie.org\/\">Simple Pie<\/a> (In der Anlehung an &#8222;American Pie&#8220;?). Der Nachfolger vom eingeschlafenen Projekt <a href=\"http:\/\/magpierss.sourceforge.net\/\">Magpie<\/a> \u00fcberrascht mit eine Vielfalt an Funktionen und Formaten.<\/p>\n<p>Nach dem <a href=\"http:\/\/simplepie.org\/downloads\/\">Download<\/a> des Packets, der die Reader-Klasse als auch ein Demo enth\u00e4lt, lohnt sich der Blick in die sehr gute &#8211; wenn auch nur <a href=\"http:\/\/simplepie.org\/docs\/\">englische Dokumentation<\/a>. F\u00fcr Anf\u00e4nger wird ein die Demo-Anwendung (index.php) im Ordner &#8222;demo&#8220; sicher sehr hilfreich sein. F\u00fcr fortgeschrittene Programmierer ist die <a href=\"http:\/\/simplepie.org\/docs\/reference\/\">Funktionsreferenz<\/a> sicher informativer.<\/p>\n<p><!--more--><\/p>\n<p>Ich gehe davon aus, dass das entpacken dieses Zip-Archivs keinem Kopfzerbrechen bereitet und die Dateien schon auf der Festplatte liegen. Jetzt geht&#8217;s ans Eingemachte!<\/p>\n<p>Wir starten unser Skript mit dem Import der SpimlePie-Klasse:<\/p>\n<pre>include_once('simplepie.inc');<\/pre>\n<p>Dies setzt voraus, dass unser Skript im selben Ordner liegt, wie simplepie.inc (die Klassendatei).<br \/>\nJetzt brauchen wir eine Instanz der Klasse (eine Realisierung des Abstrakten). Dazu schreiben wir:<\/p>\n<pre>$feed_parser = new SimplePie();<\/pre>\n<p>Jetzt haben wir einen real existierenden Feed-Parser, der seine Eigenschaften und F\u00e4higkeiten (Metoden) von der Klasse \u00fcbernimmt.<br \/>\nMit:<\/p>\n<pre>$feed_parser-&gt;strip_ads(true);<\/pre>\n<p>Teilen wir unserem Feed-Parser mit, dass wir keine google-Adsens- oder doubleclick-Werbung haben wollen.<\/p>\n<pre>$feed_parser-&gt;cache_location(\".\/tmp\");<\/pre>\n<p>Teilt mit, wo der cache (Zwischenspeicher f\u00fcr abgeholte Quellen) zu finden ist: im Unterordner &#8222;tmp&#8220;. Standardm\u00e4\u00dfig ist der mitgelieferte Ordner &#8222;cache&#8220; daf\u00fcr zust\u00e4ndig&#8230; Es ist jedoch nicht empfehlenswert, Open-Source-Software unver\u00e4ndert einzusetzten: eine unbekannte Sicherheitsl\u00fccke und Ihr Server muss dran glauben! Beim Cache ist das vielleicht nicht do relevant, aber wer wei\u00df, was man damit anstellen kann. Also doch lieber einen Unterordner anlegen!<br \/>\nDie Cache-Verwaltung von SimplePie ist schon ziemlich gut. Wer es verbessern will, hat mit <em>set_cache_class()<\/em> die M\u00f6glichkeit, das zu tun. \u00dcberhaupt ist SimplePie ziemlich gut konfigurierbar: <em>input_encoding(&#8222;UTF-8&#8220;)<\/em> setzt die Kodierung auf das sehr universelle UTF-8. Auch ISO-8859-1 ist oft vertreten. Leider hilft der Blick in die Quelle selbst nur selten: Die Kodierung wird zwar deklariert aber oft nicht durchgehalten. Um die Bilder oder als Link engebundene Dateien (wie mp3 bei Podcasts &#8211; auch die sind nichts anderes als RSS &#8211; nur eben mit Links zu Musikdateien statt zu Internetseiten) zu handhaben, gibt es Funktionen wie <em>set_enclosure_class()<\/em> usw&#8230;<\/p>\n<p>Interessant k\u00f6nnte auch <em>set_timeout()<\/em> sein, welches die Zeit bestimmt, die versteichen darf, bis RSS abgeholt wurde. Auch <em>strip_htmltags(true) <\/em>kann daf\u00fcr sorgen, dass die im RSS-Verwendeten HTML-Tags entfernt werden (Wer will schon sich sein gut \u00fcberlegtes Layout kaputt machen lassen?).<\/p>\n<p>Jetzt setzten wir die Adresse der Quelle:<\/p>\n<pre>$feed_parser-&gt;-&gt;feed_url(\"http:\/\/robert.kolatzek.org\/wblog\/feed\");<\/pre>\n<p>und holen sie mit<\/p>\n<pre>$feed_parser-&gt;init();\n$feed_parser-&gt;handle_content_type();<\/pre>\n<p>ab.<\/p>\n<pre>foreach($feed-&gt;get_items() as $item)\n{\n}<\/pre>\n<p>geht den Feed Eintrag f\u00fcr Eintrag durch. Auf jeden von diesen sind die Funktionen von <a href=\"http:\/\/simplepie.org\/docs\/reference\/item\/\"><em>http:\/\/simplepie.org\/docs\/reference\/item\/<\/em><\/a> anwendbar. Auf das Feed als ganzes sind wiederum die Funtionen von <a href=\"http:\/\/simplepie.org\/docs\/reference\/feed\/\"><em>http:\/\/simplepie.org\/docs\/reference\/feed\/<\/em><\/a> anwendbar. Wenn Sie also den Titel des Feeds zeigen wollen, tun sie folgendes:<\/p>\n<pre>echo $feed_parser-&gt;get_feed_title();<\/pre>\n<p>F\u00fcr den Titel eines Eintrags:<\/p>\n<pre>echo $item-&gt;get_title();<\/pre>\n<p>(Nat\u00fcrlich nur innerhalb der geschweiften Klammern von foreach!)<br \/>\nProblematisch ist es, wenn man z.B. alle Autoren eines Beitrags sehen wollen. F\u00fcr einen einzigen tun wir: <span style=\"font-family: Courier New\"><em>$autor = $item-&gt;get_author(0);<\/em> <\/span>f\u00fcr mehrere <span style=\"font-family: Courier New\"><em><\/em><\/span><\/p>\n<pre>$autoren = $item-&gt;get_authors();\nforeach($autoren as $autor)\n{\necho $autor-&gt;get_name();\n}<\/pre>\n<p>gibt den Namen aus.<\/p>\n<p>\u00c4hnlich verf\u00e4hrt man mit enclosures (Bildern oder Musikst\u00fccken):<\/p>\n<pre>$enclos = $item-&gt;get_enclosure(); \necho $enclos-&gt;get_type();<\/pre>\n<p>gibt dann z.B. &#8222;image\/jpeg&#8220; wenn es ein jpg-Bild ist. Auch die Dateiendungen (<em>$enclos-&gt;get_extension();<\/em>) sind gute Entscheidungshilfe, ob man es als Bild mit <img alt=\"\" \/> oder als  zu behandeln hat&#8230;<\/p>\n<p>Doch das wichtigste h\u00e4tten wir fast vergessen: den Link zum Artikel selbst!<\/p>\n<pre>$item-&gt;get_permalink();<\/pre>\n<p><em><br \/>\n<\/em>Und die Kurzbeschreibung dessen<em>:<br \/>\n<\/em><\/p>\n<pre>echo $item-&gt;get_description().\n\"&lt;a href='.$item-&gt;get_permalink().\"'&gt;\".$item-&gt;get_title().\"&lt;\/a&gt; \";<\/pre>\n<p>War das nicht einfach?<br \/>\nNa also&#8230; Ab an die Arbeit!<\/p>\n<p>Und hier ein Beispiel daf\u00fcr, was man alles mit SimpePie anstellen kann:<\/p>\n<h3 style=\"text-align: center\"><a href=\"http:\/\/www.mixano.de\/\">www.Mixano.de &#8211; die RSS-Suchmaschine, der RSS-Reader und RSS-Mixer<\/a><\/h3>\n","protected":false},"excerpt":{"rendered":"<p>Wie versprochen, komme ich zur Sache und lasse mich in der wahrscheinlich interessantesten Kategorie &#8222;Software &amp; Co&#8220; \u00fcber eine Endeckung. Vielleicht kennen es schon einige&#8230; Egal! F\u00fcr mich war das neu und hat mich auf neue Ideen Gebracht. Es geht &#8211; wie der Titel bereist erw\u00e4hnt um PHP-Skript, der auf dem Server RSS, Atom oder [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_sitemap_exclude":false,"_sitemap_priority":"","_sitemap_frequency":"","ocean_post_layout":"","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"","ocean_second_sidebar":"","ocean_disable_margins":"enable","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"default","ocean_display_header":"default","ocean_header_style":"","ocean_center_header_left_menu":"","ocean_custom_header_template":"","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":0,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":0,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"","ocean_menu_typo_font_family":"","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"default","ocean_display_footer_bottom":"default","ocean_custom_footer_template":"","ocean_post_oembed":"","ocean_post_self_hosted_media":"","ocean_post_video_embed":"","ocean_link_format":"","ocean_link_format_target":"self","ocean_quote_format":"","ocean_quote_format_link":"post","ocean_gallery_link_images":"on","ocean_gallery_id":[],"footnotes":""},"categories":[8],"tags":[36,74,82,94,131],"class_list":["post-22","post","type-post","status-publish","format-standard","hentry","category-software","tag-feed","tag-opensource","tag-php","tag-rss","tag-xml","entry"],"_links":{"self":[{"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/posts\/22","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/comments?post=22"}],"version-history":[{"count":0,"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/posts\/22\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/media?parent=22"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/categories?post=22"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/tags?post=22"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}