Znacząco poprawiłem swój tryb do dodawania zdjęć na flikr.com. Teraz wszystko się dzieje
wewnątrz Emacsa łącznie z uruchomieniem wysyłania plików na serwer. W starej wersji
pliki konfiguracyjne czytał Emacsowy moduł xml.el
co było może
i eleganckie ale odbywało się przeraźliwie wolno. W nowej wersji plik konfiguracyjny
jest plikiem lispowym wygenerowanym skryptem Perla z plików XML.
Jak to działa opisałem
na oddzielnej stronie.
Jedna sprawa jest tajemnicza:
#!/usr/bin/perl -w require 'login2flickr.rc'; require 'flickr_utils.rc'; my @tmpx = get_sets_ids(); my @tmpy = get_pools_ids();
W plikach login2flickr.rc
oraz flickr_utils.rc
są zdefiniowane
procedury, który czytają plik z dysku i zwracają zmienne. W szczególności
flickr_utils.rc
zawiera dwie prawie identyczne
procedury (get_sets_ids
oraz get_pools_ids
), czytające
różne pliki konfiguracyjne. Kurcze... na jednym komputerze perl zwraca błąd:
Undefined subroutine &main::get_pools_ids called at... a na drugim działa.
Ten sam perl, ta sama wersja FC5, jedna procedura z pliku dołączanego
poleceniem require
jest zdefiniowana druga nie...
Wystarczy zmienić kolejność poleceń require
żeby powyższe działało w obu systemach. Nic mi do głowy nie przychodzi...
Wymyśliłem lepsze rozwiązanie problemu
opisanego tutaj.
Ściągane strony są obrabiane ,,w locie'' a w pliku na dysku są zapisywane
tylko informacje o liczbie odsłon.
Mówiąc konkretniej korzystam z metod
store
/retrive
modułu Storable
,
zapisując/czytając hasz
postaci $PhotoLog{data}{photoid}= views
.
Generowaniem podsumowań zajmuje się inny skrypt, który wypisuje wyniki w postaci
dobrze sformatowanego fragmentu dokumentu HTML (,,opakowanego''
wewnątrz elementu <div>
).
Ten fragment następnie można wstawić w odpowiednie miejsce strony HTML.
Wreszcie ostatni skrypt tworzy wykres
liniowy (przy wykorzystaniu modułu GD::Graph
) liczby odsłon
oraz liczby odsłoniętych zdjęć. Trzy skrypty można połączyć w całość:
#!/bin/bash perl flick-store-views.pl if [ "$?" -ne "0" ] ; then echo "** Problems ..." ; exit 1 ; fi perl flick-report-views.pl -lang=pl -max=25 > 00-pl.phtml && \ perl flick-graph-views.pl if [ "$?" -ne "0" ] ; then echo "** Problems ..." ; exit 1 ; fi echo "OK"
Jakoś tak... Przykład wykorzystania
jest na tych stronach [1]
[2]
[3].
Skrypty można pobrać
stąd
(flick-store-views.pl,
flick-report-views.pl oraz
flick-graph-views.pl.)
Powyższe można nawet wsadzić do crona.
Skrypty wykorzystują m.in. moduły GD::Graph::lines
oraz
Storable
. Ten pierwszy musiałem doinstalować do mojej FC5.
Z tym był zresztą pewien kłopot ponieważ yum
nie zadziałał--nie
wiem czemu. Ostatecznie sprawę rozwiązało ,,ręczne'' ściągnięcie
perl-GDGraph-1.4307-1.fc5.noarch.rpm
,
perl-GDTextUtil-0.86-7.fc5.noarch.rpm
i perl-GD-2.35-1.fc5.i386.rpm
ze strony
rpm.pbone.net.
Przy okazji dowiedziałem się jak ,,porządnie'' wycentrować tabelę w oknie przeglądarki:
<table style='margin-left: auto; margin-right: auto;' ...
Łączną liczbę odsłon dla
wszystkich zdjęć -- por. poprzedni
wpis na ten temat -- można ustalić
programistycznie ściągając wszystkie strony albumu (mają one URLe
kończące się na pageliczba
, tj. page1
,
page2
, page3
, itp.). Pod miniaturą
każdej fotografii jest odpowiednia informacja. Zwykłe
LWP::Simple
w zupełności by do tego wystarczył:
use LWP::Simple; my $max_page = $ARGV[0] || 1; # nie podano ile -- ściągnij pierwszą $urlbase = "http://www.flickr.com/photos/tprzechlewski/page"; for ($p=1; $p =< $max_page; $p++ ) { $content = get($urlbase . $p ); die "Couldn't get it!" unless defined $content; print $content; }
Niech powyższy kod zapisano w ftotal.pl
.
Teraz można by np. ściągnąć wszystkie strony podając
ftotal.pl 161 > ftotal.log
a następnie wyłuskać odpowiednie
informacje z pliku ftotal.log
innym skryptem.
Ale... Ale jest jeden problem. Flickr słusznie nie liczy odsłon (zalogowanego) właściciela albumu. Skrypt nie autoryzuje dostępu i działa jako ,,osoba trzecia'' więc jednocześnie sztucznie nabija statystykę. Jeżeli skrypt byłby uruchamiany cyklicznie zmieniłby znacząco statystykę odsłon głównych stron w albumie. Przykładowo w moim przypadku byłoby to dodanie 161 odsłon, bo tyle liczy -- obecnie -- stron głównych mój album. Można by machnąć ręką, ale z drugiej strony jakby udało się skrypt zalogować...
Logowanie
do www.flickr.com
jest
jednak cokolwiek skomplikowane.
Kombinowałem na różne sposoby szukając w google albo gotowców albo
podpowiedzi. Pierwszym ,,podejrzanym''
był moduł WWW::Mechanize
:
#!/usr/bin/perl use WWW::Mechanize; my $mech = WWW::Mechanize->new( autocheck => 1 ); $mech->credentials( 'login' => 'password' ); $mech->get( 'http://www.flickr.com/photos/tprzechlewski/page1/' ); print $mech->content();
Nie działa... Próbowałem, też WWW::Mechanize::Shell
,
opisany przykładowo w tekście Michaela Schilli
Simple
Data Scraper
(tutaj
jest polskie tłumaczenie). BTW były pewne kłopoty z jego zainstalowaniem, ponieważ
make test
kończy się błędem...
Szukając wskazówek do rozwiązania mojego problemu
znalazłem także potencjalnie przydatny tekst pt.
Secure
Web site access with Perl. Podsumowując WWW::Mechanize
okazał
się strzałem w płot, ale może się przyda do czegoś innego...
Rozwiązanie znalazłem -- jak to często bywa -- trochę przypadkowo. Punktem wyjścia
były skrypty ze
strony: coder.home.cosmic-cow.net
(ich kopie
umieściłem tutaj).
Następnie posługując się wtyczką do Firefoxa pn. Live HTTP headers
ustaliłem co i gdzie trzeba zmienić.
Skrypt wykorzystuje moduły HTTP::Request::Common
i LWP::UserAgent
, koncepcyjnie jest mało skomplikowany ale dość rozwlekły
bo liczy ca 100 wierszy. Nie będę go więc cytował, jest dostępny
tutaj.
Nie do końca jestem też pewny czy wszystkie wywołania GET
są potrzebne, ale nie mam czasu/wiedzy tego optymalizować,
ważne że działa, tj. udaje zalogowanego
użytkownika serwisu flickr.
Skrypt działa w ten sposób, że ściąga n stron ,,głównych'' z mojego konta
flickr (te URLe przypominam kończą się na pageliczba
). Liczbę
n, podaną jako parametr wywołania skryptu,
ustalam ,,empirycznie'' konsultując
się z flickr.com (ewentualnie w wersji gold-extended skryptu można by to zautomatyzować):
perl flick-total-views.pl 161 > flick-total-views.log && \ perl -h flick-aggr-totals.pl flick-total-views.log > stats.html
Skrypt flick-aggr-totals.pl
zlicza
co trzeba parsując flick-total-views.log
.
Na razie pomija pliki, które nie były wcale oglądane (tj. 0 views),
ale to łatwo poprawić/zmienić, bo
kod HTML generowany przez www.flickr/ nie jest specjalnie zaplątany.
Wynik pierwszego zastosowanie ww. skryptów zamieściłem
na mojej stronie.