FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: betateilchen am 14 Februar 2015, 19:42:52

Titel: Headlines aus Tagesschau RSS extrahieren
Beitrag von: betateilchen am 14 Februar 2015, 19:42:52
Voraussetzung: Das perl Modul XML::Simple muss installiert sein!


use XML::Simple;
use HttpUtils;

sub tagesschau {
  my ($lines) = shift;
  $lines //= 10;

  my ($i,$nachrichten,$response,@ticker,$ua,$url,$xml);

  $i = 0;
  $url = "http://www.tagesschau.de/xml/rss2";
  $response = GetFileFromURLQuiet($url,3,undef,1);
  $xml         = new XML::Simple;
  $nachrichten = $xml->XMLin($response, ForceArray => ['item']);

  while ($i < $lines) {
    my $h = latin1ToUtf8($nachrichten->{channel}{item}[$i]{title});
    last unless $h;
    push (@ticker,$h);
    $i++;
  }
  return join("\n", @ticker);
}


Aufgerufen wird die Funktion einfach mit

tagesschau(<anzahlZeilen>)

Wird <anzahlZeilen> weggelassen, werden 10 Zeilen zurückgegeben.




Beispiel:

In der Eingabezeile des fhem Frontend eingeben:

{tagesschau}

liefert als Ergebnis:


Angriffe aus islamkritische Künstler - ein Überblick
Boko Haram überfällt Großstadt in Nigeria
Schüsse in Kopenhagen bei Veranstaltung mit Karikaturisten
Fußball-Bundesliga: Torfestivals in München und Leverkusen
Bundesliga-Liveticker: Bayern empfängt den HSV
Chronologie der Krise: Februar 2015
Neuseeland: Hoffnung für 60 der 200 gestrandeten Wale
Waffenruhe in Ostukraine: Hält sie oder hält sie nicht?
Ratingagentur Fitch stuft Österreich herab
Der Libanon am zehnten Jahrestag des Attentats auf Hariri
Titel: Antw:Headlines aus Tagesschau RSS extrahieren
Beitrag von: ptigges am 30 Juli 2015, 08:51:50
Vielen Dank, super Codeschnipsel!
Titel: Antw:Headlines aus Tagesschau RSS extrahieren
Beitrag von: Thargor am 19 April 2016, 22:40:52
Funktioniert das bei euch noch?

Ich bekomme seit kurzen immer:
No value specified for 'KeyAttr' option in call to XMLin() at /usr/local/FHEM/share/fhem/FHEM/99_myUtils.pm line 358.

Leider konnte ich nicht nachvollziehen was sich bei mir geändert hat.
Titel: Antw:Headlines aus Tagesschau RSS extrahieren
Beitrag von: Hans Franz am 20 April 2016, 09:30:13
Ersetze/ändere die Zeile so:
$nachrichten = $xml->XMLin($response, ForceArray => ['item'], KeyAttr => []);
Sollte dann wieder gehen.

Gruß
Hans
Titel: Antw:Headlines aus Tagesschau RSS extrahieren
Beitrag von: Thargor am 20 April 2016, 09:43:59

Super vielen Dank!
Nur interessehalber, wieso ist die Änderung nötig geworden?
Titel: Antw:Headlines aus Tagesschau RSS extrahieren
Beitrag von: hartenthaler am 27 April 2016, 19:05:34
Nett! Aber wie setzt ihr die Headlines ein? Habt ihr Anwendungsbeispiele? Ich könnte mir vorstellen, dass ich eine TabletUI-Seite baue in der die letzten entgangenen Anrufe, die Termine für den Tag, die Fahrzeit zur Arbeit, eine große Uhr und eben die Tagesschau-Headlines dargestellt werden. So als Einstieg in den Tag. Allerdings kann es sein, dass man zu einer Headline noch weitere Infos haben möchte, weil das Thema so spannend ist. Also ein Link?
Titel: Antw:Headlines aus Tagesschau RSS extrahieren
Beitrag von: hartenthaler am 11 Oktober 2016, 23:46:48
Ich habe die Funktion noch um html-Tags erweitert und zeige sie dann folgendermaßen an:

define tagesschau.headlines weblink htmlCode { tagesschau("html",20) }


Und hier die Änderungen:

################################################################
###                     Tagesschau-Headlines               
################################################################

# 1. optionaler Parameter: "html"/"text" für html-Liste oder Text-Liste (Standard)
# 2. optionaler Parameter: Anzahl der Listeneinträge (Standard = 10)

use XML::Simple;
use HttpUtils;

sub tagesschau (;$$) {
  my ($list, $lines) = @_;
  $list //= "text";
  $lines //= 10;

  my ($i,$l,$nachrichten,$response,@ticker,$url,$xml);

  $url         = "http://www.tagesschau.de/xml/rss2";
  $response    = GetFileFromURLQuiet($url,3,undef,1);
  $xml         = new XML::Simple;
  $nachrichten = $xml->XMLin($response, ForceArray => ['item'], KeyAttr => []);
  $l = ($list ne "text");

  push (@ticker,"<ul>") if $l;
  $i = 0;
  while ($i < $lines) {
    my $h = latin1ToUtf8($nachrichten->{channel}{item}[$i]{title});
    last unless $h;
$h = "<li>".$h."</li>" if $l;
    push (@ticker,$h);
    $i++;
  }
  push (@ticker,"</ul>") if $l;
  return join("\n", @ticker);
}


PS: es gibt übrigens noch einen Thread zum Anzeigen/Wiedergeben auf Sonos der 100-Sekunden-Tagesschau: https://forum.fhem.de/index.php/topic,45384.0.html
Titel: Antw:Headlines aus Tagesschau RSS extrahieren
Beitrag von: Benni am 12 Oktober 2016, 05:17:24
Zitat von: hartenthaler am 27 April 2016, 19:05:34
Nett! Aber wie setzt ihr die Headlines ein? Habt ihr Anwendungsbeispiele?

Ich nutze die Headlines in Infopanel (http://fhem.de/commandref.html#InfoPanel). Das hat eine eingebaute Ticker-Funktion um so was anzuzeigen.

Aus dieser einfachen Idee heraus ist übrigens das Modul rssFeed (http://fhem.de/commandref_DE.html#rssFeed) entstanden ;D

Titel: Antw:Headlines aus Tagesschau RSS extrahieren
Beitrag von: gbomacfly am 08 Januar 2018, 12:34:03
Genialer Schnipsel, Danke dafür.
Ich würde die Headlines gerne mit nem Link versehen, kann mir jemand Hilfestellung geben?
Titel: Antw:Headlines aus Tagesschau RSS extrahieren
Beitrag von: gbomacfly am 13 Februar 2018, 22:28:53
Endlich kam ich zum Spielen, hier die angepasste Funktion mit Links :)

sub tagesschau (;$$) {
  my ($list, $lines) = @_;
  $list //= "text";
  $lines //= 10;

  my ($i,$l,$nachrichten,$response,@ticker,$url,$xml);

  $url         = "http://www.tagesschau.de/xml/rss2";
  $response    = GetFileFromURLQuiet($url,3,undef,1);
  $xml         = new XML::Simple;
  $nachrichten = $xml->XMLin($response, ForceArray => ['item'], KeyAttr => []);
  $l = ($list ne "text");

  push (@ticker,"<ul>") if $l;
  $i = 0;
  while ($i < $lines) {
    my $h = latin1ToUtf8($nachrichten->{channel}{item}[$i]{title});
    my $l = latin1ToUtf8($nachrichten->{channel}{item}[$i]{link});

    last unless $h;
$h = "<li><a href=\"" . $l . "\" target=\"_blank\">" .$h."</a></li>" if $l;
    push (@ticker,$h);
    $i++;
  }
  push (@ticker,"</ul>") if $l;
  return join("\n", @ticker);
}