Gå til innhold

Perl: Hjelp til å "sile ut" innholdet i en rss-feed.


Anbefalte innlegg

Hesann

 

Jeg jobber med å få til vekkerklokka de introduserte i hak5.org s01e03. Den skal sette på en sang, gå inn på en internettside, lese innholdet på internettsiden og printe ut innholdet.

 

Jeg har i prinsippet fått til alt dette, men problemet er at den bare leser opp tittelen på blogginnleggene, mens jeg ønsker at den leser hele innholdet i hver post. Hadde satt pris på litt hjelp med hvordan jeg skal få til dette =)

 

Jeg har en alarm.bat - fil med følgende innhold:

 

 

echo "Good Morning Eirik... ... ... ..." >> alarm.txt

echo "The blog to Voe:" >> alarm.txt
perl rss2html5.pl http://feeds.blogg.no/363381/post.rss >> alarm.txt

echo "Top 5 stories from Dig this morning are:... ..." >> alarm.txt
perl rss2html5.pl http://www.digg.com/rss/index.xml >> alarm.txt

echo "Top 5 stories from Slash Dot this morning are:... ..." >> alarm.txt
perl rss2html5.pl http://rss.slashdot.org/Slashdot/slashdot >> alarm.txt

echo "Top 5 stories from Boing Boing are:... ..." >> alarm.txt
perl rss2html5.pl http://feeds.feedburner.com/boingboing/iBag >> alarm.txt

echo "... ... Have a nice day!... ... ... ... ... ... ... ... ..." >> alarm.txt
echo "Oh, and by the way, Hack point five owns!" >> alarm.txt

del alarm.wav
TextToWave.vbs alarm.txt 35
del alarm.txt
start alarm.m3u

 

 

 

Videre har jeg en rss2html5.pl med følgende innhold:

 

 

#!/usr/bin/perl -w
# rss2html - converts an RSS file to HTML
# It take one argument, either a file on the local system,
# or an HTTP URL like http://slashdot.org/slashdot.rdf
# by Jonathan Eisenzopf. v1.0 19990901
# Copyright (c) 1999 Jupitermedia Corp. All Rights Reserved.
# See http://www.webreference.com/perl for more information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# INCLUDES
use strict;
use XML::RSS;
use LWP::Simple;

# Declare variables
my $content;
my $file;

# MAIN
# check for command-line argument
die "Usage: rss2html.pl (<RSS file> | <URL>)\n" unless @ARGV == 1;

# get the command-line argument
my $arg = shift;

# create new instance of XML::RSS
my $rss = new XML::RSS;

# argument is a URL
if ($arg=~ /http:/i) {
   $content = get($arg);
   die "Could not retrieve $arg" unless $content;
   # parse the RSS content
   $rss->parse($content);

# argument is a file
} else {
   $file = $arg;
   die "File \"$file\" does't exist.\n" unless -e $file;
   # parse the RSS file
   $rss->parsefile($file);
}

# print the HTML channel
&print_html($rss);

# SUBROUTINES
sub print_html {
   my $rss = shift;
   print <<HTML;
HTML

   # print the channel items
   my $i = 0;
   foreach my $item (@{$rss->{'items'}})
   {
     next unless defined($item->{'title'});
     print "$item->{'title'}... ... ... ... ...\n";
     if($i==4){
        last;   
     }
      $i = $i + 1;
   }

   # if there's a copyright element
   if ($rss->{'channel'}->{'copyright'}) {
  print <<HTML;
<p><sub>$rss->{'channel'}->{'copyright'}</sub></p>
HTML
   }

   print <<HTML;
HTML
}

 

 

 

Hvis noen finner det lettere, så er rss2html5.pl en remake av rss2html.pl som ser slik ut:

 

 

 

#!/usr/bin/perl -w
# rss2html - converts an RSS file to HTML
# It take one argument, either a file on the local system,
# or an HTTP URL like http://slashdot.org/slashdot.rdf
# by Jonathan Eisenzopf. v1.0 19990901
# Copyright (c) 1999 Jupitermedia Corp. All Rights Reserved.
# See http://www.webreference.com/perl for more information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# INCLUDES
use strict;
use XML::RSS;
use LWP::Simple;

# Declare variables
my $content;
my $file;

# MAIN
# check for command-line argument
die "Usage: rss2html.pl (<RSS file> | <URL>)\n" unless @ARGV == 1;

# get the command-line argument
my $arg = shift;

# create new instance of XML::RSS
my $rss = new XML::RSS;

# argument is a URL
if ($arg=~ /http:/i) {
   $content = get($arg);
   die "Could not retrieve $arg" unless $content;
   # parse the RSS content
   $rss->parse($content);

# argument is a file
} else {
   $file = $arg;
   die "File \"$file\" does't exist.\n" unless -e $file;
   # parse the RSS file
   $rss->parsefile($file);
}

# print the HTML channel
&print_html($rss);

# SUBROUTINES
sub print_html {
   my $rss = shift;
   print <<HTML;
<table bgcolor="#000000" border="0" width="200"><tr><td>
<TABLE CELLSPACING="1" CELLPADDING="4" BGCOLOR="#FFFFFF" BORDER=0 width="100%">
 <tr>
 <td valign="middle" align="center" bgcolor="#EEEEEE"><font color="#000000" face="Arial,Helvetica"><B><a href="$rss->{'channel'}->{'link'}">$rss->{'channel'}->{'title'}</a></B></font></td></tr>
<tr><td>
HTML

   # print channel image
   if ($rss->{'image'}->{'link'}) {
print <<HTML;
<center>
<p><a href="$rss->{'image'}->{'link'}"><img src="$rss->{'image'}->{'url'}" alt="$rss->{'image'}->{'title'}" border="0"
HTML
       print " width=\"$rss->{'image'}->{'width'}\""
    if $rss->{'image'}->{'width'};
print " height=\"$rss->{'image'}->{'height'}\""
    if $rss->{'image'}->{'height'};
print "></a></center><p>\n";
   }

   # print the channel items
   foreach my $item (@{$rss->{'items'}}) {
next unless defined($item->{'title'}) && defined($item->{'link'});
print "<li><a href=\"$item->{'link'}\">$item->{'title'}</a><BR>\n";
   }

   # if there's a textinput element
   if ($rss->{'textinput'}->{'title'}) {
print <<HTML;
<form method="get" action="$rss->{'textinput'}->{'link'}">
$rss->{'textinput'}->{'description'}<BR> 
<input type="text" name="$rss->{'textinput'}->{'name'}"><BR>
<input type="submit" value="$rss->{'textinput'}->{'title'}">
</form>
HTML
   }

   # if there's a copyright element
   if ($rss->{'channel'}->{'copyright'}) {
print <<HTML;
<p><sub>$rss->{'channel'}->{'copyright'}</sub></p>
HTML
   }

   print <<HTML;
</td>
</TR>
</TABLE>
</td></tr></table>
HTML
}

 

 

 

 

edit: resultatet i alarm.txt sånn det er nå, er slik:

 

 

 

"Good Morning Eirik... ... ... ..."

"The blog to Voe:"

Dagen i dag og Sunsilk Minerals-konkurransen... ... ... ... ...

Sjekk ut kul Beyonce-trailer!... ... ... ... ...

Hey school... ... ... ... ...

Jeg bruker ikke ekte pels... ... ... ... ...

Gratulerer med dagen, pappaer... ... ... ... ...

"Top 5 stories from Dig this morning are:... ..."

 

Airport Body Scan Porn, Hot XXX Sexy Pics, Click Here! (PICS) SFW

... ... ... ... ...

 

Organs of UK Nuclear Workers Secretly Harvested

... ... ... ... ...

 

H-1B at 20: How the 'tech worker visa' is remaking IT in America - Computerworld

... ... ... ... ...

 

Couple arrested for driving 2 MPH to strip club on stolen Wal-Mart scooter

... ... ... ... ...

 

The 5 Most Easily Avoidable Movie Deaths

... ... ... ... ...

"Top 5 stories from Slash Dot this morning are:... ..."

Review of Dell Inspiron Tablet/Laptop Hybrid... ... ... ... ...

Is Linux At the End of Its Life Cycle?... ... ... ... ...

An Astronaut's View of Space Station Tech... ... ... ... ...

200 Students Admit Cheating After Professor's Online Rant... ... ... ... ...

Cellphone Carriers Try To Control Signal Boosters... ... ... ... ...

<p><sub>Copyright 1997-2010, Geeknet, Inc. All Rights Reserved.</sub></p>

"Top 5 stories from Boing Boing are:... ..."

Phonekerchief: cellular-blocking hankie for polite dinner social signalling... ... ... ... ...

TSA head: We know nothing of Chertoff's pornoscanner conflict of interest. Also, who wants ice cream!... ... ... ... ...

Recirculating gravy fountain... ... ... ... ...

Vanity Fair bug sex interview with Isabella Rossellini goes horribly wrong... ... ... ... ...

Sweden seeks international arrest warrant for Wikileaks founder Assange... ... ... ... ...

"... ... Have a nice day!... ... ... ... ... ... ... ... ..."

"Oh, and by the way, Hack point five owns!"

 

 

og jeg ønsker som sagt å ikke bare ha overskriftene, men også innholdet i artikkelen til Voe.

 

 

(og hvis noen lurte, bruker jeg Voe bare som et eksempel :p )

Endret av r2d290
Lenke til kommentar
Videoannonse
Annonse

next unless defined($item->{'title'});       print "$item->{'title'}... ... ... ... ...\n";

 

Så den skriver ut $item->{title}, og du vil ha mer. Sjekk hva som finnes i item:

 

use Data::Dumper;
next unless defined($item->{'title'});       
print "$item->{'title'}... ... ... ... ...\n";
print Dump($item);

Lenke til kommentar

rss2html5.pl:

 

 

#!/usr/bin/perl -w
# rss2html - converts an RSS file to HTML
# It take one argument, either a file on the local system,
# or an HTTP URL like http://slashdot.org/slashdot.rdf
# by Jonathan Eisenzopf. v1.0 19990901
# Copyright (c) 1999 Jupitermedia Corp. All Rights Reserved.
# See http://www.webreference.com/perl for more information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# INCLUDES
use strict;
use XML::RSS;
use LWP::Simple;
use Data::Dumper;

# Declare variables
my $content;
my $file;

# MAIN
# check for command-line argument
die "Usage: rss2html.pl (<RSS file> | <URL>)\n" unless @ARGV == 1;

# get the command-line argument
my $arg = shift;

# create new instance of XML::RSS
my $rss = new XML::RSS;

# argument is a URL
if ($arg=~ /http:/i) {
   $content = get($arg);
   die "Could not retrieve $arg" unless $content;
   # parse the RSS content
   $rss->parse($content);

# argument is a file
} else {
   $file = $arg;
   die "File \"$file\" does't exist.\n" unless -e $file;
   # parse the RSS file
   $rss->parsefile($file);
}

# print the HTML channel
&print_html($rss);

# SUBROUTINES
sub print_html {
   my $rss = shift;
   print <<HTML;
HTML

   # print the channel items
   my $i = 0;
   foreach my $item (@{$rss->{'items'}})
   {
     next unless defined($item->{'title'});
     print "$item->{'title'}... ... ... ... ...\n";
     print Dump($item);
     if($i==4){
        last;   
     }
      $i = $i + 1;
   }

   # if there's a copyright element
   if ($rss->{'channel'}->{'copyright'}) {
  print <<HTML;
<p><sub>$rss->{'channel'}->{'copyright'}</sub></p>
HTML
   }

   print <<HTML;
HTML
}

 

 

 

alarm.txt

 

 

 

"Good Morning Eirik... ... ... ..."

""

"The 5 newest post from Tuxxxie are:"

JOBB og atter JOBB... ... ... ... ...

""

"Top 5 newest post from Kinder are:"

17. november 2010... ... ... ... ...

""

"Top 5 newest post from Malenemi are:"

Vinter i stallen... ... ... ... ...

""

"Top 5 newest post from Randy are:"

Life right now!... ... ... ... ...

""

"Top 5 stories from Dig this morning are:... ..."

 

How The USA Views The World (PIC)

... ... ... ... ...

""

"... ... Have a nice day!... ... ... ... ... ... ... ... ..."

"Oh, and by the way, Hack point five owns!"

 

 

 

(har nå lagt inn de bloggene jeg skal abonere på, så derfor litt annet innhold. Det som skjedde da jeg la til de linjene, var at den nå kun viser den første av hver tittel, men hvis jeg fjerner linjene igjen så viser den de 5 første tittlene.

 

Noe jeg gjorde galt?

Lenke til kommentar

Jeg må installere xml::rss for å få testa, men prøv print Dump(%item);

Meh, ikke hør på han der!

 

Det er Dumper

 

altså: nøyaktig sånn som du gjorde, men

 

print Dumper($item);

 

Data::Dumper hjelper deg å se hva som er i en variabel, også når det er et helt array, hash eller objekt. Nå kan du se hvilke felt du vil ha med i utskriften. Når du har sett det, kommenter ut print Dumper..... og print $item->{'det-finner-du-med-Dumper'} i stedet :)

Lenke til kommentar

Nei vettu hva, han første tullingen gidder jeg pokker ikke å høre på. Nesten så jeg rapporterer han for trolling :/

 

Neida, men han siste fyren, han fortjener en klapp på skuldra. Nå fikk jeg en txt-fil på 196 KB, og en Wav-fil på 6-700 MB :D

 

Så blir neste steg å få inn et filter ut ifra alle postene da... får ta det til uka =)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...