| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
TelkkuLinkku 10.05.05 17:55 Paketin avulla voi helposti hakea telkku.comista haluamasi kanavan päivän tv-ohjelmat.
# Tiedosto: Telkku.pm package Telkku; use strict; use warnings; use IO::Socket; use vars qw($VERSION); use Safe; $VERSION = 0.1; our $host = 'telkku.com'; our $port = 80; our $address = 'telkku.cgi?n=&sivu=0&sn=11&konro='; our $channel; sub new { my $self = {}; bless $self, shift(); return $self; } sub get { $channel = $_[1]; return parseSource(); } # parsitaan lähdekoodi sub parseSource { my @result; #06:55 Ostoskanava</b></td></tr> <tr><td><blockquote><font class=a>Tuote-esittelyjä, tarjouksia.</blockquote></td></tr> my $find = qr((.+)</b></td></tr> <tr><td><blockquote><font class=a>(.+)</blockquote></td></tr>); my $src = getSource() or die("Can't get page source!"); my @source = split( "<tr><td><font class=a><b>", $src ); for(@source){ # 06:55 Ostoskanava</b></td></tr> if(/(\d+:\d+)(.*)<\/b><\/td><\/tr>/) { s/\r|\n|\t|\r\n//g; s/<\/table> <\/blockquote>.+//; m/$find/; # $1 = 06:55 Ostoskanava # $2 = Tuote-esittelyjä, tarjouksia. push @result, [$1, $2]; } } return @result; } # palauttaa haetun sivun lähdekoodin sub getSource { my $source = " "; my $socket = new IO::Socket::INET ( Proto => 'tcp', PeerAddr => $host, PeerPort => $port ); die "Could not connect to $host:$port" unless $socket; print $socket "GET /$address$channel\r\n"; # luetaan socketti tyhjäksi $source .= "$_ " for <$socket>; return $source; } 1; __END__ =head1 NAME Telkku - Hakee ja parsii TV-ohjelmat telkku.com:sta =head1 SYNOPSIS Käyttö: use Telkku; my $tv = new Telkku; # get:n parametrinä kanavan numero my @progs = $tv->get(2); # tulostetaan ohjelmat my @progs = $tv->get(($ARGV[0]?($ARGV[0]-1):3)); print "@{$_}\n" for @progs; =head1 DESCRIPTION Paketin avulla voi helposti hakea telkku.comista haluamasi kanavan päivän tv-ohjelmat. Kanavien numerot: YLE1 0 YLE2 1 MTV3 2 Nelonen 3 Subtv 4 CNBC 5 CANAL+ 6 CANAL+ FILM1 7 CANAL+ FILM2 8 TV1000 9 TV1000 Action 10 Eurosport 11 MTV Nordic 12 TV1000 Nordic 13 YLE24 14 YLE Teema 15 YLE FST 16 TV Finland 18 TV1000 Family 19 TV1000 Classic 20 BBC World 21 Discovery Cha...22 Animal Planet 23 SVT 1 24 SVT 2 25 SVT24 26 SVT Europa 27 TV3 28 MTVe 30 TV4 31 Kanal5 32 ZTV 33 MTV3+ 34 Nelonen Plus 35 CANAL+ SPORT 36 C MORE FILM 37 The Voice 38 =head2 METHODS =over 1 =item get( $channel_number ) Palauttaa taulukon, joka sisältää valitun kanavan ohjelmat taulukossa, joka sisältää taulukon. Sen taulukon ensimmäinen alkio sisältää ohjelman ja toinen mahdollisen kuvauksen. =cut editoitu: 16:32 11.5.05 Linkku 18:00 10.5.05 Ja koska pitää olla myös käyttöesimerkki niin tässä se tulee: #!/usr/bin/perl -w use strict; use Telkku; use warnings; my $tv = new Telkku; my @progs = $tv->get(($ARGV[0]?($ARGV[0]-1):3)); print "@{$_}\n" for @progs; Käyttö: ./telkku.pl 3, näyttää mtv3:n ohjelmat, joita voi kätevästi grepata: ./telkku.pl 3 | grep ^20, näyttää klo 20 alkavat ohjelmat. [edit] korjattu esimerkki editoitu: 19:56 10.5.05 Ztane 19:51 10.5.05 hn, mikset vaan pushaa listaan [ $1, $2 ] ja esimin for-loopissa for (@progs) { my @info = @{$_} ... Sitten, my $find = ... rivillä voit käyttää qr''-sulkuja (man perlop). s/\r|\n|\t|\n\r// poistaa vain yhden tabin/newlinen/tms koska puuttuu g, ja helpompi kirjottaa tr/\r\n\t//d $source .= "$_ " for <$socket>; => $source = join ' ', <$socket>; Näin tuloksena idiomaattisempaa perliä. Tietoa viittauksista ja datastruktuureista: man perlref, perlreftut, perldsc editoitu: 16:26 11.5.05 Linkku 07:47 11.5.05 Tosiaan, tuo g:hän oli se taikasana. [edit] aijuu... lapponia 23:31 13.1.07 Onko tuo osoite vielä oikein: telkku.cgi?n=&sivu=0&sn=11&konro= Tulostaa tyhjän sivun. Koska käytän windowsia, täytyi lisätä tämä rivi: print "Content-Type:text/html\n\n"; |
![]() Haku
|