Pagina 1 di 1
[Python] Mechanize e forum (di Ubuntu)
Inviato: martedì 26 maggio 2015, 13:07
da vaeVictis
Ciao a tutti.
Sto usando il modulo mechanize di Python e ho due perplessità che vorrei chiarire prima di implementare una versione "definitiva" del codice.
La prima perplessità riguarda il login. Mi spiego meglio mostrando il codice.
Per selezionare la form del login e poi impostare username e password, uso il codice abbastanza banale:
Codice: Seleziona tutto
from mechanize import Browser
loginUrl = 'http://forum.ubuntu-it.org/ucp.php?mode=login'
br = Browser()
br.set_handle_robots(False)
response = br.open(loginUrl)
br.select_form(predicate=lambda f: f.attrs.get('id', None) == 'login')
br.form['username'] = "vaeVictis"
br.form['password'] = "************************"
br.submit()
La mia prima perplessità sorge dal fatto che id della form e nomi degli attributi username e password possono cambiare a seconda del forum. Per esempio l'id può essere login_form e via dicendo. Si può trovare "user" invece di "username"... e via dicendo.
Quindi mi sto chiedendo se esista un livello di astrazione che io non conosco, per poter gestire la variabilità del nome di questi parametri.
Supponiamo infatti che io voglia scrivere una funzione generica che mi faccia il login a un generico forum. Posso risolvere in qualche modo che al momento mi sfugge? L'unico modo che mi viene in mente è quello di "costruire" degli oggetti forum (con le loro variabili forum.loginID e via dicendo) e passarlo alla funzione. Ci sono altri modi?
La seconda perplessità è legata alla cancellazione dei messaggi privati, ma la espongo dopo che ho chiarito questo primo aspetto.
Grazie in anticipo!

Re: [Python] Mechanize e forum (di Ubuntu)
Inviato: mercoledì 27 maggio 2015, 1:11
da SuperStep
nella logica MVC, quando si crea una form che rispecchia un modello:
esempio in php:
Codice: Seleziona tutto
class User{
public $attributes['username','passowrd','other'];
...
}
puoi comporre la form utilizzando gli attributi del modello, magari anche specificando il tipo (un array chiave-valore), e quando devi creare la form, automaticamente estrapoli gli attributi per creare i campi.
Re: [Python] Mechanize e forum (di Ubuntu)
Inviato: mercoledì 27 maggio 2015, 1:30
da vaeVictis
Mmmmmmmmm... il mio problema avviene in lettura.
Nel senso che quegli attributi, appunto, cambiano di nome e posso avere pword al posto di password.
Dal momento che comporta una difficoltà aggiuntiva la gestione di questa lettura, e poiché anche se non molto tosta ma sempre di difficoltà si tratta, vorrei capire come muovermi... anche se temo che questo aspetto non sia proprio controllabile se non andando a vedere il sorgente della pagina di login ai forum e impostando i nomi degli attributi per ogni singolo forum (questa è la difficoltà aggiuntiva)
Re: [Python] Mechanize e forum (di Ubuntu)
Inviato: mercoledì 27 maggio 2015, 10:21
da Zoff
Volendo generalizzare io partirei dall'identificazione del form.
Mi sembra abbastanza generico e certo ipotizzare che nei form di login esista un solo campo input di tipo text e un solo campo input di tipo password (poi potranno esserci degli hidden, dei checkbox, etc...).
Azzarderei anche di supporre la relazione inversa, ovvero che la presenza di un solo campo text e un solo campo password identifichi un form come di login.
Detto questo basta cercare il form che rispecchia queste caratteristiche.
Re: [Python] Mechanize e forum (di Ubuntu)
Inviato: mercoledì 27 maggio 2015, 10:29
da vaeVictis
A questo non ci avevo pensato, Zoff.
Grazie per l'indicazione!
Re: [Python] Mechanize e forum (di Ubuntu)
Inviato: venerdì 29 maggio 2015, 17:46
da vaeVictis
Rieccomi

Allora, l'idea che mi hai suggerito, Zoff, in effetti è la soluzione. Senza che mi metto a postare il codice, la ricerca di un form con le "caratteristiche di un login" sembra funzionare su diversi siti.
Ora, però... si apre il problemone vero e proprio. Cerco di delinearlo brevemente.
Oltre al login... io ho un insieme di "azioni" che sono comuni per tutti i forum... ma le cui specifiche procedure differiscono da forum a forum.
Faccio un esempio "concreto": supponiamo di voler eliminare i messaggi privati della propria inbox. Tralasciando i dettagli di implementazione, questa procedura sarà differente a seconda del forum specifico... *analogamente* a come sono differenti i campi del login. Per questo forum, si devono "spuntare" i messaggi, poi si deve cliccare su "elimina selezionati" e poi si deve cliccare sulla conferma. Su altri forum, funziona diversamente.
Io mi sto pertanto chiedendo... che pattern creazionale è consigliabile seguire quando si devono implementare un insieme di azioni (cancellazione messaggi, download messaggi, ricerca messaggi... e via dicendo) comuni a tutti gli oggetti (oggetti di tipo forum) ma che prevedono "differenti azioni" a seconda della particolare istanza dell'oggetto (forumUbuntu, forumPython, forumTizio, forumCaio...)?
Spero di essere stato chiaro

Re: [Python] Mechanize e forum (di Ubuntu)
Inviato: sabato 30 maggio 2015, 0:47
da crap0101
una soluzione potrebbe essere avere una classe base in cui metti i metodi standard (anche non implementati) e gli attributi principali e una serie di classi che implementano un tipo specifico di login e altre operazioni che sono caratteristiche del sito, tipo
Codice: Seleziona tutto
class Forum:
..
username = ...
password = ***
altra_roba = ???
def login():
..
def cancella_messaggi():
..
class ForumUbuntu (Forum):
...
def cancella_messaggi():
# implementazione specifica per questo forum
in modo che il codice utente che utilizza il tuo modulo fa le operazioni che deve indipendentemente dal forum a cui si è collegato. Ovviamente ci possono essere differenze a livello di funzionalità tra forum e forum per cui operazioni possibili su uno non lo sono su un altro, ma in questo caso non ci puoi fare niente.
Re: [Python] Mechanize e forum (di Ubuntu)
Inviato: sabato 30 maggio 2015, 20:15
da vaeVictis
Ciao crap0101, grazie per l'interessamento
In questi giorni di monastica riflessione, stavo pensando di implementare "buttandomi" e usando una abstract factory.
Appena ho implementato un po' di pseudocodice, te lo posto.
Per questo aspetto
crap0101 ha scritto:Ovviamente ci possono essere differenze a livello di funzionalità tra forum e forum per cui operazioni possibili su uno non lo sono su un altro, ma in questo caso non ci puoi fare niente.
... diciamo che è l'unico che mi è ben chiaro

A parte le battute, stavo pensando di usare una abstract factory e una try/except nelle funzioni, di modo che se per caso una funzione non esiste per un "tipo di forum", mi viene sollevata un'eccezione e decido come gestirla (soprattutto perché il programma dovrebbe prevedere un utilizzo tramite interfaccia grafica).