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).
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 ######
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
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