Pagina 1 di 1

[Risolto] [Python] Eliminare messaggi inbox con mechanize

Inviato: martedì 9 ottobre 2012, 2:15
da vaeVictis
Ciao a tutti.
Come ormai si sarà capito, sto facendo uno script per gestire alcune funzioni della inbox senza doverlo fare manualmente.

Mi sono imbattuto nell'ennesimo problema al di fuori della mia portata.
Vorrei capire come eliminare determinati messaggi dalla casella:

Codice: Seleziona tutto

http://forum.ubuntu-it.org/ucp.php?i=pm&folder=outbox
Ho fatto alcune ricerche in rete, ma senza ottenere nulla di utile.
Per il momento, ho fatto il login in questo modo:

Codice: Seleziona tutto

>>> import mechanize
>>> br = mechanize.Browser()
>>> br.set_handle_robots(False)
>>> br.open("http://forum.ubuntu-it.org/ucp.php?i=pm&folder=outbox")
<response_seek_wrapper at 0x177b440 whose wrapped object = <closeable_response at 0x1776b90 whose fp = <socket._fileobject object at 0x1706cd0>>>
>>> for form in br.forms():
...     if form.attrs['id'] == 'login':
...             br.form = form
...             break
... 
>>> br['username'] = 'vaeVictis'
>>> br['password'] = 'password'
>>> br.submit()
<response_seek_wrapper at 0x177b3b0 whose wrapped object = <closeable_response at 0x1789908 whose fp = <socket._fileobject object at 0x178e150>>>
e il form utile allo scopo è il secondo di questa lista:

Codice: Seleziona tutto

>>> for form in br.forms():
...     print form
... 
<GET http://forum.ubuntu-it.org/search.php application/x-www-form-urlencoded
  <TextControl(keywords=Cerca nel forum...)>>
<POST http://forum.ubuntu-it.org/ucp.php?i=pm&mode=view&action=view_folder&f=-2 application/x-www-form-urlencoded
  <CheckboxControl(marked_msg_id[]=[193493])>
  <SelectControl(export_option=[*CSV, CSV_EXCEL, XML])>
  <SubmitControl(submit_export=Vai) (readonly)>
  <SelectControl(mark_option=[*mark_important, delete_marked])>
  <SubmitControl(submit_mark=Vai) (readonly)>
  <SelectControl(st=[*0, 1, 7, 14, 30, 90, 180, 365])>
  <SelectControl(sk=[*t, s])>
  <SelectControl(sd=[a, *d])>
  <SubmitControl(sort=Vai) (readonly)>
  <HiddenControl(cur_folder_id=-2) (readonly)>>
Quello che non riesco a fare (se ho capito cosa devo fare) è marcare tutti i messaggi in CheckboxControl, anche se in questo caso ne compare solo uno, marcare poi "delete_marked" in SelectControl, e quindi fare il submit.
... ma non ci riesco :)

Come al solito, grazie in anticipo per l'attenzione.
Ciao.

p.s.
Questa è la analoga form (con aggiunta finale di chiavi e valori di form.attrs), ma della cartella inbox, che contiene più messaggi:

Codice: Seleziona tutto

<POST http://forum.ubuntu-it.org/ucp.php?i=pm&mode=view&action=view_folder&f=0 application/x-www-form-urlencoded
  <CheckboxControl(marked_msg_id[]=[194782, 194736, 194732, 194729, 194727, 194558, 194555, 194553, 194552, 194545, 194532, 194384, 194374, 194372, 194370, 194368, 194341, 194310, 194291, 194288, 194280, 194279, 194274, 194272, 194267, 194263, 194261, 194259, 194256, 194252])>
  <SelectControl(export_option=[*CSV, CSV_EXCEL, XML])>
  <SubmitControl(submit_export=Vai) (readonly)>
  <SelectControl(mark_option=[*mark_important, delete_marked])>
  <SubmitControl(submit_mark=Vai) (readonly)>
  <SelectControl(st=[*0, 1, 7, 14, 30, 90, 180, 365])>
  <SelectControl(sk=[a, *t, s])>
  <SelectControl(sd=[a, *d])>
  <SubmitControl(sort=Vai) (readonly)>
  <HiddenControl(cur_folder_id=0) (readonly)>>
action :  ./ucp.php?i=pm&mode=view&action=view_folder&f=-2
id :  viewfolder
method :  post

Re: [Python] Eliminare messaggi inbox con mechanize

Inviato: martedì 9 ottobre 2012, 3:04
da vaeVictis
Faccio presente che per il momento, per eliminare il singolo messaggio della outbox, ho proceduto in questo modo (che non ha sortito l'effetto sperato):

1) spunto il messaggio (l'unico):

Codice: Seleziona tutto

>>> br.find_control("marked_msg_id[]").items[0].selected=True
e spunto "delete_marked"

Codice: Seleziona tutto

br.find_control("mark_option").items[1].selected=True
ottenendo:

Codice: Seleziona tutto

>>> for form in br.forms():
...     print form
... 
<GET http://forum.ubuntu-it.org/search.php application/x-www-form-urlencoded
  <TextControl(keywords=Cerca nel forum...)>>
<POST http://forum.ubuntu-it.org/ucp.php?i=pm&mode=view&action=view_folder&f=-2 application/x-www-form-urlencoded
  <CheckboxControl(marked_msg_id[]=[*193493])>
  <SelectControl(export_option=[*CSV, CSV_EXCEL, XML])>
  <SubmitControl(submit_export=Vai) (readonly)>
  <SelectControl(mark_option=[mark_important, *delete_marked])>
  <SubmitControl(submit_mark=Vai) (readonly)>
  <SelectControl(st=[*0, 1, 7, 14, 30, 90, 180, 365])>
  <SelectControl(sk=[*t, s])>
  <SelectControl(sd=[a, *d])>
  <SubmitControl(sort=Vai) (readonly)>
  <HiddenControl(cur_folder_id=-2) (readonly)>>
Applico il submit, specificando "submit_mark" come parametro name:

Codice: Seleziona tutto

>>> br.submit(name='submit_mark')
<response_seek_wrapper at 0x1a70290 whose wrapped object = <closeable_response at 0x1b72680 whose fp = <socket._fileobject object at 0x1a7ee50>>>
>>> br.submit(name='submit_mark')
... ma i messaggi non vengono eliminati :(

Re: [Python] Eliminare messaggi inbox con mechanize

Inviato: martedì 9 ottobre 2012, 3:15
da vaeVictis
Sono un idiota... scusate per la discussione inutile.
Dopo aver spuntato i messaggi e chiesta la cancellazione... va data l'ulteriore conferma, in quanto questo è il form associato a 'id' = 'confirm'

Codice: Seleziona tutto

>>> print br.form
<POST http://forum.ubuntu-it.org/ucp.php?i=pm&mode=view&action=view_folder&f=-2&confirm_key=7F3A3R03B3 application/x-www-form-urlencoded
  <HiddenControl(cur_folder_id=-2) (readonly)>
  <HiddenControl(mark_option=delete_marked) (readonly)>
  <HiddenControl(submit_mark=1) (readonly)>
  <HiddenControl(marked_msg_id[0]=193493) (readonly)>
  <HiddenControl(confirm_uid=168762) (readonly)>
  <HiddenControl(sess=7ee98f886c64318aa1dcd7af13027833) (readonly)>
  <HiddenControl(sid=7ee98f886c64318aa1dcd7af13027833) (readonly)>
  <SubmitControl(confirm=Sì) (readonly)>
  <SubmitControl(cancel=No) (readonly)>>
Pertanto ho notato che dando il comando:

Codice: Seleziona tutto

br.submit(name='confirm')
il messaggio nella outbox è stato correttamente cancellato.

Non riesco però a capire, motivo per cui lascio aperta la discussione, come si fa a spuntare più di un messaggio.
In questo caso nella outbox c'era un solo messaggio... ma quando ce ne è un numero arbitrario... come si fa?

Re: [Python] Eliminare messaggi inbox con mechanize

Inviato: martedì 9 ottobre 2012, 3:23
da vaeVictis
Niente... sono un idiota al quadrato.
Si marcano così...

Codice: Seleziona tutto

>>> for item in br.find_control("marked_msg_id[]").items:
...     item.selected=True
Metto risolto alla discussione.
Se qualcuno (oltre a voler farmi notare che sono un babbeo) volesse suggerire metodi alternativi... si faccia pure avanti :D

Scusate per la discussione inutile.
Ciao.