[Python] Mechanize e forum (di Ubuntu)

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

[Python] Mechanize e forum (di Ubuntu)

Messaggio 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! :pirata:
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: [Python] Mechanize e forum (di Ubuntu)

Messaggio 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.
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Python] Mechanize e forum (di Ubuntu)

Messaggio 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)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [Python] Mechanize e forum (di Ubuntu)

Messaggio 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.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Python] Mechanize e forum (di Ubuntu)

Messaggio da vaeVictis »

A questo non ci avevo pensato, Zoff.
Grazie per l'indicazione!
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Python] Mechanize e forum (di Ubuntu)

Messaggio 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 :)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [Python] Mechanize e forum (di Ubuntu)

Messaggio 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.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Python] Mechanize e forum (di Ubuntu)

Messaggio 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 :D
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).
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti