Newsgroup: it.comp.os.linux.development
Titolo: Foto automatiche a siti internet

Ciao
avrei la necessita di automatizzare l'inserimento di alcuni siti in una 
base di dati. Serve l'indirizzo, la descrizione inserita a mano, la data 
in automatico, e una immagine "significativa".
Quindi ho due problemi:
come faccio a recuperare la foto di un sito automaticamente?
come faccio a fare una foto "significativa" (non durante un preload ad 
esempio..)?
In realtà mi hanno chiesto un sistema che permetta in maniera molto 
semplice ed automatica di fare più foto ad un sito, il che complica 
enormemente le cose, visto che la maggior parte dei siti inseriti sarà 
in flash.
La mia idea, è quella di crearmi un piccolo programma che con un click 
fa la foto e la apre in una finestrella, e poi magari la trascino in una 
applicazione sulla scheda del sito, e una volta raccolte tutte le foto, 
allora esegue una query sulla base di dati, ma avete suggerimenti su 
librerie e software già pronti?
Ovviamanete il sistema deve girare su una distribuzione desktop di 
linux, probabilmente debian
grazie!
FF

la butto li':
tiri su una sessione di X con vfb , apri mozilla facendolo puntare al sito ,
usi sleep x aspettare che il sito sia caricato , fai uno screenshot della
sessione virtuale e poi tagli quello che ti interessa con imagemagick .
un po' dispersivo di risorse ma dovrebbe funzionare.
ciao.
-- 
                In questa shell e' severamente vietato fumare.

 
E' che purtroppo proprio questa mattina ho saputo che bisogna fare più 
foto al sito (che è sempre in flash) e che tali foto devono essere 
scelte, quindi c'è ben poco da fare, bisogna farle a mano.
A questo punto cercherò di creare un piccolo programma che mi permette 
di fare le foto dell'interno di una finestra. Una cosa del tipo:
il programma carica un sito da processare, e con dei ulsanti, ti chiede 
di fare delle foto magari con un click sulla finestra, e poi una volta 
fatte tutte le foto, allora con un altro pulsante permette l'inserimento 
nella base di dati.
Che libreria posso usare per fare foto ad una finestra? Tenete presente 
che il browser è firefox, e il desktop manager è KDE, quindi se 
esistesse qualche libreria QT.
Grazie!

 esistesse qualche libreria QT.
spulcia i sorgenti di ksnapshot , fa' esattamente quello che vuoi.
-- 
Ama il prossimo tuo come te stesso, ma scegli accuratamente il tuo prossimo.
                -- Louise Beal

 esistesse qualche libreria QT.
puoi anche usare xwd per dumpare il contenuto di una finestra, č un
approccio meno elegante ma piů 'veloce', almeno per te che devi programmare
l'accrocchio.
-- 
none

 
Lo credevo anche io, ma se scelgo di salvare la finestra, allora salva 
anche le barre dei menu di firefox. L'unica soluzione sarebbe quella di 
salvare le immagini come regioni, ma questa è troppo lungo, vogliono 
qualche cosa di più automatico, e vogliono le foto tutte delle stesse 
dimensioni.
A dire la verità lo vorrebbero pure web based funzionante direttamente 
via browser, ma allora tanto vale metterci pure il riconoscimento vocale 
per non digitare neanche l'indirizzo, o meglio ancora che scelga pure i 
siti da solo e ci mette i più belli :-o !
Francamente non ho nessuna idea, e non credo che si possa fare..
Grazie comunque!
FF

 per non digitare neanche l'indirizzo,
$$$!
 > o meglio ancora che scelga pure i
 > siti da solo e ci mette i più belli :-o !
 >
I gusti son gusti...
Alessandro.

 dimensioni.
questo non è assolutamente un problema... anzi
Premesso che x il mio test ho usato opera, comunque guarda se questa idea ti
aggrada...
Supponendo di non voler usare xnest (che è cmq 1 buona opzione):
#!/bin/sh
BROWSER="opera"
BARHEIGHT="100"
TESTURL="
www.google.it
"
SHOTNAME="blah.jpeg"
DELAY=3
echo "Invoking browser..."
$BROWSER -remote "openURL($TESTURL)" >& /dev/null &
echo "Waiting..."
sleep 15
tmp=""
while([ "$tmp" == "" ]); do
        echo "Determining window ID and GEOMETRY"
        tmp="$(xwininfo -root -tree | grep -i "$BROWSER" | tail -1 | awk
'{print $1" "$(NF-1)}')"
        sleep 1
done
ID="$(echo $tmp | awk '{print $1}')"
GEOMETRY="$(echo $tmp | awk '{print $2}')"
GEOMETRY="$(echo $GEOMETRY | sed -e 's/+[[:digit:]]*$/+'$BARHEIGHT'/')"
echo "Be sure that your browser window is focused... Waiting $DELAY seconds"
sleep $DELAY
echo "Shot!"
import -window "$ID" -crop "$GEOMETRY" "$SHOTNAME"
echo "Done."
BARHEIGHT sarebbe la dimensione della barra di navigazione+barra url del tuo
browser, con qualche prova la puoi determinare in modo abbastanza semplice.
Lo script invoca tutte le volte il browser, tu ovviamente puoi farne a meno
ed utilizzare una istanza già aperta, l'importante è sgamare sempre l'id
dell'ultimo child ritornato da xwininfo (almeno con opera funziona
così...).
Se non fai il resize della finestra del browser le foto avranno tutte la
stessa dimensione, che viene determinata automaticamente dallo script.
Ciao
-- 
none

 ti aggrada...
mi auto-correggo, ho provato anche con firefox e ho deciso di cambiare un
paio di opzioncine e di correggere 1 cagata che avevo dimenticato (cioè
sottrarre dall'altezza dell'immagine il valore di barheight)
Ho aggiunto anche la possibilità di togliere una eventuale status bar sotto
la pagina.
BARHEIGHT quindi è l'altezza in pixel della barra del browser, compresa
quella dove scrivi l'url
STATUSHEIGHT è l'altezza in pixel della status bar sotto la pagine.
Questo script non invoca più il browser
#!/bin/sh
BROWSER="firefox-bin"
BARHEIGHT=120
STATUSHEIGHT=20
#BROWSER="opera"
#BARHEIGHT=100
#STATUSHEIGHT=0
TESTURL="
www.google.it
"
SHOTNAME="blah.jpeg"
DELAY=3
tmp=""
while([ "$tmp" == "" ]); do
        echo "Determining window ID and GEOMETRY"
        tmp="$(xwininfo -root -tree | grep -i "$BROWSER" | tail -1 | awk
'{print $1" "$(NF-1)}')"
        sleep 1
done
ID="$(echo $tmp | awk '{print $1}')"
GEOMETRY="$(echo $tmp | awk '{print $2}')"
GEOMETRY_W="$(echo $GEOMETRY | cut -d x -f 1)"
GEOMETRY_H="$(echo $GEOMETRY | cut -d x -f 2 | cut -d + -f 1)"
GEOMETRY_X="$(echo $GEOMETRY | cut -d + -f 2)"
GEOMETRY_Y="$(echo $GEOMETRY | cut -d + -f 3)"
GEOMETRY_H=$[GEOMETRY_H-BARHEIGHT]
GEOMETRY_Y=$[GEOMETRY_Y+BARHEIGHT]
GEOMETRY_H=$[GEOMETRY_H-STATUSHEIGHT]
GEOMETRY="${GEOMETRY_W}x${GEOMETRY_H}+${GEOMETRY_X}+${GEOMETRY_Y}"
echo "Be sure that your browser window is focused... Waiting $DELAY seconds"
sleep $DELAY
echo "Shot!"
echo "DEBUG params: -window $ID -crop $GEOMETRY $SHOTNAME"
import -window "$ID" -crop "$GEOMETRY" "$SHOTNAME"
echo -e "Output written to $SHOTNAME.\nDone."
ariciao
-- 
none

 
E' perfetta! non ho mai lavorato con gli script, solo c e c++, ma ho 
capito come funziona e già aggiunto il parametro per togliere la 
scrollbar. Ora aumento il numero di parametri per la qualità delle 
immagini la miniatura il formato, ecc.. se ti interessa poi lo possiamo 
pure pubblicare (non è richiesto che i sorgenti siano chiusi).
Poi lo integro con script per inviare direttamente l'immagine via FTP, e 
che esegue query sulla base di dati.
Non esiste che tu sappia un sistema per dare il focus alla finestra? 
Domani al lavoro ci provo un pò
Ciao e grazie!
FF

 Non esiste che tu sappia un sistema per dare il focus alla finestra?
ho fatto qualche prova anche io, purtroppo non riesco (forse per qualche
impostazione del mio wm) a dare il focus ad una finestra qualsiasi, ottengo
solo un blinkamento nella barra delle applicazioni... Si riesce solo ad
abbassare le finestrella della shell e a farla ricomparire.
Quindi, supponendo di avere sotto la finestra della shell il browser:
------- integra allo script che hai modificato
WINID="$(./winlower)"
sleep $DELAY
echo "Shot!"
echo "DEBUG params: -window $ID -crop $GEOMETRY $SHOTNAME"
import -window "$ID" -crop "$GEOMETRY" "$SHOTNAME"
echo -e "Output written to $SHOTNAME.\nDone."
./winraise "$WINID"
------------------ 
winlower e winraise sono programmetti in C, fatti più o meno così (nota,
sono scritti molto "ad cazzum", non avevo mai usato le xlib)
------ winraise.c
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main(int argc, char *argv[]){
Display* display;
Window win;
char *display_name=getenv("DISPLAY");
if (argc!=2){
        fprintf(stderr,"Usage:\n\t%s win-id\n",argv[0]);
        exit(1);
}
display=XOpenDisplay(display_name);
if(display==NULL){
        fprintf(stderr,"Cannot connect to X server '%s'\n",display_name);
        exit(1);
}
win=strtol(argv[1],NULL,0);
XMapWindow(display,win);
XRaiseWindow(display,win);
XFlush(display);
XCloseDisplay(display);
}
---------- eof winraise.c
--------- winlower.c
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main(){
Display* display;
Window win;
int rtr;
char *display_name=getenv("DISPLAY");
display=XOpenDisplay(display_name);
if(display==NULL){
        fprintf(stderr,"Cannot connect to X server '%s'\n",display_name);
        exit(1);
}
XGetInputFocus(display,&win,&rtr);
XLowerWindow(display,win);
XFlush(display);
XCloseDisplay(display);
printf("0x%x\n",win);
}
----------- eof winlower.c
gcc -o winraise winraise.c -L/usr/X11R6/lib -lX11
ecc.
Ciao
-- 
none