homepage > Forum > Sviluppatori > Sender per Freebee FUNZIONANTE




Autore Messaggio
Inviato Venerdí 22 Agosto 2008, 17:22 
Avatar utente
Eccomi di nuovo qui. Ebbene cari amici, ce l'ho fatta. È la prima volta che programmo in Python, e sono orgoglioso di aver fornito a MoioSms questo Sender! :-)
Ecco il codice del file Freebee.py che dovete inserire in /usr/share/moiosms/moio/plugins/senders
Codice:
#!/usr/bin/python2.4
# -*- coding: utf-8 -*-
# Sender by Andrea Lazzarotto
# http://www.andrealazzarotto.com

import re
from cStringIO import StringIO

import pycurl

from moio.plugins.Sender import Sender
from moio.ConnectionManager import ConnectionManager
from moio.errors.SiteCustomError import SiteCustomError
from moio.errors.SiteConnectionError import SiteConnectionError
from moio.errors.SiteAuthError import SiteAuthError
from moio.errors.SenderError import SenderError

class Freebee(Sender):
    """Permette di spedire SMS dal sito Freebee.it"""
   
    maxLength = 110
    """Lunghezza massima del messaggio singolo inviabile da questo sito."""
   
    requiresRegistration = True
    """Questo plugin richiede nome utente e password?"""
   
    def isAvailable(self):
        """Ritorna true se questo plugin è utilizzabile."""
        return True
       
    def sendOne(self, number, text, username = None, password = None):
        """Spedisce un SMS con soli caratteri ASCII e di lunghezza massima maxLength
        con le credenziali specificate, supponendo Internet raggiungibile.
        """
        try:
            c = self.connectionManager.getCurl()
            c.setopt(pycurl.WRITEFUNCTION, self.doNothing)
            c.setopt(pycurl.POST, False)
           
            if number[:3] == "+39":
                number = number[3:]
            elif number[0]=="+":
                raise SiteCustomError(self.__class__.__name__,
                u"Questo sito permette di inviare SMS solo verso cellulari italiani.")

            self.connectionManager.forgetCookiesFromDomain("freebee.it")
           
            #Visito la pagina di login
            c.setopt(pycurl.URL, "http://www.freebee.it/login.asp")
            c.perform()

            #Faccio il login
            saver = StringIO()
            c.setopt(pycurl.WRITEFUNCTION, saver.write)
            c.setopt(pycurl.POST, True)
            postFields = {}
            postFields["username"] = username
            postFields["password"] = password
            c.setopt(pycurl.POSTFIELDS,
                self.codingManager.urlEncode(postFields))
            c.setopt(pycurl.URL, "http://www.freebee.it/areaUtenti/login.asp")
            c.perform()
           
            if (re.search("ultimo accesso", saver.getvalue()) is None):
                raise SiteAuthError(self.__class__.__name__)
                       
            #Visito la pagina degli SMS
            saver = StringIO()
            c.setopt(pycurl.WRITEFUNCTION, saver.write)
            c.setopt(pycurl.POST, False)
            c.setopt(pycurl.REFERER, "http://www.freebee.it/")
            c.setopt(pycurl.URL, "http://www.freebee.it/areaUtenti/invia_mess.asp")
            c.perform()
            savedPage = saver.getvalue()

            ident = re.search('id" type="hidden" value="([0-9]+)"', saver.getvalue()).group(1)
           
            #Pre-invio
            saver = StringIO()
           
            c.setopt(pycurl.WRITEFUNCTION, saver.write)
            c.setopt(pycurl.POST, True)

            mess = text
            pref = number[0:3]
            numero = number[3:]
            carat = 110-len(mess)
            somma = str(3)
            # Un numero a caso tra quelli possibili (ovvero tra 2 e 18 credo)

            postFields = {}
            postFields["prefisso"] = pref
            postFields["numero"] = numero
            postFields["messaggio"] = mess
            postFields["id"] = ident
            postFields["chr"] = str(carat)
            postFields["invia_con"] = 's1'
            postFields["BotBootInput_sms"] = somma
            postFields["spot"] = ''

            c.setopt(pycurl.POSTFIELDS,
                self.codingManager.urlEncode(postFields))

            c.setopt(pycurl.REFERER, "http://www.freebee.it/areaUtenti/invia_mess.asp")
            mess2 = mess.replace(' ', '%20')
            # Per poter inviare sms con gli spazi :-)

            indir = "http://89.97.62.74/public/sms-mms/Upload_sms_mms.asp?n="+numero+"&p="+pref+"&m="+mess2+"&id="+ident+"&t=s1&z="

            c.setopt(pycurl.URL, str(indir))
            c.perform()

            if (re.search("inviato correttamente", saver.getvalue(), re.I) is None):
                raise SenderError(self.__class__.__name__)

        except pycurl.error, e:
            errno, msg = e
            raise SiteConnectionError(self.__class__.__name__, self.codingManager.iso88591ToUnicode(msg))

Ricordatevi inoltre di abilitarlo nel file ___init___.py nella stessa directory.

Grazie. B-)

_________________
Sender originale per Freebee: http://is.gd/1seTE (non funziona più)
Sender funzionante per Jaxtr: http://is.gd/1seUc
Sender funzionante per Mjoy: http://is.gd/1seUt (portato per Moiosms 2.18)


Ultima modifica di Lazza su Venerdí 22 Agosto 2008, 17:47, modificato 1 volte in totale.

 
Inviato Venerdí 22 Agosto 2008, 17:26 
Avatar utente
A quanto sembra con certi simboli (forse il punto esclamativo e quello di domanda) non funziona. Uhm... strano. Be' dai, meglio di niente no? ;-)

_________________
Sender originale per Freebee: http://is.gd/1seTE (non funziona più)
Sender funzionante per Jaxtr: http://is.gd/1seUc
Sender funzionante per Mjoy: http://is.gd/1seUt (portato per Moiosms 2.18)


 
Inviato Venerdí 22 Agosto 2008, 17:33 
Avatar utente
Il problema è ben più grave... non lascia mandare sms con gli spazi. -.- Ora vedo come risolvere...

_________________
Sender originale per Freebee: http://is.gd/1seTE (non funziona più)
Sender funzionante per Jaxtr: http://is.gd/1seUc
Sender funzionante per Mjoy: http://is.gd/1seUt (portato per Moiosms 2.18)


 
Inviato Venerdí 22 Agosto 2008, 17:48 
Avatar utente
RISOLTO. Festeggiamo! :-)

_________________
Sender originale per Freebee: http://is.gd/1seTE (non funziona più)
Sender funzionante per Jaxtr: http://is.gd/1seUc
Sender funzionante per Mjoy: http://is.gd/1seUt (portato per Moiosms 2.18)


 
Inviato Domenica 24 Agosto 2008, 13:43 
in linux ho aggiunto senza problemi il sender ma in windows? c'è una cartella in cui sono presenti i vari sender o bisognerebbe ricompilare il .exe?
Grazie in anticipo


 
Inviato Domenica 24 Agosto 2008, 14:31 
Avatar utente
Andrebbe ricompilato.

_________________
Sender originale per Freebee: http://is.gd/1seTE (non funziona più)
Sender funzionante per Jaxtr: http://is.gd/1seUc
Sender funzionante per Mjoy: http://is.gd/1seUt (portato per Moiosms 2.18)


 
Inviato Domenica 31 Agosto 2008, 11:08 
Amministratore
Grazie Lazza, e complimenti per il risultato. Metto in lista la revisione e il testing per la 2.17b1, ovviamente se acconsenti di rilasciare il codice in licenza GPL :-)

_________________
"Things should be as simple as possible, but not any simpler" Einstein


 
Inviato Domenica 31 Agosto 2008, 12:58 
Avatar utente
Grazie mille a te. Aggiungo tre cose:
  1. Il codice può essere un po' snellito (c'è qualche copia di variabili che presumo si possa evitare)
  2. Con tre ritocchi credo si possa creare il sender FreebeeMMS
  3. Rilasciare il codice sotto Gpl è un onore e dovrebbe esserlo per tutti!
Quindi la risposta è... sì, provalo, torturalo, accettalo e piazza il mio nomino in piccolo insieme a quello degli altri. ;-)

_________________
Sender originale per Freebee: http://is.gd/1seTE (non funziona più)
Sender funzionante per Jaxtr: http://is.gd/1seUc
Sender funzionante per Mjoy: http://is.gd/1seUt (portato per Moiosms 2.18)


 
Inviato Sabato 20 Settembre 2008, 17:07 
Amministratore
OK, ho finalmente qualche minuto per la revisione.

Cose che non mi tornano e che vorrei che mi spiegassi:

Codice:
postFields["chr"] = str(carat)


E' necessario? Tipicamente non lo è. Funziona rimuovendo il parametro?

Stesso discorso per:

Codice:
postFields["spot"] = ''

postFields["invia_con"] = 's1'


e

Codice:
postFields["BotBootInput_sms"] = somma


In particolare per quest'ultimo: se è necessario, cosa vuol dire e perchè hai settato quel valore?

Codice:
mess2 = mess.replace(' ', '%20')


Altra cosa: quando si usano le espressioni regolari è buona norma inserire un blocco del tipo:

Codice:
try:
    savedPage = saver.getvalue()
    value = re.search('REGEXP', savedPage).group(1)
    except AttributeError:
                    raise SenderError(self.__class__.__name__)


cosicchè se MoioSMS non riesce a trovare la stringa (sintomo che la pagina è cambiata) ritorna un errore sensato all'utente e non si pianta.

Infine quel che tenti di fare qui:
Codice:
mess2 = mess.replace(' ', '%20')


è ricodificare la stringa nel formato x-www-form-urlencoded. C'è una funzione apposta nella libreria urllib:

Codice:
regina:Desktop silvio$ python
Python 2.4.4 (#1, Oct 18 2006, 10:34:39)
[GCC 4.0.1 (Apple Computer, Inc. build 5341)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib
>>> urllib.quote("ciao Lazza")
'ciao%20Lazza'


usa quella.

Aspetto tue notizie!

_________________
"Things should be as simple as possible, but not any simpler" Einstein


 
Inviato Sabato 20 Settembre 2008, 17:13 
Avatar utente
moio ha scritto:
Codice:
postFields["chr"] = str(carat)
E' necessario? Tipicamente non lo è. Funziona rimuovendo il parametro?
Stesso discorso per:
Codice:
postFields["spot"] = ''
postFields["invia_con"] = 's1'
e
Codice:
postFields["BotBootInput_sms"] = somma
In particolare per quest'ultimo: se è necessario, cosa vuol dire e perchè hai settato quel valore?

Sono necessari tutti i campi mi sembra, perché di sicuro uno dice "sms e non mms" e senza gli altri, che inizialmente avevo ignorato, non andava un tubo. La somma, non è altro che il captcha controllato. Dato però che è generato in Js, il controllo avviene lato client! :-) Quindi io semplicemente mando un valore lecito (da 2 a 18), in questo caso il 3, perché è bello, è il numero perfetto ed è il giorno del mio compleanno. Ih ih. :-D
moio ha scritto:
Infine quel che tenti di fare qui:
Codice:
mess2 = mess.replace(' ', '%20')
è ricodificare la stringa nel formato x-www-form-urlencoded. C'è una funzione apposta nella libreria urllib:
[...]
usa quella.
Be' ok, fai pure tu questa piccola modifica. ;-)

_________________
Sender originale per Freebee: http://is.gd/1seTE (non funziona più)
Sender funzionante per Jaxtr: http://is.gd/1seUc
Sender funzionante per Mjoy: http://is.gd/1seUt (portato per Moiosms 2.18)


 
Apri un nuovo argomento Rispondi all’argomento Vai alla pagina 1, 2, 3  Prossimo

cron