diff options
| author | 2014-06-12 16:10:15 +0200 | |
|---|---|---|
| committer | 2014-06-12 16:10:15 +0200 | |
| commit | a9459282850bc3b9e8346f1909b47a7548aa84d9 (patch) | |
| tree | f73740336a2e03d180ecdf69fb07bb5e77922eda /module | |
| parent | [Linksnappy] Fixed expired account detect (diff) | |
| download | pyload-a9459282850bc3b9e8346f1909b47a7548aa84d9.tar.xz | |
[Oboom] new hoster and account
Diffstat (limited to 'module')
| -rw-r--r-- | module/plugins/accounts/OboomCom.py | 50 | ||||
| -rw-r--r-- | module/plugins/hoster/OboomCom.py | 129 | 
2 files changed, 179 insertions, 0 deletions
| diff --git a/module/plugins/accounts/OboomCom.py b/module/plugins/accounts/OboomCom.py new file mode 100644 index 000000000..19fcea67a --- /dev/null +++ b/module/plugins/accounts/OboomCom.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- + +import time + +from module.plugins.Account import Account +from module.lib.beaker.crypto.pbkdf2 import PBKDF2 +from module.common.json_layer import json_loads + + +class OboomCom(Account): +    __name__ = "OboomCom" +    __version__ = "0.1" +    __type__ = "account" +    __description__ = """Oboom.com account plugin""" +    __author_name__ = "stanley" +    __author_mail__ = "stanley.foerster@gmail.com" + +    def loadAccountData(self, user, req): +        passwd = self.getAccountData(user)["password"] +        salt = passwd[::-1] +        pbkdf2 = PBKDF2(passwd, salt, 1000).hexread(16) +        result = json_loads(req.load("https://www.oboom.com/1.0/login", get={"auth": user, "pass": pbkdf2})) +        if not result[0] == 200: +            self.logWarning("Failed to log in: %s" % result[1]) +            self.wrongPassword() +        return result[1] + +    def loadAccountInfo(self, name, req): +        accountData = self.loadAccountData(name, req) +        userData = accountData["user"] + +        if "premium_unix" in userData: +            validUntilUtc = int(userData["premium_unix"]) +            if validUntilUtc > int(time.time()): +                premium = True +                validUntil = validUntilUtc +                traffic = userData["traffic"] +                trafficLeft = traffic["current"] +                maxTraffic = traffic["max"] +                session = accountData["session"] +                return {"premium": premium, +                        "validuntil": validUntil, +                        "trafficleft": trafficLeft / 1024, +                        "maxtraffic": maxTraffic / 1024, +                        "session": session +                } +        return {"premium": False, "validuntil": -1} + +    def login(self, user, data, req): +        self.loadAccountData(user, req) diff --git a/module/plugins/hoster/OboomCom.py b/module/plugins/hoster/OboomCom.py new file mode 100644 index 000000000..1e0508d32 --- /dev/null +++ b/module/plugins/hoster/OboomCom.py @@ -0,0 +1,129 @@ +# -*- coding: utf-8 -*- + +# Test link: +# https://www.oboom.com/B7CYZIEB/10Mio.dat + +import re + +from module.plugins.Hoster import Hoster +from module.plugins.internal.CaptchaService import ReCaptcha +from module.common.json_layer import json_loads + + +class OboomCom(Hoster): +    __name__ = "OboomCom" +    __type__ = "hoster" +    __pattern__ = r'https?://(?:www\.)?oboom\.com/(#(id=|/)?)?(?P<ID>[A-Z0-9]{8})' +    __version__ = "0.1" +    __description__ = """oboom.com hoster plugin""" +    __author_name__ = "stanley" +    __author_mail__ = "stanley.foerster@gmail.com" + +    RECAPTCHA_KEY = "6LdqpO0SAAAAAJGHXo63HyalP7H4qlRs_vff0kJX" + +    def loadUrl(self, url, get=None): +        if not get: +            get = dict() +        return json_loads(self.load(url, get, decode=True)) + +    def getFileId(self, url): +        self.fileId = re.match(OboomCom.__pattern__, url).group('ID') + +    def getSessionToken(self): +        if self.premium: +            accountInfo = self.account.getAccountInfo(self.user, True) +            if "session" in accountInfo: +                self.sessionToken = accountInfo["session"] +            else: +                self.fail("Could not retrieve premium session") +        else: +            apiUrl = "https://www.oboom.com/1.0/guestsession" +            result = self.loadUrl(apiUrl) +            if result[0] == 200: +                self.sessionToken = result[1] +            else: +                self.fail("Could not retrieve token for guest session. Error code %s" % result[0]) + +    def solveCaptcha(self): +        recaptcha = ReCaptcha(self) +        for _ in xrange(5): +            challenge, response = recaptcha.challenge(self.RECAPTCHA_KEY) +            apiUrl = "https://www.oboom.com/1.0/download/ticket" +            params = {"recaptcha_challenge_field": challenge, +                      "recaptcha_response_field": response, +                      "download_id": self.fileId, +                      "token": self.sessionToken} +            result = self.loadUrl(apiUrl, params) + +            if result[0] == 200: +                self.downloadToken = result[1] +                self.downloadAuth = result[2] +                self.correctCaptcha() +                self.setWait(30) +                self.wait() +                break +            elif result[0] == 400: +                if result[1] == "incorrect-captcha-sol": +                    self.invalidCaptcha() +                elif result[1] == "captcha-timeout": +                    self.invalidCaptcha() +                elif result[1] == "forbidden": +                    self.retry(5, 15 * 60, "Service unavailable") +            elif result[0] == 403: +                if result[1] == -1:  # another download is running +                    self.setWait(15 * 60) +                else: +                    self.setWait(result[1], reconnect=True) +                self.wait() +                self.retry(5) +        else: +            self.invalidCaptcha() +            self.fail("Received invalid captcha 5 times") + +    def getFileInfo(self, token, fileId): +        apiUrl = "https://api.oboom.com/1.0/info" +        params = {"token": token, "items": fileId, "http_errors": 0} + +        result = self.loadUrl(apiUrl, params) +        if result[0] == 200: +            item = result[1][0] +            if item["state"] == "online": +                self.fileSize = item["size"] +                self.fileName = item["name"] +            else: +                self.offline() +        else: +            self.fail("Could not retrieve file info. Error code %s: %s" % (result[0], result[1])) + +    def getDownloadTicket(self): +        apiUrl = "https://api.oboom.com/1.0/dl" +        params = {"item": self.fileId, "http_errors": 0} +        if self.premium: +            params["token"] = self.sessionToken +        else: +            params["token"] = self.downloadToken +            params["auth"] = self.downloadAuth + +        result = self.loadUrl(apiUrl, params) +        if result[0] == 200: +            self.downloadDomain = result[1] +            self.downloadTicket = result[2] +        else: +            self.fail("Could not retrieve download ticket. Error code %s" % result[0]) + +    def setup(self): +        self.chunkLimit = 1 +        self.multiDL = self.premium + +    def process(self, pyfile): +        self.pyfile.url.replace(".com/#id=", ".com/#") +        self.pyfile.url.replace(".com/#/", ".com/#") +        self.getFileId(self.pyfile.url) +        self.getSessionToken() +        self.getFileInfo(self.sessionToken, self.fileId) +        self.pyfile.name = self.fileName +        self.pyfile.size = self.fileSize +        if not self.premium: +            self.solveCaptcha() +        self.getDownloadTicket() +        self.download("https://%s/1.0/dlh" % self.downloadDomain, get={"ticket": self.downloadTicket, "http_errors": 0}) | 
