Poniższy skrypt Perlowy służy do pobierania najnowszych twitów (Tweets) użytkowników identyfikowanych poprzez ich screen_name. Twity są dopisywane do bazy, która jednocześnie pełni rolę pliku konfiguracyjnego. Przykładowo, aby twity użytkownika maly_wacek były dodane do bazy należy wpisać do niej wpis (w dowolnym miejscu, dla porządku najlepiej na początku):
INIT;maly_wacek;;INIT
Ściśle rzecz biorąc po pierwszym dodaniu do bazy, powyższy wpis jest już niepotrzebny, ale też nie przeszkadza. Baza jest zapisywana w taki sposób, że najnowszy tweet każdego użytkownika jest na końcu, zatem po przeczytaniu pliku, w wyniku przypisania $Users{$tmp[1]} = $tmp[0] (por. poniżej), hash %Users zawiera wszystkich użytkowników oraz id_str ich ostatnio pobranego twita. Zapewne niespecjalnie optymalny sposób archiwizacji, ale prosty i działa:
#!/usr/bin/perl
use Net::Twitter;
# Z UTF8 w Perlu jest zawsze problem:
use open ":encoding(utf8)";
use open IN => ":encoding(utf8)", OUT => ":utf8";
my $timelineBase = "timelines.log";
if ( -f "$timelineBase" ) {
open (BASE, $timelineBase) ||
die "Cannot open: $timelineBase";
while (<BASE>) { chomp();
@tmp = split /;/, $_;
$Users{$tmp[1]} = $tmp[0]; # last id_str
}
}
close (BASE) ;
## ### ####
open (BASE, ">>$timelineBase") ;
my $nt = Net::Twitter->new(legacy => 0);
my $nt = Net::Twitter->new(
traits => [qw/API::RESTv1_1/],
consumer_key => "######",
consumer_secret => "######",
access_token => "######",
access_token_secret => "######", );
foreach $user ( keys %Users ) {
my @message ; my $screen_name = $user ;
my $result ;
if ( $Users{$user} eq 'INIT' ) {
## max ile się da, wg dokumentacji 3200
$result = $nt->user_timeline({
screen_name => $screen_name, count=> '3200' })
}
else {
$result = $nt->user_timeline({
screen_name => $screen_name,
since_id => $Users{$user}, });
}
foreach my $tweet ( @{$result} ) {
$text_ = $tweet->{text} ;
$text_ =~ s/;/\,/g; $text_ =~ s/\n/ /g;
$date_ = $tweet->{created_at} ;
push ( @message, $tweet->{id_str} . ";" \
. "$screen_name;$date_;$text_" );
}
## Drukuj posortowane:
my $tweetsC;
foreach my $tweet ( sort (@message) ) {
$tweetsC++ ; print BASE $tweet . "\n"; }
if ( $tweetsC > 0 ) {
print STDERR "fetched $tweetsC for $screen_name\n"; }
}
close (BASE)
Uwaga: poprzez API można pobrać twity użytkowników, którzy zablokowali nam możliwość oglądania ich konta (inna sprawa po co oglądać takiego palanta).
Utworzenie aplikacji na apps.twitter.com
Należy się zalogować na stronie apps.twitter.com/. Kliknąć Create New App.
Wybrać Name (np. tprzechlewski.app), Description, Website i Callback URL.
Wybrać Keys and Access Tokens i pobrać wartości: Consumer Key oraz Consumer Secret.
Przewinąć zawartość strony i wybrać Create my access token. Zostaną wygenerowane Access Token oraz Access Token Secret, które także należy pobrać.
Na potrzeby wyżej opisanego skryptu to wystarczy. Pobrane wartości wstawiamy w miejsca oznaczone jako ######
Instalowanie Net::Twitter
Na jednym z moich komputerów ciągle działa dość archaiczna wersja Debiana Lenny:
$ cat /proc/version Linux version 2.6.32-5-kirkwood (Debian 2.6.32-30) $ cat /etc/issue Debian GNU/Linux 5.0 \n \l $ perl --version This is perl, v5.10.0 built for arm-linux-gnueabi-thread-multi Copyright 1987-2007, Larry Wall
Z poważnym obawami, że się uda spróbowałem:
cpan> install Net::Twitter Strange distribution name
Pomaga (por. tutaj):
cpan> install IO::AIO
Potem:
cpan> install YAML cpan> install Net::Twitter
Ściąga się milion pakietów. Przy testowaniu Net-HTTP-6.09 system zawisł na etapie t/http-nb.t (pomogło Ctr-C), ale finał był pomyślny, tj. Net::Twitter został zaistalowany.
Mój inny system jest już nowszy a instalacja Net::Twitter bezproblemowa:
$ cat /etc/issue Fedora release 21 (Twenty One) $ perl --version This is perl 5, version 18, subversion 4 (v5.18.4) built for x86_64-linux-thread-multi (with 25 registered patches, see perl -V for more detail) Copyright 1987-2013, Larry Wall $ yum install perl-Net-Twitter
Automatyzacja
Teraz wystarczy umieścić w crontab na przykład taki wpis:
# 48 min po północy codziennie 48 0 * * * /home/tomek/bin/twitter.sh
Co zawiera twitter.sh jest oczywiste
Dobrze jest to wszystko wiedzieć. Rewelacyjny wpis.
OdpowiedzUsuń