Habo-Twitter-Feed optimieren

bitmuncher

Senior-Nerd
Vielleicht hat hier ja noch jemand eine Idee, wie man das Script, das http://twitter.com/habofeed mit Daten versorgt, optimieren kann. Hier ist der Source:

Code:
#!/usr/bin/perl

use strict;
use warnings;

use Config::Simple;
use Net::Twitter;

my $config_file = '/home/foobar/twitter.access.ini';

my $cfg = new Config::Simple() or die $!;
$cfg->read($config_file) or die $!;

my $access_token        = $cfg->param('access_token');
my $access_token_secret = $cfg->param('accesss_token_secret');
my $user_id             = $cfg->param('user_id');
my $screen_name         = $cfg->param('screen_name');
my $consumer_key        = $cfg->param('consumer_key');
my $consumer_secret     = $cfg->param('consumer_secret');

my $nt = Net::Twitter->new(
    traits => [qw/API::REST OAuth/],
    ( consumer_key => $consumer_key, consumer_secret => $consumer_secret )
    );

$nt->access_token($access_token);
$nt->access_token_secret($access_token_secret);

# auth is done let's do the real stuff
my $url = 'http://www.hackerboard.de/external.php?type=RSS2&lastpost=1';
my $file = '/home/foobar/feed.txt';
my $lastdatefile = '/home/foobar/last.txt';

my %month_names = ('Jan' => 1,
                   'Feb' => 2,
                   'Mar' => 3,
                   'Apr' => 4,
                   'May' => 5,
                   'Jun' => 6,
                   'Jul' => 7,
                   'Aug' => 8,
                   'Sep' => 9,
                   'Oct' => 10,
                   'Nov' => 11,
                   'Dec' => 12
    );

use XML::RSS::Parser;
use FileHandle;
use WWW::Shorten::TinyURL;
use WWW::Shorten 'TinyURL';
use Time::Local;

my $cmd = "wget -O $file -o wget.log $url";
my $out = `$cmd`;
print $out."\n";

my $p = XML::RSS::Parser->new;
my $fh = FileHandle->new($file);
my $feed = $p->parse_file($fh) or die $!."\n";

my $count = $feed->item_count;
print $count." Items.\n";

my $loop_count = 1;
my @items = ();
foreach my $i ($feed->query('//item')) {
    push(@items, $i);
}

my @items_new = reverse(@items);

foreach my $i (@items_new) {
    my $new_item = 0;
    my $node = $i->query('title');
    my $title = $node->text_content;
    $node = $i->query('pubDate');
    my $datetime = $node->text_content;
    $node = $i->query('link');
    my $url = $node->text_content;

    my $lastdate = '';
    open(FILE, "< $lastdatefile") or die $!."\n";
    while(<FILE>) {
        chomp;
        $lastdate = $_;
    }
    my $lastdate_unix;
    my $datetime_unix;
    # $lastdate zu unixtime umwandeln
    if($lastdate =~ /(\d+)\s(...)\s(\d+)\s(\d+):(\d+):(\d+)\s.../) {
        my $mday = $1;
        my $mname = $2;
        my $year = $3;
        my $hour = $4;
        my $minutes = $5;
        my $seconds = $6;
        my $month = $month_names{$mname};
        $lastdate_unix = timelocal($seconds, $minutes, $hour, $mday, ($month -1), $year);
    }

    # $datetime in unixtime umwandeln
    if($datetime =~ /(\d+)\s(...)\s(\d+)\s(\d+):(\d+):(\d+)\s.../) {
        my $mday = $1;
        my $mname = $2;
        my $year = $3;
        my $hour = $4;
        my $minutes = $5;
        my $seconds = $6;
        my $month = $month_names{$mname};
        $datetime_unix = timelocal($seconds, $minutes, $hour, $mday, ($month - 1), $year);
    }

    print "Last date unix: ".$lastdate_unix."\n";
    print "Datetime unix: ".$datetime_unix."\n";

    if($lastdate_unix < $datetime_unix) {
        $new_item = 1;
    }

    if($new_item == 1) {
        # diesen beitrag twittern
        my $tinyurl = makeashorterlink($url);
        my $msg = 'Neuer Beitrag in: '.$title.' - '.$tinyurl."\n";
        print $msg;
        $nt->update($msg) or die $!;
        
        # neue zeit des letzten beitrags merken
        open(INFILE, "> $lastdatefile");
        print INFILE $datetime."\n";
        close(INFILE);
    }

    $loop_count++;
    close(FILE);
}

$cmd = "rm wget.log";
$out = `$cmd`;
print $out."\n";

$nt->end_session();
exit;
 
Vielleicht hat hier ja noch jemand eine Idee, wie man das Script, das http://twitter.com/habofeed mit Daten versorgt, optimieren kann.

Was willst du da groß optimieren? ;)

Code:
#!/usr/bin/perl
Code:
#!/usr/bin/env perl
Macht es etwas portabler...

Code:
[...]

my $url = 'http://www.hackerboard.de/external.php?type=RSS2&
use XML::RSS::Parser;
use FileHandle;
use WWW::Shorten::TinyURL;
use WWW::Shorten 'TinyURL';
use Time::Local;
Mitten im Code mit "use" Module einzubinden ist extrem hässlich. Wer hat schon Lust den gesammten Quelltext nach benutzten Modulen zu durchsuchen. Module solltest du, der besseren Übersicht halber, immer am Anfang einbinden.

"use WWW::Shorten::TinyURL;" und "use WWW::Shorten 'TinyURL';". Ich sehe einige Beispiele bei google die das so machen. Der Sinn erschließt sich mir aber derzeit nicht. ;)

Code:
my $cmd = "wget -O $file -o wget.log $url";
my $out = `$cmd`;

my $p = XML::RSS::Parser->new;
my $fh = FileHandle->new($file);
my $feed = $p->parse_file($fh) or die $!."\n";
Ich würde hier nicht "wget" benutzen und den Kram auch nicht in eine Datei schreiben. Ist doch etwas umständlich.

Code:
use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new( GET => $url );
my $res = $ua->request( $req );

if ( ! $res->is_success ) { die $res->status_line ."\n"; }
my $out = $res->content;

my $p = XML::RSS::Parser->new;
my $feed = $p->parse_string($out) or die $!."\n";
Code:
    my $lastdate_unix;
    my $datetime_unix;
    # $lastdate zu unixtime umwandeln
    if($lastdate =~ /(\d+)\s(...)\s(\d+)\s(\d+):(\d+):(\d+)\s.../) {
        my $mday = $1;
        my $mname = $2;
        my $year = $3;
        my $hour = $4;
        my $minutes = $5;
        my $seconds = $6;
        my $month = $month_names{$mname};
        $lastdate_unix = timelocal($seconds, $minutes, $hour, $mday, ($month -1), $year);
    }

    # $datetime in unixtime umwandeln
    if($datetime =~ /(\d+)\s(...)\s(\d+)\s(\d+):(\d+):(\d+)\s.../) {
        my $mday = $1;
        my $mname = $2;
        my $year = $3;
        my $hour = $4;
        my $minutes = $5;
        my $seconds = $6;
        my $month = $month_names{$mname};
        $datetime_unix = timelocal($seconds, $minutes, $hour, $mday, ($month - 1), $year);
    }
Code:
use Date::Parse;

foreach my $i (@items_new) {
    
    # $lastdate zu unixtime umwandeln
    if($lastdate =~ /(\d+)\s(...)\s(\d+)\s(\d+):(\d+):(\d+)\s.../) {
       $lastdate_unix = str2time($lastdate);
    }

    # $datetime in unixtime umwandeln
    if($datetime =~ /(\d+)\s(...)\s(\d+)\s(\d+):(\d+):(\d+)\s.../) {
       $datetime_unix = str2time($datetime);        
    }
Alles auf die schnelle und ungetestet.

HTH

Micha
 
Seltsamerweise muss man die TinyURL-Module wohl so einbinden. Nutzt man nur eines von beiden, funktioniert's nicht. Den Rest deiner Tipps probiere ich nachher mal aus. Ich finde, da hast du doch 'ne Menge gefunden, was sich verbessern lässt. :)
 
Seltsamerweise muss man die TinyURL-Module wohl so einbinden. Nutzt man nur eines von beiden, funktioniert's nicht.

Code:
#!/usr/bin/env perl

use strict;
use warnings;

use WWW::Shorten::TinyURL;

my $short_url = makeashorterlink("http://www.openvas.org");
print $short_url;

mime@kira:~ %  perl tiny.pl
http://tinyurl.com/rrjbe
Funktioniert... ;)

Micha
 
Ich hatte es auch probiert und dann beschwerte er sich, dass die Funktion makeashorterlink nicht gefunden werden kann. Daraufhin probierte ich knapp 20 Minuten rum wo das Problem liegen könnte und fand dann die Beispiele im Web, die beide Einbindungsarten gleichzeitig benutzten, womit es dann auch funktionierte. Welche Perl- und welche Modul-Version nutzt du denn?
 
Zurück
Oben