Пример #1
0
    def add(self):
        """"""
        link_file = None
        err_msg = None
        source = None
        wait = WAITING

        try:
            #Remove the filename from the url
            file_id = self.link.split("/oron.com/")[1].split("/")[0]
            self.link = "%s/%s" % (BASE_URL, file_id)

            cookie = cookielib.CookieJar()

            with URLClose(URLOpen(cookie).open(self.link)) as s:
                if self.wait_func():
                    return self.link, None, err_msg
                fname = None
                for line in s:
                    if 'name="fname"' in line:
                        fname = line.split('value="')[-1].split('"')[0]
                if fname is not None:
                    dict_form = {
                        "op": "download1",
                        "usr_login": "",
                        "id": file_id,
                        "fname": fname,
                        "referer": "",
                        "method_free": " Regular Download "
                    }
                    headers = {
                        "Content-type": "application/x-www-form-urlencoded",
                    }
                    with URLClose(
                            URLOpen(cookie).open(self.link,
                                                 urllib.urlencode(dict_form),
                                                 headers=headers)) as sa:
                        if self.wait_func():
                            return self.link, None, err_msg
                        rand = None
                        referer = None
                        recaptcha_key = None
                        for line in sa:
                            if 'id="countdown"' in line:
                                wait = int(
                                    line.split('id="countdown">')[-1].split(
                                        '<')[0].strip())
                            elif 'name="rand"' in line:
                                rand = line.split('value="')[-1].split('"')[0]
                            elif 'name="referer"' in line:
                                referer = line.split('value="')[-1].split(
                                    '"')[0]
                            elif "challenge?k=" in line:
                                recaptcha_key = line.split(
                                    "challenge?k=")[-1].split('"')[0]
                        if None not in (rand, referer, recaptcha_key):
                            if self.wait_func(
                                    wait
                            ):  #wait... if true: download was stopped
                                return self.link, None, err_msg

                            recaptcha_link = "http://www.google.com/recaptcha/api/challenge?k=%s" % recaptcha_key
                            c = Recaptcha(BASE_URL, recaptcha_link,
                                          self.wait_func)
                            challenge, response = c.solve_captcha()
                            if response is not None:
                                dict_form = {
                                    "op": "download2",
                                    "id": file_id,
                                    "rand": rand,
                                    "referer": referer,
                                    "method_free": " Regular Download ",
                                    "method_premium": "",
                                    "recaptcha_challenge_field": challenge,
                                    "recaptcha_response_field": response,
                                    "down_direct": "1"
                                }
                                with URLClose(
                                        URLOpen(cookie).open(
                                            self.link,
                                            urllib.urlencode(dict_form),
                                            headers=headers)) as sb:
                                    if self.wait_func():
                                        return self.link, None, err_msg
                                    for line in sb:
                                        if 'class="atitle"' in line:
                                            link_file = line.split(
                                                'href="')[-1].split('"')[0]
                                        elif "Wrong captcha" in line:
                                            raise CaptchaException(
                                                "Wrong captcha")
                                    if link_file is not None:
                                        with URLClose(
                                                URLOpen(cookie).open(
                                                    link_file,
                                                    range=(self.content_range,
                                                           None)),
                                                always_close=False) as sc:
                                            source = sc
                                    else:  #link not found
                                        raise LinkErrorException("Link Error")
                            else:
                                raise CaptchaException(
                                    "No response from the user")
                        else:  #limit exceeded
                            #TODO: Fix for big files (+1gb), since regular users cant download them
                            raise LimitExceededException("Limit Exceeded")
                else:  #link not found
                    raise LinkErrorException("Link Error")
        except (urllib2.URLError, httplib.HTTPException, socket.error) as err:
            err_msg = err
        except (LimitExceededException, CaptchaException,
                LinkErrorException) as err:
            if isinstance(err, LimitExceededException):
                self.set_limit_exceeded(True)
            err_msg = err
            logger.info(err)
        except Exception as err:
            err_msg
            logger.exception(err)

        return link_file, source, err_msg  #puede ser el objeto archivo o None.
Пример #2
0
    def add(self): #wait_func: wait method from thread_managed
        """
        TODO: Refactory.
        """
        link_file = None
        err_msg = None
        source = None
        wait = WAITING
        
        try:
            file_id = self.link.split("turbobit.net/")[-1].split("/")[0].rstrip(".html")
            self.link = BASE_URL + "/download/free/" + file_id
            cookie = cookielib.CookieJar()
            opener = URLOpen(cookie) #cookielib
            
            with URLClose(opener.open(self.link)) as s1:
                key = None
                for line in s1:
                    if "challenge?k=" in line:
                        key = line.split('challenge?k=')[-1].split('"')[0]
                        recaptcha_link = "http://www.google.com/recaptcha/api/challenge?k=%s" % key
                        c = Recaptcha(BASE_URL, recaptcha_link, self.wait_func)
                        break
                if key is None:
                    raise LimitExceededException("Limit Exceeded")
                for retry in range(3):
                    challenge, response = c.solve_captcha()
                    if response is not None:
                        form = urllib.urlencode([("recaptcha_challenge_field", challenge),
                                                            ("recaptcha_response_field", response),
                                                            ("captcha_type", "recaptcha"),
                                                            ("captcha_subtype", "")])
                        with URLClose(opener.open(self.link, form)) as s2:
                            found = False
                            for line in s2:
                                if "limit :" in line:
                                    found = True
                                    try:
                                        wait = int(line.split(":")[-1].split(",")[0]) / 100 #ms
                                    except Exception as err:
                                        logger.exception(err)
                                        wait = WAITING
                                elif "captcha-error" in line:
                                    err_msg = "Wrong captcha"
                            if found:
                                if self.wait_func(wait+1):
                                    return self.link, None, err_msg
                                url = BASE_URL + "/download/getLinkAfterTimeout/" + file_id
                                print url
                                with URLClose(opener.open(url)) as s3:
                                    for line in s3:
                                        print line
                                        if "href='/download/redirect" in line:
                                            tmp = line.split("href='")[-1].split("'")[0]
                                            redir_url = BASE_URL + tmp
                                            print redir_url
                                            with URLClose(opener.open(redir_url)) as s4:
                                                for line in s4:
                                                    if 'href="' in line:
                                                        link_file = line.split('href="')[-1].split('"')[0]
                                                        #print link_file
                                                        with URLClose(opener.open(link_file, range=(self.content_range, None)), always_close=False) as s5:
                                                            source = s5
                                                        raise FileLinkFoundException()
                    else:
                        raise CaptchaException("No response from the user")

        except (urllib2.URLError, httplib.HTTPException, socket.error) as err:
            err_msg = err
        except (FileLinkFoundException, LimitExceededException, LinkErrorException, CaptchaException) as err:
            if isinstance(err, LimitExceededException):
                self.set_limit_exceeded(True)
            err_msg = err
            logger.info(err)
        except Exception as err:
            logger.exception(err)
            err_msg = err
        
        return link_file, source, err_msg
Пример #3
0
    def add(self):  #wait_func: wait method from thread_managed
        """
        TODO: Refactory.
        """
        link_file = None
        err_msg = None
        source = None
        wait = WAITING
        ajax_id = None
        recaptcha_key = None

        try:
            file_id = self.link.split("/files/")[1].split("/")[0]

            cookie = cookielib.CookieJar()
            opener = URLOpen(cookie)  #cookielib
            ajax_id_url = BASE_URL + "/files-ajax/" + file_id + "/request.html"

            with URLClose(opener.open(self.link)) as s1:
                for line in s1:
                    if "var ajaxdl" in line:
                        ajax_id = line.split('"')[1]
                    elif "challenge?k=" in line:
                        recaptcha_key = line.split("challenge?k=")[-1].split(
                            '"')[0].strip()
                if not ajax_id:  #not recaptcha_key or not ajax_id:
                    raise LinkErrorException("Link not found.")

                if self.wait_func():
                    return self.link, None, err_msg

                #wait time.
                #note: bitshare does not care for this. It can be skipped.
                #headers = {"Accept:": "application/json", }
                form = urllib.urlencode([("request", "generateID"),
                                         ("ajaxid", ajax_id)])
                with URLClose(opener.open(ajax_id_url, form)) as s2:
                    response = s2.read()  #may return ERROR: explanation
                    wait = int(response.split(":")[1])  #file:60:1
                    if wait > 120:
                        raise LimitExceededException("Limit Exceeded")
                    if self.wait_func(wait):
                        return self.link, None, err_msg

                #recaptcha.
                #note: bitshare does not care for this. It can be skipped.
                if recaptcha_key:
                    recaptcha_link = "http://www.google.com/recaptcha/api/challenge?k=%s" % recaptcha_key
                    for retry in range(3):
                        c = Recaptcha(BASE_URL, recaptcha_link, self.wait_func)
                        challenge, response = c.solve_captcha()
                        if response is not None:
                            form = urllib.urlencode([
                                ("request", "validateCaptcha"),
                                ("ajaxid", ajax_id),
                                ("recaptcha_challenge_field", challenge),
                                ("recaptcha_response_field", response)
                            ])
                            response_ = opener.open(ajax_id_url, form).read(
                            )  #may return ERROR: explanation or SUCCESS
                            if not "ERROR" in response_:
                                break
                        else:
                            raise CaptchaException("No response from the user")
                    if "ERROR" in response_:
                        raise CaptchaException("Wrong captcha")

                if self.wait_func():
                    return self.link, None, err_msg

                #get download link
                form = urllib.urlencode([("request", "getDownloadURL"),
                                         ("ajaxid", ajax_id)])
                with URLClose(opener.open(ajax_id_url, form)) as s3:
                    response = s3.read()
                    link_file = response.split("http")[-1]
                    link_file = "http" + link_file

                with URLClose(URLOpen(cookie).open(link_file,
                                                   range=(self.content_range,
                                                          None)),
                              always_close=False) as sc:
                    source = sc

        except (urllib2.URLError, httplib.HTTPException, socket.error) as err:
            err_msg = err
        except (LimitExceededException, CaptchaException,
                LinkErrorException) as err:
            if isinstance(err, LimitExceededException):
                self.set_limit_exceeded(True)
            err_msg = err
            logger.info(err)
        except Exception as err:
            err_msg
            logger.exception(err)

        return link_file, source, err_msg