Exemple #1
0
 def isAvailable(self):
     """Ritorna true se questo plugin è utilizzabile."""
     #Deve essere disponibile un qualunque CaptchaDecoder
     return AskUserCaptchaDecoder.getInstance().isAvailable()
Exemple #2
0
    def sendOne(self, number, text, dati=None, ui=None):
        """Spedisce un SMS con soli caratteri ASCII e di lunghezza massima
        maxLength con le credenziali specificate, supponendo Internet
        raggiungibile."""

        try:
            #Costruisco un nuovo oggetto Curl e lo inizializzo
            c = self.connectionManager.getCurl()

            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."
                )

            #Assegna le variabili standard
            username = dati['Nome utente']
            password = dati['Password']

            c.setopt(pycurl.URL, "http://www.tim.it")
            self.perform(self.stop)

            if ui: ui.gaugeIncrement(self.incValue)

            #Faccio il login
            saver = StringIO()
            c.setopt(pycurl.POST, True)
            postFields = {}
            postFields["urlOk"] = "https://www.tim.it/119/consumerdispatcher"
            postFields["portale"] = "timPortale"
            postFields["login"] = username
            postFields["password"] = password
            c.setopt(pycurl.POSTFIELDS,
                     self.codingManager.urlEncode(postFields))
            c.setopt(pycurl.URL, "https://www.tim.it/authfe/login.do")
            self.perform(self.stop, saver)
            self.checkForErrors(saver.getvalue())

            if ui: ui.gaugeIncrement(self.incValue)

            c.setopt(pycurl.URL,
                     "https://smsweb.tim.it/sms-web/adddispatch?start=new")
            saver = StringIO()
            self.perform(self.stop, saver)
            self.checkForErrors(saver.getvalue())

            try:
                formdata1 = re.search(
                    '(?<=(name="addDispatchForm"><div class="t-invisible"><input name="t:formdata" type="hidden" value="))[^"]+',
                    saver.getvalue()).group(0)
                formdata2 = re.search(
                    '(?<=(seperateFreeNumbers:hidden" name="t:formdata" type="hidden" value="))[^"]+',
                    saver.getvalue()).group(0)
            except AttributeError:
                raise SenderError(self.__class__.__name__)

            try:
                jsession = re.search(
                    '(?<=(adddispatch.adddispatchform;jsessionid=))[^"]+',
                    saver.getvalue()).group(0)
            except:
                jsession = None

            if ui: ui.gaugeIncrement(self.incValue)

            postFields = {}
            postFields["t:formdata"] = formdata2
            postFields["recipientType"] = 'FREE_NUMBERS'
            postFields["freeNumbers"] = number
            postFields["textAreaStandard"] = text
            postFields["deliverySmsClass"] = 'STANDARD'
            postdata = self.codingManager.urlEncode(postFields)+"&"+\
                       urllib.urlencode({"t:formdata":formdata1})
            c.setopt(pycurl.POSTFIELDS, postdata)
            c.setopt(pycurl.POST, True)
            url = "https://smsweb.tim.it/sms-web/adddispatch.adddispatchform"
            if jsession: url += ";jsessionid=" + jsession
            c.setopt(pycurl.URL, url)
            saver = StringIO()
            self.perform(self.stop, saver)
            self.checkForErrors(saver.getvalue())

            try:
                formdata = re.search(
                    '(?<=(value="Dispatch"></input><input name="t:formdata" type="hidden" value="))[^"]+',
                    saver.getvalue()).group(0)
            except AttributeError:
                raise SenderError(self.__class__.__name__)

            captchaBroken = False
            while captchaBroken == False:
                postFields = {}
                try:
                    saver = StringIO()
                    c.setopt(pycurl.POST, False)
                    c.setopt(
                        pycurl.URL,
                        "https://smsweb.tim.it/sms-web/validatecaptcha:image/false?t:ac=Dispatch"
                    )
                    self.perform(self.stop, saver)
                    #postFields["verificationCode"] = CaptchaDecoder.getBestPlugin().decodeCaptcha(saver, self.__class__.__name__)
                    postFields[
                        "verificationCode"] = AskUserCaptchaDecoder.getInstance(
                        ).decodeCaptcha(saver, self.__class__.__name__)
                except CaptchaError:
                    raise SenderError(self.__class__.__name__)

                if not postFields["verificationCode"]:
                    raise SiteCustomError(
                        self.__class__.__name__,
                        u"Captcha non inserito. Invio interrotto.")

                postFields["t:formdata"] = formdata
                postFields["t:ac"] = "Dispatch"
                c.setopt(pycurl.POSTFIELDS,
                         self.codingManager.urlEncode(postFields))
                c.setopt(pycurl.POST, True)
                c.setopt(
                    pycurl.URL,
                    "https://smsweb.tim.it/sms-web/validatecaptcha.validatecaptchaform"
                )
                saver = StringIO()
                self.perform(self.stop, saver)

                if not re.search(
                        u"Le lettere che hai inserito non corrispondono a quelle presenti nell'immagine",
                        saver.getvalue()):
                    captchaBroken = True

            self.checkForErrors(saver.getvalue())

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

        except pycurl.error, e:
            errno, msg = e
            raise SiteConnectionError(
                self.__class__.__name__,
                self.codingManager.iso88591ToUnicode(msg))
Exemple #3
0
 def isAvailable(self):
     """Ritorna true se questo plugin è utilizzabile."""
     return AskUserCaptchaDecoder.getInstance().isAvailable()
Exemple #4
0
    def sendOne(self, number, text, dati = None, ui = 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()

            #Assegna le variabili standard
            username = dati['Nome utente']
            password = dati['Password']

            #Ammazzo i vecchi cookie
            self.connectionManager.forgetCookiesFromDomain("alice.it")

            #Faccio il login
            saver = StringIO()
            c.setopt(pycurl.POST, True)
            postFields = {}
            postFields["URL_OK"] = "http://portale.rossoalice.alice.it/ps/HomePS.do?area=posta&settore=sms"
            postFields["URL_KO"] = "http://portale.rossoalice.alice.it/ps/ManageCodError.do?channel=mail_ra&area=posta&settore=sms"
            postFields["usr"] = username
            postFields["channel"] = "mail_ra"
            postFields["login"] = username + "@alice.it"
            postFields["password"] = password
            c.setopt(pycurl.POSTFIELDS,
                self.codingManager.urlEncode(postFields))
            c.setopt(pycurl.URL,
                "http://authsrs.alice.it/aap/validatecredential")
            self.perform(self.stop, saver)
            if ((re.search(u'non sono corretti', saver.getvalue()) is not None) or
               (re.search(u"utenza inserita al momento non ", saver.getvalue()) is not None) or
               (re.search(u"Riprova pi&ugrave; tardi ad accedere ad Alice Mail e servizi.", saver.getvalue()) is not None)):
                raise SiteAuthError(self.__class__.__name__)
            if ui: ui.gaugeIncrement(self.incValue)

            c.setopt(pycurl.URL, "http://auth.rossoalice.alice.it/aap/serviceforwarder?sf_dest=click_to_send_sms&ID_Value=&ID_Field=mobilphone")
            self.perform(self.stop)

            saver = StringIO()
            c.setopt(pycurl.URL, "http://webloginmobile.rossoalice.alice.it/alice/jsp/SMS/composer.jsp?ID_Field=0&ID_Value=0&id_clickto=0&dummy=dummy")
            self.perform(self.stop, saver)

            #Patch di Laurento Frittella
            if (re.search("L'invio dell'SMS ad ogni destinatario ha un costo di", saver.getvalue()) is not None):
                raise SiteCustomError(self.__class__.__name__, u"Sono esauriti gli SMS gratuiti di oggi.")

            if ui: ui.gaugeIncrement(self.incValue)

            #Spedisco l'SMS
            postFields = {}
            postFields["DEST"] = number
            postFields["TYPE"] = "smsp"
            postFields["SHORT_MESSAGE2"] = text
            postFields["SHORT_MESSAGE"] = text
            postFields["INVIA_SUBITO"] = "true"

            c.setopt(pycurl.URL, "http://webloginmobile.rossoalice.alice.it/alice/jsp/SMS/CheckDest.jsp")
            c.setopt(pycurl.POSTFIELDS,
                self.codingManager.urlEncode(postFields))
            self.perform(self.stop)

            c.setopt(pycurl.URL, "http://webloginmobile.rossoalice.alice.it/alice/jsp/SMS/inviaSms.jsp")
            c.setopt(pycurl.POSTFIELDS,
                self.codingManager.urlEncode(postFields))
            self.perform(self.stop)

            if ui: ui.gaugeIncrement(self.incValue)

            saver = StringIO()
            c.setopt(pycurl.POST, False)
            c.setopt(pycurl.REFERER, "http://webloginmobile.rossoalice.alice.it/alice/jsp/SMS/inviaSms.jsp")
            c.setopt(pycurl.URL, "http://webloginmobile.rossoalice.alice.it/alice/jsp/EwsJCaptcha.jpg")
            self.perform(self.stop, saver)
            if saver.getvalue() == "":
                raise SiteCustomError(self.__class__.__name__, u"Il sito non è disponibile, riprova più tardi.")

            if ui: ui.gaugeIncrement(self.incValue)

            postFields = {}
            postFields["DEST"] = number
            postFields["TYPE"] = "smsp"
            postFields["SHORT_MESSAGE2"] = text
            postFields["SHORT_MESSAGE"] = text
            postFields["INVIA_SUBITO"] = "true"
            try:
                postFields["captchafield"]=AskUserCaptchaDecoder.getInstance().decodeCaptcha(saver, self.__class__.__name__)
            except CaptchaError: print "An error occurred while trying to decode captcha"
            c.setopt(pycurl.POST, True)
            c.setopt(pycurl.POSTFIELDS,
                  self.codingManager.urlEncode(postFields))
            saver = StringIO()
            c.setopt(pycurl.URL, "http://webloginmobile.rossoalice.alice.it/alice/jsp/SMS/inviaSms.jsp")
            self.perform(self.stop, saver)
            if (re.search("Attenzione!&nbsp;I&nbsp;caratteri&nbsp;inseriti&nbsp;non&nbsp;sono&nbsp;corretti.",
                saver.getvalue()) is not None):
                raise SiteCustomError(self.__class__.__name__, u"I caratteri inseriti non sono corretti.")

            if (re.search(
                "&Egrave; possibile inviare gratuitamente fino a 10 SMS al giorno",
                saver.getvalue()) is not None):
                raise SiteCustomError(self.__class__.__name__,
                    u"Sono esauriti gli SMS gratuiti di oggi.")

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

        except pycurl.error, e:
            errno, msg = e
            raise SiteConnectionError(self.__class__.__name__, self.codingManager.iso88591ToUnicode(msg))
    def sendOne(self, number, text, dati = None, ui = None):
        """Spedisce un SMS con soli caratteri ASCII e di lunghezza massima
        maxLength con le credenziali specificate, supponendo Internet
        raggiungibile."""

        try:
            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.")

            br = mechanize.Browser(factory=mechanize.DefaultFactory(i_want_broken_xhtml_support=True))
            br.addheaders = [('User-agent', 'Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/1718; U; en)')]
              
            br.open("http://www.tim.it")
            br.select_form(nr=1)
            br.form["login"] = dati['Nome utente']
            br.form["password"] = dati['Password']
            res = br.submit()
            if ui: ui.gaugeIncrement(self.incValue)

            req = br.click_link(text='SMS da Web')
            res = br.open(req)
            br.select_form(nr=0)
            br.form["freeNumbers"] = number
            br.form["textAreaStandard"] = text
            res = br.submit()
            if ui: ui.gaugeIncrement(self.incValue)

            captchaBroken = False
            while captchaBroken == False:
                postFields = {}
                try:
                    saver = StringIO()
                    br.retrieve('https://smsweb.tim.it/sms-web/validatecaptcha:image/false?t:ac=Dispatch', "/tmp/captcha") # "/tmp/captcha": NON PORTABILE
                    saver.write(open("/tmp/captcha", "r").read())   # BRUTTO
                    postFields["verificationCode"] = AskUserCaptchaDecoder.getInstance().decodeCaptcha(saver, self.__class__.__name__)
                except CaptchaError:
                    raise SenderError(self.__class__.__name__)

                if not postFields["verificationCode"]:
                    raise SiteCustomError(self.__class__.__name__,
                                    u"Captcha non inserito. Invio interrotto.")
				
                br.select_form(nr=0)
                postFields["t:ac"] = "Dispatch"
                postFields["t:formdata"] = br.form.controls[1]._value
                params = urllib.urlencode(postFields)
                f = br.open("https://smsweb.tim.it/sms-web/validatecaptcha.validatecaptchaform", params)
                if not re.search(u"Le lettere che hai inserito non corrispondono a quelle presenti nell'immagine", br.response().get_data()):
                    captchaBroken = True

            self.checkForErrors(br.response().get_data())

            if (re.search("SMS inviato", br.response().get_data()) is None):
                raise SenderError(self.__class__.__name__)

        except Exception as e:
            #traceback.print_exc(file=sys.stdout)
            raise SiteConnectionError(self.__class__.__name__, self.codingManager.iso88591ToUnicode(e.message))
 def isAvailable(self):
     """Ritorna true se questo plugin è utilizzabile."""
     #Deve essere disponibile un qualunque CaptchaDecoder
     return AskUserCaptchaDecoder.getInstance().isAvailable()
Exemple #7
0
    def sendOne(self, number, text, dati=None, ui=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()

            # Assegna le variabili standard
            username = dati["Nome utente"]
            password = dati["Password"]

            # Ammazzo i vecchi cookie
            self.connectionManager.forgetCookiesFromDomain("alice.it")

            # Faccio il login
            saver = StringIO()
            c.setopt(pycurl.POST, True)
            postFields = {}
            postFields["URL_OK"] = "http://portale.rossoalice.alice.it/ps/HomePS.do?area=posta&settore=sms"
            postFields[
                "URL_KO"
            ] = "http://portale.rossoalice.alice.it/ps/ManageCodError.do?channel=mail_ra&area=posta&settore=sms"
            postFields["usr"] = username
            postFields["channel"] = "mail_ra"
            postFields["login"] = username + "@alice.it"
            postFields["password"] = password
            c.setopt(pycurl.POSTFIELDS, self.codingManager.urlEncode(postFields))
            c.setopt(pycurl.URL, "http://authsrs.alice.it/aap/validatecredential")
            self.perform(self.stop, saver)
            if (
                (re.search(u"non sono corretti", saver.getvalue()) is not None)
                or (re.search(u"utenza inserita al momento non ", saver.getvalue()) is not None)
                or (
                    re.search(u"Riprova pi&ugrave; tardi ad accedere ad Alice Mail e servizi.", saver.getvalue())
                    is not None
                )
            ):
                raise SiteAuthError(self.__class__.__name__)
            if ui:
                ui.gaugeIncrement(self.incValue)

            c.setopt(
                pycurl.URL,
                "http://auth.rossoalice.alice.it/aap/serviceforwarder?sf_dest=click_to_send_sms&ID_Value=&ID_Field=mobilphone",
            )
            self.perform(self.stop)

            saver = StringIO()
            c.setopt(
                pycurl.URL,
                "http://webloginmobile.rossoalice.alice.it/alice/jsp/SMS/composer.jsp?ID_Field=0&ID_Value=0&id_clickto=0&dummy=dummy",
            )
            self.perform(self.stop, saver)

            # Patch di Laurento Frittella
            if re.search("L'invio dell'SMS ad ogni destinatario ha un costo di", saver.getvalue()) is not None:
                raise SiteCustomError(self.__class__.__name__, u"Sono esauriti gli SMS gratuiti di oggi.")

            if ui:
                ui.gaugeIncrement(self.incValue)

            # Spedisco l'SMS
            postFields = {}
            postFields["DEST"] = number
            postFields["TYPE"] = "smsp"
            postFields["SHORT_MESSAGE2"] = text
            postFields["SHORT_MESSAGE"] = text
            postFields["INVIA_SUBITO"] = "true"

            c.setopt(pycurl.URL, "http://webloginmobile.rossoalice.alice.it/alice/jsp/SMS/CheckDest.jsp")
            c.setopt(pycurl.POSTFIELDS, self.codingManager.urlEncode(postFields))
            self.perform(self.stop)

            c.setopt(pycurl.URL, "http://webloginmobile.rossoalice.alice.it/alice/jsp/SMS/inviaSms.jsp")
            c.setopt(pycurl.POSTFIELDS, self.codingManager.urlEncode(postFields))
            self.perform(self.stop)

            if ui:
                ui.gaugeIncrement(self.incValue)

            saver = StringIO()
            c.setopt(pycurl.POST, False)
            c.setopt(pycurl.REFERER, "http://webloginmobile.rossoalice.alice.it/alice/jsp/SMS/inviaSms.jsp")
            c.setopt(pycurl.URL, "http://webloginmobile.rossoalice.alice.it/alice/jsp/EwsJCaptcha.jpg")
            self.perform(self.stop, saver)
            if saver.getvalue() == "":
                raise SiteCustomError(self.__class__.__name__, u"Il sito non è disponibile, riprova più tardi.")

            if ui:
                ui.gaugeIncrement(self.incValue)

            postFields = {}
            postFields["DEST"] = number
            postFields["TYPE"] = "smsp"
            postFields["SHORT_MESSAGE2"] = text
            postFields["SHORT_MESSAGE"] = text
            postFields["INVIA_SUBITO"] = "true"
            try:
                postFields["captchafield"] = AskUserCaptchaDecoder.getInstance().decodeCaptcha(
                    saver, self.__class__.__name__
                )
            except CaptchaError:
                print "An error occurred while trying to decode captcha"
            c.setopt(pycurl.POST, True)
            c.setopt(pycurl.POSTFIELDS, self.codingManager.urlEncode(postFields))
            saver = StringIO()
            c.setopt(pycurl.URL, "http://webloginmobile.rossoalice.alice.it/alice/jsp/SMS/inviaSms.jsp")
            self.perform(self.stop, saver)
            if (
                re.search(
                    "Attenzione!&nbsp;I&nbsp;caratteri&nbsp;inseriti&nbsp;non&nbsp;sono&nbsp;corretti.",
                    saver.getvalue(),
                )
                is not None
            ):
                raise SiteCustomError(self.__class__.__name__, u"I caratteri inseriti non sono corretti.")

            if (
                re.search("&Egrave; possibile inviare gratuitamente fino a 10 SMS al giorno", saver.getvalue())
                is not None
            ):
                raise SiteCustomError(self.__class__.__name__, u"Sono esauriti gli SMS gratuiti di oggi.")

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

        except pycurl.error, e:
            errno, msg = e
            raise SiteConnectionError(self.__class__.__name__, self.codingManager.iso88591ToUnicode(msg))
Exemple #8
0
 def isAvailable(self):
     """Ritorna true se questo plugin è utilizzabile."""
     return AskUserCaptchaDecoder.getInstance().isAvailable()
Exemple #9
0
    def sendOne(self, number, text, dati = None, ui = None):
        """Spedisce un SMS con soli caratteri ASCII e di lunghezza massima
        maxLength con le credenziali specificate, supponendo Internet
        raggiungibile."""

        try:
            #Costruisco un nuovo oggetto Curl e lo inizializzo
            c = self.connectionManager.getCurl()

            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.")

            #Assegna le variabili standard
            username = dati['Nome utente']
            password = dati['Password']

            c.setopt(pycurl.URL, "http://www.tim.it")
            self.perform(self.stop)

            if ui: ui.gaugeIncrement(self.incValue)

            #Faccio il login
            saver = StringIO()
            c.setopt(pycurl.POST, True)
            postFields = {}
            postFields["urlOk"] = "https://www.tim.it/119/consumerdispatcher"
            postFields["portale"] = "timPortale"
            postFields["login"] = username
            postFields["password"] = password
            c.setopt(pycurl.POSTFIELDS,
                self.codingManager.urlEncode(postFields))
            c.setopt(pycurl.URL,
                "https://www.tim.it/authfe/login.do")
            self.perform(self.stop, saver)
            self.checkForErrors(saver.getvalue())

            if ui: ui.gaugeIncrement(self.incValue)

            c.setopt(pycurl.URL,
                "https://smsweb.tim.it/sms-web/adddispatch?start=new")
            saver = StringIO()
            self.perform(self.stop, saver)
            self.checkForErrors(saver.getvalue())

            try:
                formdata1 = re.search('(?<=(name="addDispatchForm"><div class="t-invisible"><input name="t:formdata" type="hidden" value="))[^"]+', saver.getvalue()).group(0)
                formdata2 = re.search('(?<=(seperateFreeNumbers:hidden" name="t:formdata" type="hidden" value="))[^"]+', saver.getvalue()).group(0)
            except AttributeError:
                raise SenderError(self.__class__.__name__)

            try:
                jsession = re.search('(?<=(adddispatch.adddispatchform;jsessionid=))[^"]+', saver.getvalue()).group(0)
            except: jsession = None

            if ui: ui.gaugeIncrement(self.incValue)

            postFields = {}
            postFields["t:formdata"] = formdata2
            postFields["recipientType"] = 'FREE_NUMBERS'
            postFields["freeNumbers"] = number
            postFields["textAreaStandard"] = text
            postFields["deliverySmsClass"] = 'STANDARD'
            postdata = self.codingManager.urlEncode(postFields)+"&"+\
                       urllib.urlencode({"t:formdata":formdata1})
            c.setopt(pycurl.POSTFIELDS, postdata )
            c.setopt(pycurl.POST, True)
            url = "https://smsweb.tim.it/sms-web/adddispatch.adddispatchform"
            if jsession: url += ";jsessionid="+jsession
            c.setopt(pycurl.URL, url )
            saver = StringIO()
            self.perform(self.stop, saver)
            self.checkForErrors(saver.getvalue())

            try:
                formdata = re.search('(?<=(value="Dispatch"></input><input name="t:formdata" type="hidden" value="))[^"]+', saver.getvalue()).group(0)
            except AttributeError:
                raise SenderError(self.__class__.__name__)

            captchaBroken = False
            while captchaBroken == False:
                postFields = {}
                try:
                    saver = StringIO()
                    c.setopt(pycurl.POST, False)
                    c.setopt(pycurl.URL, "https://smsweb.tim.it/sms-web/validatecaptcha:image/false?t:ac=Dispatch" )
                    self.perform(self.stop, saver)
                    #postFields["verificationCode"] = CaptchaDecoder.getBestPlugin().decodeCaptcha(saver, self.__class__.__name__)
                    postFields["verificationCode"] = AskUserCaptchaDecoder.getInstance().decodeCaptcha(saver, self.__class__.__name__)
                except CaptchaError:
                    raise SenderError(self.__class__.__name__)

                if not postFields["verificationCode"]:
                    raise SiteCustomError(self.__class__.__name__,
                                    u"Captcha non inserito. Invio interrotto.")

                postFields["t:formdata"] = formdata
                postFields["t:ac"] = "Dispatch"
                c.setopt(pycurl.POSTFIELDS,
                    self.codingManager.urlEncode(postFields))
                c.setopt(pycurl.POST, True)
                c.setopt(pycurl.URL, "https://smsweb.tim.it/sms-web/validatecaptcha.validatecaptchaform" )
                saver = StringIO()
                self.perform(self.stop, saver)

                if not re.search(u"Le lettere che hai inserito non corrispondono a quelle presenti nell'immagine", saver.getvalue()):
                    captchaBroken = True

            self.checkForErrors(saver.getvalue())

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

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