From df143e902d00903f16cf32174948f636bda56e4c Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Thu, 8 Jan 2015 22:58:32 +0100 Subject: "New Year" Update: internal plugins --- module/plugins/internal/CaptchaService.py | 49 ++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 14 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index 965799e8e..b429fd6e0 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -2,6 +2,7 @@ import re +from base64 import urlsafe_b64encode from random import random from module.common.json_layer import json_loads @@ -54,14 +55,14 @@ class CaptchaService: class ReCaptcha(CaptchaService): __name__ = "ReCaptcha" - __version__ = "0.08" + __version__ = "0.09" __description__ = """ReCaptcha captcha service plugin""" __license__ = "GPLv3" __authors__ = [("pyLoad Team", "admin@pyload.org")] - KEY_PATTERN = r'recaptcha(?:/api|\.net)/(?:challenge|noscript)\?k=([\w-]+)' + KEY_PATTERN = r'(?:class="g-recaptcha"\s+data-sitekey="|recaptcha(?:/api|\.net)/(?:challenge|noscript)\?k=)([\w-]+)' KEY_AJAX_PATTERN = r'Recaptcha\.create\s*\(\s*["\']([\w-]+)' @@ -84,7 +85,7 @@ class ReCaptcha(CaptchaService): return None - def challenge(self, key=None): + def challenge(self, key=None, userverify=False): if not key: if self.detect_key(): key = self.key @@ -97,14 +98,30 @@ class ReCaptcha(CaptchaService): try: challenge = re.search("challenge : '(.+?)',", html).group(1) server = re.search("server : '(.+?)',", html).group(1) - except: + + except AttributeError: errmsg = _("ReCaptcha challenge pattern not found") self.plugin.fail(errmsg) - raise ValueError(errmsg) + raise AttributeError(errmsg) self.plugin.logDebug("ReCaptcha challenge: %s" % challenge) - return challenge, self.result(server, challenge) + response = challenge, self.result(server, challenge) + + return self.userverify(*response) if userverify else response + + + def userverify(self, challenge, result): + response = self.plugin.req.load("https://www.google.com/recaptcha/api2/userverify", + post={'c' : challenge, + 'response': urlsafe_b64encode('{"response":"%s"}' % result)}) + try: + return re.search(r'"uvresp","(.+?)"', response).group(1) + + except AttributeError: + errmsg = _("ReCaptcha userverify response not found") + self.plugin.fail(errmsg) + raise AttributeError(errmsg) def result(self, server, challenge): @@ -167,10 +184,11 @@ class AdsCaptcha(CaptchaService): try: challenge = re.search("challenge: '(.+?)',", html).group(1) server = re.search("server: '(.+?)',", html).group(1) - except: + + except AttributeError: errmsg = _("AdsCaptcha challenge pattern not found") self.plugin.fail(errmsg) - raise ValueError(errmsg) + raise AttributeError(errmsg) self.plugin.logDebug("AdsCaptcha challenge: %s" % challenge) @@ -214,10 +232,11 @@ class SolveMedia(CaptchaService): challenge = re.search(r'', html).group(1) server = "http://api.solvemedia.com/papi/media" - except: + + except AttributeError: errmsg = _("SolveMedia challenge pattern not found") self.plugin.fail(errmsg) - raise ValueError(errmsg) + raise AttributeError(errmsg) self.plugin.logDebug("SolveMedia challenge: %s" % challenge) @@ -286,10 +305,11 @@ class AdYouLike(CaptchaService): 'callback': callback}) try: challenge = json_loads(re.search(callback + r'\s*\((.+?)\)', html).group(1)) - except: + + except AttributeError: errmsg = _("AdYouLike challenge pattern not found") self.plugin.fail(errmsg) - raise ValueError(errmsg) + raise AttributeError(errmsg) self.plugin.logDebug("AdYouLike challenge: %s" % challenge) @@ -316,10 +336,11 @@ class AdYouLike(CaptchaService): try: instructions_visual = challenge['translations'][server['all']['lang']]['instructions_visual'] result = re.search(u'«(.+?)»', instructions_visual).group(1).strip() - except: + + except AttributeError: errmsg = _("AdYouLike result not found") self.plugin.fail(errmsg) - raise ValueError(errmsg) + raise AttributeError(errmsg) result = {'_ayl_captcha_engine' : "adyoulike", '_ayl_env' : server['all']['env'], -- cgit v1.2.3 From 14bfb249da1a6dcda6e13f91f8b2687eb0cfb756 Mon Sep 17 00:00:00 2001 From: zapp-brannigan Date: Wed, 14 Jan 2015 12:40:21 +0100 Subject: [CaptchaService.py] Added support for ReCaptchaV2 --- module/plugins/internal/CaptchaService.py | 172 +++++++++++++++++++++++------- 1 file changed, 135 insertions(+), 37 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index b429fd6e0..be6a056fc 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -1,16 +1,17 @@ # -*- coding: utf-8 -*- import re +import time +import base64 -from base64 import urlsafe_b64encode -from random import random +from random import random,randint from module.common.json_layer import json_loads class CaptchaService: __name__ = "CaptchaService" - __version__ = "0.16" + __version__ = "0.17" __description__ = """Base captcha service plugin""" __license__ = "GPLv3" @@ -55,14 +56,14 @@ class CaptchaService: class ReCaptcha(CaptchaService): __name__ = "ReCaptcha" - __version__ = "0.09" + __version__ = "0.08" __description__ = """ReCaptcha captcha service plugin""" __license__ = "GPLv3" __authors__ = [("pyLoad Team", "admin@pyload.org")] - KEY_PATTERN = r'(?:class="g-recaptcha"\s+data-sitekey="|recaptcha(?:/api|\.net)/(?:challenge|noscript)\?k=)([\w-]+)' + KEY_PATTERN = r'recaptcha(?:/api|\.net)/(?:challenge|noscript)\?k=([\w-]+)' KEY_AJAX_PATTERN = r'Recaptcha\.create\s*\(\s*["\']([\w-]+)' @@ -85,7 +86,7 @@ class ReCaptcha(CaptchaService): return None - def challenge(self, key=None, userverify=False): + def challenge(self, key=None): if not key: if self.detect_key(): key = self.key @@ -98,30 +99,14 @@ class ReCaptcha(CaptchaService): try: challenge = re.search("challenge : '(.+?)',", html).group(1) server = re.search("server : '(.+?)',", html).group(1) - - except AttributeError: + except: errmsg = _("ReCaptcha challenge pattern not found") self.plugin.fail(errmsg) - raise AttributeError(errmsg) + raise ValueError(errmsg) self.plugin.logDebug("ReCaptcha challenge: %s" % challenge) - response = challenge, self.result(server, challenge) - - return self.userverify(*response) if userverify else response - - - def userverify(self, challenge, result): - response = self.plugin.req.load("https://www.google.com/recaptcha/api2/userverify", - post={'c' : challenge, - 'response': urlsafe_b64encode('{"response":"%s"}' % result)}) - try: - return re.search(r'"uvresp","(.+?)"', response).group(1) - - except AttributeError: - errmsg = _("ReCaptcha userverify response not found") - self.plugin.fail(errmsg) - raise AttributeError(errmsg) + return challenge, self.result(server, challenge) def result(self, server, challenge): @@ -136,6 +121,123 @@ class ReCaptcha(CaptchaService): return result +class ReCaptchaV2(CaptchaService): + __name__ = "ReCaptchaV2" + __version__ = "0.01" + + __description__ = """ReCaptchaV2 captcha service plugin""" + __license__ = "GPLv3" + __authors__ = [("pyLoad Team", "admin@pyload.org")] + + + KEY_PATTERN = r'data-sitekey="(.*?)">' + + + def detect_key(self, html=None): + if not html: + if hasattr(self.plugin, "html") and self.plugin.html: + html = self.plugin.html + else: + errmsg = _("ReCaptcha html not found") + self.plugin.fail(errmsg) + raise TypeError(errmsg) + + m = re.search(self.KEY_PATTERN, html) + if m: + self.key = m.group(1).strip() + self.plugin.logDebug("ReCaptcha key: %s" % self.key) + return self.key + else: + self.plugin.logDebug("ReCaptcha key not found") + return None + + + def collectApiInfo(self): + html = self.plugin.req.load("http://www.google.com/recaptcha/api.js",cookies=True) + a = re.search("po.src = '(.*?)';",html).group(1) + vers = a.split("/")[5] + self.plugin.logDebug("API version: %s" %vers) + language = a.split("__")[1].split(".")[0] + self.plugin.logDebug("API language: %s" %language) + + html = self.plugin.req.load("https://apis.google.com/js/api.js",cookies=True) + b = re.search('"h":"(.*?)","',html).group(1) + jsh = b.decode('unicode-escape') + self.plugin.logDebug("API jsh-string: %s" %jsh) + + return vers,language,jsh + + def prepareTimeAndRpc(self): + html = self.plugin.req.load("http://www.google.com/recaptcha/api2/demo",cookies=True) + + millis = int(round(time.time() * 1000)) + self.plugin.logDebug("Systemtime in milliseconds: %s" %str(millis)) + + rand = randint(1,99999999) + a = "0.%s"%str(rand*2147483647) + rpc = int(100000000*float(a)) + self.plugin.logDebug("Self-generated rpc-token: %s" %str(rpc)) + + return millis,rpc + + def doTheCaptcha(self, host): + self.plugin.logDebug("Parent host: %s" %host) + botguardstring = "!A" + sitekey = self.detect_key() + vers,language,jsh = self.collectApiInfo() + millis,rpc = self.prepareTimeAndRpc() + + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/anchor", + get={"k":sitekey, + "hl":language, + "v":vers, + "usegapi":"1", + "jsh":jsh+"#id=IO_"+str(millis), + "parent":"http://"+host, + "pfname":"", + "rpctoken":rpc}, + cookies=True) + recaptchatoken = re.search('id="recaptcha-token" value="(.*?)">',html) + self.plugin.logDebug("Captchatoken #1: %s" %recaptchatoken.group(1)) + + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/frame", get={"c":recaptchatoken.group(1), + "hl":language, + "v":vers, + "bg":botguardstring, + "usegapi":"1", + "jsh":jsh}, + cookies=True) + html = html.decode('unicode-escape') + recaptchatoken2 = re.search('"finput","(.*?)",',html) + self.plugin.logDebug("Captchatoken #2: %s" %recaptchatoken2.group(1)) + recaptchatoken3 = re.search('."asconf".\s.\s,"(.*?)".',html) + self.plugin.logDebug("Captchatoken #3: %s" %recaptchatoken3.group(1)) + + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/reload", post={"c":recaptchatoken2.group(1), + "reason":"fi", + "fbg":recaptchatoken3.group(1)}, + cookies=True) + recaptchatoken4 = re.search('"rresp","(.*?)",',html) + self.plugin.logDebug("Captchatoken #4: %s" %recaptchatoken4.group(1)) + + millis_captcha_loading = int(round(time.time() * 1000)) + captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload", get={"c":recaptchatoken4.group(1)},forceUser=True) + respone_encoded = base64.b64encode('{"response":"%s"}' %captcha_response) + self.plugin.logDebug("Encoded result: %s" %respone_encoded) + + timeToSolve = int(round(time.time() * 1000)) - millis_captcha_loading + timeToSolveMore = timeToSolve + int(float("0."+str(randint(1,99999999))) * 500) + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/userverify", cookies=True, post={"c":recaptchatoken4.group(1), + "response":respone_encoded, + "t":timeToSolve, + "ct":timeToSolveMore, + "bg":botguardstring}) + recaptchatoken5 = re.search('"uvresp","(.*?)",',html) + self.plugin.logDebug("Captchatoken #5: %s" %recaptchatoken5.group(1)) + + return recaptchatoken5.group(1) + + class AdsCaptcha(CaptchaService): __name__ = "AdsCaptcha" __version__ = "0.06" @@ -184,11 +286,10 @@ class AdsCaptcha(CaptchaService): try: challenge = re.search("challenge: '(.+?)',", html).group(1) server = re.search("server: '(.+?)',", html).group(1) - - except AttributeError: + except: errmsg = _("AdsCaptcha challenge pattern not found") self.plugin.fail(errmsg) - raise AttributeError(errmsg) + raise ValueError(errmsg) self.plugin.logDebug("AdsCaptcha challenge: %s" % challenge) @@ -232,11 +333,10 @@ class SolveMedia(CaptchaService): challenge = re.search(r'', html).group(1) server = "http://api.solvemedia.com/papi/media" - - except AttributeError: + except: errmsg = _("SolveMedia challenge pattern not found") self.plugin.fail(errmsg) - raise AttributeError(errmsg) + raise ValueError(errmsg) self.plugin.logDebug("SolveMedia challenge: %s" % challenge) @@ -305,11 +405,10 @@ class AdYouLike(CaptchaService): 'callback': callback}) try: challenge = json_loads(re.search(callback + r'\s*\((.+?)\)', html).group(1)) - - except AttributeError: + except: errmsg = _("AdYouLike challenge pattern not found") self.plugin.fail(errmsg) - raise AttributeError(errmsg) + raise ValueError(errmsg) self.plugin.logDebug("AdYouLike challenge: %s" % challenge) @@ -336,11 +435,10 @@ class AdYouLike(CaptchaService): try: instructions_visual = challenge['translations'][server['all']['lang']]['instructions_visual'] result = re.search(u'«(.+?)»', instructions_visual).group(1).strip() - - except AttributeError: + except: errmsg = _("AdYouLike result not found") self.plugin.fail(errmsg) - raise AttributeError(errmsg) + raise ValueError(errmsg) result = {'_ayl_captcha_engine' : "adyoulike", '_ayl_env' : server['all']['env'], -- cgit v1.2.3 From ac2714af28d4719dff415f364469dc847ac53721 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Mon, 19 Jan 2015 01:18:51 +0100 Subject: [CaptchaService] Whitespaces cleanup --- module/plugins/internal/CaptchaService.py | 50 +++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index be6a056fc..1cd261698 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -159,27 +159,27 @@ class ReCaptchaV2(CaptchaService): self.plugin.logDebug("API version: %s" %vers) language = a.split("__")[1].split(".")[0] self.plugin.logDebug("API language: %s" %language) - + html = self.plugin.req.load("https://apis.google.com/js/api.js",cookies=True) b = re.search('"h":"(.*?)","',html).group(1) jsh = b.decode('unicode-escape') self.plugin.logDebug("API jsh-string: %s" %jsh) - + return vers,language,jsh - + def prepareTimeAndRpc(self): html = self.plugin.req.load("http://www.google.com/recaptcha/api2/demo",cookies=True) - + millis = int(round(time.time() * 1000)) self.plugin.logDebug("Systemtime in milliseconds: %s" %str(millis)) - + rand = randint(1,99999999) a = "0.%s"%str(rand*2147483647) rpc = int(100000000*float(a)) self.plugin.logDebug("Self-generated rpc-token: %s" %str(rpc)) - + return millis,rpc - + def doTheCaptcha(self, host): self.plugin.logDebug("Parent host: %s" %host) botguardstring = "!A" @@ -188,53 +188,53 @@ class ReCaptchaV2(CaptchaService): millis,rpc = self.prepareTimeAndRpc() html = self.plugin.req.load("https://www.google.com/recaptcha/api2/anchor", - get={"k":sitekey, - "hl":language, - "v":vers, - "usegapi":"1", - "jsh":jsh+"#id=IO_"+str(millis), - "parent":"http://"+host, + get={"k":sitekey, + "hl":language, + "v":vers, + "usegapi":"1", + "jsh":jsh+"#id=IO_"+str(millis), + "parent":"http://"+host, "pfname":"", "rpctoken":rpc}, cookies=True) recaptchatoken = re.search('id="recaptcha-token" value="(.*?)">',html) self.plugin.logDebug("Captchatoken #1: %s" %recaptchatoken.group(1)) - + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/frame", get={"c":recaptchatoken.group(1), "hl":language, - "v":vers, + "v":vers, "bg":botguardstring, - "usegapi":"1", + "usegapi":"1", "jsh":jsh}, - cookies=True) + cookies=True) html = html.decode('unicode-escape') recaptchatoken2 = re.search('"finput","(.*?)",',html) self.plugin.logDebug("Captchatoken #2: %s" %recaptchatoken2.group(1)) recaptchatoken3 = re.search('."asconf".\s.\s,"(.*?)".',html) self.plugin.logDebug("Captchatoken #3: %s" %recaptchatoken3.group(1)) - - html = self.plugin.req.load("https://www.google.com/recaptcha/api2/reload", post={"c":recaptchatoken2.group(1), - "reason":"fi", + + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/reload", post={"c":recaptchatoken2.group(1), + "reason":"fi", "fbg":recaptchatoken3.group(1)}, cookies=True) recaptchatoken4 = re.search('"rresp","(.*?)",',html) self.plugin.logDebug("Captchatoken #4: %s" %recaptchatoken4.group(1)) - + millis_captcha_loading = int(round(time.time() * 1000)) captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload", get={"c":recaptchatoken4.group(1)},forceUser=True) respone_encoded = base64.b64encode('{"response":"%s"}' %captcha_response) self.plugin.logDebug("Encoded result: %s" %respone_encoded) - + timeToSolve = int(round(time.time() * 1000)) - millis_captcha_loading timeToSolveMore = timeToSolve + int(float("0."+str(randint(1,99999999))) * 500) - html = self.plugin.req.load("https://www.google.com/recaptcha/api2/userverify", cookies=True, post={"c":recaptchatoken4.group(1), - "response":respone_encoded, + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/userverify", cookies=True, post={"c":recaptchatoken4.group(1), + "response":respone_encoded, "t":timeToSolve, "ct":timeToSolveMore, "bg":botguardstring}) recaptchatoken5 = re.search('"uvresp","(.*?)",',html) self.plugin.logDebug("Captchatoken #5: %s" %recaptchatoken5.group(1)) - + return recaptchatoken5.group(1) -- cgit v1.2.3 From 4d6880849502f8f848e3ab5bc49fc61faec8fddb Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Thu, 22 Jan 2015 21:28:03 +0100 Subject: [CaptchaService] Merge together ReCaptcha versions --- module/plugins/internal/CaptchaService.py | 267 ++++++++++++++++-------------- 1 file changed, 142 insertions(+), 125 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index 1cd261698..db31bd1bd 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -2,16 +2,17 @@ import re import time -import base64 -from random import random,randint +from base64 import b64encode +from random import random, randint +from urlparse import urljoin, urlparse from module.common.json_layer import json_loads class CaptchaService: __name__ = "CaptchaService" - __version__ = "0.17" + __version__ = "0.18" __description__ = """Base captcha service plugin""" __license__ = "GPLv3" @@ -46,7 +47,7 @@ class CaptchaService: return None - def challenge(self, key=None): + def challenge(self, key=None, html=None): raise NotImplementedError @@ -56,14 +57,15 @@ class CaptchaService: class ReCaptcha(CaptchaService): __name__ = "ReCaptcha" - __version__ = "0.08" + __version__ = "0.09" __description__ = """ReCaptcha captcha service plugin""" __license__ = "GPLv3" - __authors__ = [("pyLoad Team", "admin@pyload.org")] + __authors__ = [("pyLoad Team", "admin@pyload.org"), + ("zapp-brannigan", "fuerst.reinje@web.de")] - KEY_PATTERN = r'recaptcha(?:/api|\.net)/(?:challenge|noscript)\?k=([\w-]+)' + KEY_PATTERN = r'(?:data-sitekey=["\']|["\']sitekey["\']:\s*["\']|recaptcha(?:/api|\.net)/(?:challenge|noscript)\?k=)([\w-]+)' KEY_AJAX_PATTERN = r'Recaptcha\.create\s*\(\s*["\']([\w-]+)' @@ -86,9 +88,23 @@ class ReCaptcha(CaptchaService): return None - def challenge(self, key=None): + def challenge(self, key=None, html=None): + if not html: + if hasattr(self.plugin, "html") and self.plugin.html: + html = self.plugin.html + else: + errmsg = _("ReCaptcha html not found") + self.plugin.fail(errmsg) + raise TypeError(errmsg) + + challenge = "challenge_%s" % 'new' if re.search(r'sitekey', html) else 'old' + + return getattr(self, challenge)(key, html) + + + def challenge_old(self, key=None, html=None): if not key: - if self.detect_key(): + if self.detect_key(html): key = self.key else: errmsg = _("ReCaptcha key not found") @@ -99,14 +115,15 @@ class ReCaptcha(CaptchaService): try: challenge = re.search("challenge : '(.+?)',", html).group(1) server = re.search("server : '(.+?)',", html).group(1) - except: + + except AttributeError: errmsg = _("ReCaptcha challenge pattern not found") self.plugin.fail(errmsg) - raise ValueError(errmsg) + raise AttributeError(errmsg) self.plugin.logDebug("ReCaptcha challenge: %s" % challenge) - return challenge, self.result(server, challenge) + return self.result(server, challenge), challenge def result(self, server, challenge): @@ -121,126 +138,122 @@ class ReCaptcha(CaptchaService): return result -class ReCaptchaV2(CaptchaService): - __name__ = "ReCaptchaV2" - __version__ = "0.01" + def _collectApiInfo(self): + html = self.plugin.req.load("http://www.google.com/recaptcha/api.js") + a = re.search(r'po.src = \'(.*?)\';', html).group(1) + vers = a.split("/")[5] - __description__ = """ReCaptchaV2 captcha service plugin""" - __license__ = "GPLv3" - __authors__ = [("pyLoad Team", "admin@pyload.org")] + self.plugin.logDebug("ReCaptcha API version: %s" %vers) + language = a.split("__")[1].split(".")[0] - KEY_PATTERN = r'data-sitekey="(.*?)">' + self.plugin.logDebug("ReCaptcha API language: %s" % language) + html = self.plugin.req.load("https://apis.google.com/js/api.js") + b = re.search(r'"h":"(.*?)","', html).group(1) + jsh = b.decode('unicode-escape') - def detect_key(self, html=None): - if not html: - if hasattr(self.plugin, "html") and self.plugin.html: - html = self.plugin.html - else: - errmsg = _("ReCaptcha html not found") - self.plugin.fail(errmsg) - raise TypeError(errmsg) + self.plugin.logDebug("ReCaptcha API jsh-string: %s" % jsh) - m = re.search(self.KEY_PATTERN, html) - if m: - self.key = m.group(1).strip() - self.plugin.logDebug("ReCaptcha key: %s" % self.key) - return self.key - else: - self.plugin.logDebug("ReCaptcha key not found") - return None + return vers, language, jsh - def collectApiInfo(self): - html = self.plugin.req.load("http://www.google.com/recaptcha/api.js",cookies=True) - a = re.search("po.src = '(.*?)';",html).group(1) - vers = a.split("/")[5] - self.plugin.logDebug("API version: %s" %vers) - language = a.split("__")[1].split(".")[0] - self.plugin.logDebug("API language: %s" %language) + def _prepareTimeAndRpc(self): + self.plugin.req.load("http://www.google.com/recaptcha/api2/demo") - html = self.plugin.req.load("https://apis.google.com/js/api.js",cookies=True) - b = re.search('"h":"(.*?)","',html).group(1) - jsh = b.decode('unicode-escape') - self.plugin.logDebug("API jsh-string: %s" %jsh) + millis = int(round(time.time() * 1000)) - return vers,language,jsh + self.plugin.logDebug("ReCaptcha time: %s" % millis) - def prepareTimeAndRpc(self): - html = self.plugin.req.load("http://www.google.com/recaptcha/api2/demo",cookies=True) + rand = randint(1, 99999999) + a = "0.%s" % str(rand * 2147483647) + rpc = int(100000000 * float(a)) - millis = int(round(time.time() * 1000)) - self.plugin.logDebug("Systemtime in milliseconds: %s" %str(millis)) + self.plugin.logDebug("ReCaptcha rpc-token: %s" % rpc) - rand = randint(1,99999999) - a = "0.%s"%str(rand*2147483647) - rpc = int(100000000*float(a)) - self.plugin.logDebug("Self-generated rpc-token: %s" %str(rpc)) + return millis, rpc - return millis,rpc - def doTheCaptcha(self, host): - self.plugin.logDebug("Parent host: %s" %host) - botguardstring = "!A" - sitekey = self.detect_key() - vers,language,jsh = self.collectApiInfo() - millis,rpc = self.prepareTimeAndRpc() + def challenge_new(self, key=None, html=None): + if not key: + if self.detect_key(html): + key = self.key + else: + errmsg = _("ReCaptcha key not found") + self.plugin.fail(errmsg) + raise TypeError(errmsg) + + try: + parent = urljoin("http://", urlparse(self.plugin.pyfile.url).netloc) + + except Exception: + parent = "" + + botguardstring = "!A" + vers, language, jsh = self._collectApiInfo() + millis, rpc = self._prepareTimeAndRpc() html = self.plugin.req.load("https://www.google.com/recaptcha/api2/anchor", - get={"k":sitekey, - "hl":language, - "v":vers, - "usegapi":"1", - "jsh":jsh+"#id=IO_"+str(millis), - "parent":"http://"+host, - "pfname":"", - "rpctoken":rpc}, - cookies=True) - recaptchatoken = re.search('id="recaptcha-token" value="(.*?)">',html) - self.plugin.logDebug("Captchatoken #1: %s" %recaptchatoken.group(1)) - - html = self.plugin.req.load("https://www.google.com/recaptcha/api2/frame", get={"c":recaptchatoken.group(1), - "hl":language, - "v":vers, - "bg":botguardstring, - "usegapi":"1", - "jsh":jsh}, - cookies=True) - html = html.decode('unicode-escape') - recaptchatoken2 = re.search('"finput","(.*?)",',html) - self.plugin.logDebug("Captchatoken #2: %s" %recaptchatoken2.group(1)) - recaptchatoken3 = re.search('."asconf".\s.\s,"(.*?)".',html) - self.plugin.logDebug("Captchatoken #3: %s" %recaptchatoken3.group(1)) - - html = self.plugin.req.load("https://www.google.com/recaptcha/api2/reload", post={"c":recaptchatoken2.group(1), - "reason":"fi", - "fbg":recaptchatoken3.group(1)}, - cookies=True) - recaptchatoken4 = re.search('"rresp","(.*?)",',html) - self.plugin.logDebug("Captchatoken #4: %s" %recaptchatoken4.group(1)) + get={'k' : key, + 'hl' : language, + 'v' : vers, + 'usegapi' : "1", + 'jsh' : "%s#id=IO_%s" % (jsh, millis), + 'parent' : parent, + 'pfname' : "", + 'rpctoken': rpc}) + + token1 = re.search(r'id="recaptcha-token" value="(.*?)">', html) + self.plugin.logDebug("ReCaptcha token #1: %s" % token1.group(1)) + + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/frame", + get={'c' : token1.group(1), + 'hl' : language, + 'v' : vers, + 'bg' : botguardstring, + 'usegapi': "1", + 'jsh' : jsh}).decode('unicode-escape') + + token2 = re.search(r'"finput","(.*?)",', html) + self.plugin.logDebug("ReCaptcha token #2: %s" % token2.group(1)) + + token3 = re.search(r'."asconf".\s.\s,"(.*?)".', html) + self.plugin.logDebug("ReCaptcha token #3: %s" % token3.group(1)) + + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/reload", + post={'c' : token2.group(1), + 'reason': "fi", + 'fbg' : token3.group(1)}) + + token4 = re.search(r'"rresp","(.*?)",', html) + self.plugin.logDebug("ReCaptcha token #4: %s" % token4.group(1)) millis_captcha_loading = int(round(time.time() * 1000)) - captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload", get={"c":recaptchatoken4.group(1)},forceUser=True) - respone_encoded = base64.b64encode('{"response":"%s"}' %captcha_response) - self.plugin.logDebug("Encoded result: %s" %respone_encoded) + captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload", + get={'c':token4.group(1)}, forceUser=True) + response = b64encode('{"response":"%s"}' % captcha_response) + + self.plugin.logDebug("ReCaptcha result: %s" % response) - timeToSolve = int(round(time.time() * 1000)) - millis_captcha_loading - timeToSolveMore = timeToSolve + int(float("0."+str(randint(1,99999999))) * 500) - html = self.plugin.req.load("https://www.google.com/recaptcha/api2/userverify", cookies=True, post={"c":recaptchatoken4.group(1), - "response":respone_encoded, - "t":timeToSolve, - "ct":timeToSolveMore, - "bg":botguardstring}) - recaptchatoken5 = re.search('"uvresp","(.*?)",',html) - self.plugin.logDebug("Captchatoken #5: %s" %recaptchatoken5.group(1)) + timeToSolve = int(round(time.time() * 1000)) - millis_captcha_loading + timeToSolveMore = timeToSolve + int(float("0." + str(randint(1, 99999999))) * 500) - return recaptchatoken5.group(1) + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/userverify", + post={'c' : token4.group(1), + 'response': response, + 't' : timeToSolve, + 'ct' : timeToSolveMore, + 'bg' : botguardstring}) + + token5 = re.search(r'"uvresp","(.*?)",', html) + self.plugin.logDebug("ReCaptcha token #5: %s" % token5.group(1)) + + return token5.group(1), None class AdsCaptcha(CaptchaService): __name__ = "AdsCaptcha" - __version__ = "0.06" + __version__ = "0.07" __description__ = """AdsCaptcha captcha service plugin""" __license__ = "GPLv3" @@ -271,9 +284,9 @@ class AdsCaptcha(CaptchaService): return None - def challenge(self, key=None): + def challenge(self, key=None, html=None): if not key: - if self.detect_key(): + if self.detect_key(html): key = self.key else: errmsg = _("AdsCaptcha key not found") @@ -286,14 +299,15 @@ class AdsCaptcha(CaptchaService): try: challenge = re.search("challenge: '(.+?)',", html).group(1) server = re.search("server: '(.+?)',", html).group(1) - except: + + except AttributeError: errmsg = _("AdsCaptcha challenge pattern not found") self.plugin.fail(errmsg) - raise ValueError(errmsg) + raise AttributeError(errmsg) self.plugin.logDebug("AdsCaptcha challenge: %s" % challenge) - return challenge, self.result(server, challenge) + return self.result(server, challenge), challenge def result(self, server, challenge): @@ -309,7 +323,7 @@ class AdsCaptcha(CaptchaService): class SolveMedia(CaptchaService): __name__ = "SolveMedia" - __version__ = "0.06" + __version__ = "0.07" __description__ = """SolveMedia captcha service plugin""" __license__ = "GPLv3" @@ -319,9 +333,9 @@ class SolveMedia(CaptchaService): KEY_PATTERN = r'api\.solvemedia\.com/papi/challenge\.(?:no)?script\?k=(.+?)["\']' - def challenge(self, key=None): + def challenge(self, key=None, html=None): if not key: - if self.detect_key(): + if self.detect_key(html): key = self.key else: errmsg = _("SolveMedia key not found") @@ -333,14 +347,15 @@ class SolveMedia(CaptchaService): challenge = re.search(r'', html).group(1) server = "http://api.solvemedia.com/papi/media" - except: + + except AttributeError: errmsg = _("SolveMedia challenge pattern not found") self.plugin.fail(errmsg) - raise ValueError(errmsg) + raise AttributeError(errmsg) self.plugin.logDebug("SolveMedia challenge: %s" % challenge) - return challenge, self.result(server, challenge) + return self.result(server, challenge), challenge def result(self, server, challenge): @@ -353,7 +368,7 @@ class SolveMedia(CaptchaService): class AdYouLike(CaptchaService): __name__ = "AdYouLike" - __version__ = "0.02" + __version__ = "0.03" __description__ = """AdYouLike captcha service plugin""" __license__ = "GPLv3" @@ -384,9 +399,9 @@ class AdYouLike(CaptchaService): return None - def challenge(self, key=None): + def challenge(self, key=None, html=None): if not key: - if self.detect_key(): + if self.detect_key(html): key = self.key else: errmsg = _("AdYouLike key not found") @@ -405,10 +420,11 @@ class AdYouLike(CaptchaService): 'callback': callback}) try: challenge = json_loads(re.search(callback + r'\s*\((.+?)\)', html).group(1)) - except: + + except AttributeError: errmsg = _("AdYouLike challenge pattern not found") self.plugin.fail(errmsg) - raise ValueError(errmsg) + raise AttributeError(errmsg) self.plugin.logDebug("AdYouLike challenge: %s" % challenge) @@ -435,10 +451,11 @@ class AdYouLike(CaptchaService): try: instructions_visual = challenge['translations'][server['all']['lang']]['instructions_visual'] result = re.search(u'«(.+?)»', instructions_visual).group(1).strip() - except: + + except AttributeError: errmsg = _("AdYouLike result not found") self.plugin.fail(errmsg) - raise ValueError(errmsg) + raise AttributeError(errmsg) result = {'_ayl_captcha_engine' : "adyoulike", '_ayl_env' : server['all']['env'], -- cgit v1.2.3 From 7b870794d5e76e2eb0fc035d74521969a676edb9 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sat, 24 Jan 2015 01:47:37 +0100 Subject: [CaptchaService] Fix https://github.com/pyload/pyload/issues/1069 --- module/plugins/internal/CaptchaService.py | 64 ++++++++++++++++--------------- 1 file changed, 34 insertions(+), 30 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index db31bd1bd..0223f9a5a 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -12,15 +12,13 @@ from module.common.json_layer import json_loads class CaptchaService: __name__ = "CaptchaService" - __version__ = "0.18" + __version__ = "0.19" __description__ = """Base captcha service plugin""" __license__ = "GPLv3" __authors__ = [("pyLoad Team", "admin@pyload.org")] - KEY_PATTERN = None - key = None #: last key detected @@ -29,22 +27,7 @@ class CaptchaService: def detect_key(self, html=None): - if not html: - if hasattr(self.plugin, "html") and self.plugin.html: - html = self.plugin.html - else: - errmsg = _("%s html not found") % self.__name__ - self.plugin.fail(errmsg) #@TODO: replace all plugin.fail(errmsg) with plugin.error(errmsg) in 0.4.10 - raise TypeError(errmsg) - - m = re.search(self.KEY_PATTERN, html) - if m: - self.key = m.group(1).strip() - self.plugin.logDebug("%s key: %s" % (self.__name__, self.key)) - return self.key - else: - self.plugin.logDebug("%s key not found" % self.__name__) - return None + raise NotImplementedError def challenge(self, key=None, html=None): @@ -57,16 +40,17 @@ class CaptchaService: class ReCaptcha(CaptchaService): __name__ = "ReCaptcha" - __version__ = "0.09" + __version__ = "0.10" __description__ = """ReCaptcha captcha service plugin""" __license__ = "GPLv3" __authors__ = [("pyLoad Team", "admin@pyload.org"), + ("Walter Purcaro", "vuolter@gmail.com"), ("zapp-brannigan", "fuerst.reinje@web.de")] - KEY_PATTERN = r'(?:data-sitekey=["\']|["\']sitekey["\']:\s*["\']|recaptcha(?:/api|\.net)/(?:challenge|noscript)\?k=)([\w-]+)' - KEY_AJAX_PATTERN = r'Recaptcha\.create\s*\(\s*["\']([\w-]+)' + KEY_V2_PATTERN = r'(?:data-sitekey=["\']|["\']sitekey["\']:\s*["\'])([\w-]+)' + KEY_V1_PATTERN = r'(?:recaptcha(?:/api|\.net)/(?:challenge|noscript)\?k=|Recaptcha\.create\s*\(\s*["\'])([\w-]+)' def detect_key(self, html=None): @@ -78,7 +62,7 @@ class ReCaptcha(CaptchaService): self.plugin.fail(errmsg) raise TypeError(errmsg) - m = re.search(self.KEY_PATTERN, html) or re.search(self.KEY_AJAX_PATTERN, html) + m = re.search(self.KEY_V2_PATTERN, html) or re.search(self.KEY_V1_PATTERN, html) if m: self.key = m.group(1).strip() self.plugin.logDebug("ReCaptcha key: %s" % self.key) @@ -88,7 +72,7 @@ class ReCaptcha(CaptchaService): return None - def challenge(self, key=None, html=None): + def challenge(self, key=None, html=None, version=None): if not html: if hasattr(self.plugin, "html") and self.plugin.html: html = self.plugin.html @@ -97,12 +81,13 @@ class ReCaptcha(CaptchaService): self.plugin.fail(errmsg) raise TypeError(errmsg) - challenge = "challenge_%s" % 'new' if re.search(r'sitekey', html) else 'old' + challenge = "challenge_v%s" % ((version if version in (1, 2) else + (2 if re.search(self.KEY_V2_PATTERN, html) else 1)) return getattr(self, challenge)(key, html) - def challenge_old(self, key=None, html=None): + def challenge_v1(self, key=None, html=None): if not key: if self.detect_key(html): key = self.key @@ -174,7 +159,7 @@ class ReCaptcha(CaptchaService): return millis, rpc - def challenge_new(self, key=None, html=None): + def challenge_v2(self, key=None, html=None): if not key: if self.detect_key(html): key = self.key @@ -323,7 +308,7 @@ class AdsCaptcha(CaptchaService): class SolveMedia(CaptchaService): __name__ = "SolveMedia" - __version__ = "0.07" + __version__ = "0.08" __description__ = """SolveMedia captcha service plugin""" __license__ = "GPLv3" @@ -333,6 +318,25 @@ class SolveMedia(CaptchaService): KEY_PATTERN = r'api\.solvemedia\.com/papi/challenge\.(?:no)?script\?k=(.+?)["\']' + def detect_key(self, html=None): + if not html: + if hasattr(self.plugin, "html") and self.plugin.html: + html = self.plugin.html + else: + errmsg = _("SolveMedia html not found") + self.plugin.fail(errmsg) + raise TypeError(errmsg) + + m = re.search(self.KEY_PATTERN, html) + if m: + self.key = m.group(1).strip() + self.plugin.logDebug("SolveMedia key: %s" % self.key) + return self.key + else: + self.plugin.logDebug("SolveMedia key not found") + return None + + def challenge(self, key=None, html=None): if not key: if self.detect_key(html): @@ -368,7 +372,7 @@ class SolveMedia(CaptchaService): class AdYouLike(CaptchaService): __name__ = "AdYouLike" - __version__ = "0.03" + __version__ = "0.04" __description__ = """AdYouLike captcha service plugin""" __license__ = "GPLv3" @@ -428,7 +432,7 @@ class AdYouLike(CaptchaService): self.plugin.logDebug("AdYouLike challenge: %s" % challenge) - return self.result(ayl, challenge) + return self.result(ayl, challenge), challenge def result(self, server, challenge): -- cgit v1.2.3 From 85945226e59dfe75b4005ad3f7db5af41b81172b Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sat, 24 Jan 2015 02:54:04 +0100 Subject: [CaptchaService] Fix typo --- module/plugins/internal/CaptchaService.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index 0223f9a5a..c6e83fe7d 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -12,7 +12,7 @@ from module.common.json_layer import json_loads class CaptchaService: __name__ = "CaptchaService" - __version__ = "0.19" + __version__ = "0.20" __description__ = """Base captcha service plugin""" __license__ = "GPLv3" @@ -40,7 +40,7 @@ class CaptchaService: class ReCaptcha(CaptchaService): __name__ = "ReCaptcha" - __version__ = "0.10" + __version__ = "0.11" __description__ = """ReCaptcha captcha service plugin""" __license__ = "GPLv3" @@ -81,8 +81,8 @@ class ReCaptcha(CaptchaService): self.plugin.fail(errmsg) raise TypeError(errmsg) - challenge = "challenge_v%s" % ((version if version in (1, 2) else - (2 if re.search(self.KEY_V2_PATTERN, html) else 1)) + challenge = "challenge_v%s" % (version if version in (1, 2) else + 2 if re.search(self.KEY_V2_PATTERN, html) else 1) return getattr(self, challenge)(key, html) -- cgit v1.2.3 From 5061a5e1034ee8a26203036fca00e264a62d6905 Mon Sep 17 00:00:00 2001 From: zapp-brannigan Date: Fri, 30 Jan 2015 16:37:47 +0100 Subject: [CaptchaService.py] Fix ReCaptchaV2 Some small changes to make ReCaptchaV2 work again. --- module/plugins/internal/CaptchaService.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index c6e83fe7d..c7dab2a0a 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -12,7 +12,7 @@ from module.common.json_layer import json_loads class CaptchaService: __name__ = "CaptchaService" - __version__ = "0.20" + __version__ = "0.21" __description__ = """Base captcha service plugin""" __license__ = "GPLv3" @@ -40,7 +40,7 @@ class CaptchaService: class ReCaptcha(CaptchaService): __name__ = "ReCaptcha" - __version__ = "0.11" + __version__ = "0.12" __description__ = """ReCaptcha captcha service plugin""" __license__ = "GPLv3" @@ -190,32 +190,34 @@ class ReCaptcha(CaptchaService): token1 = re.search(r'id="recaptcha-token" value="(.*?)">', html) self.plugin.logDebug("ReCaptcha token #1: %s" % token1.group(1)) - + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/frame", get={'c' : token1.group(1), 'hl' : language, 'v' : vers, 'bg' : botguardstring, + 'k' : key, 'usegapi': "1", 'jsh' : jsh}).decode('unicode-escape') token2 = re.search(r'"finput","(.*?)",', html) self.plugin.logDebug("ReCaptcha token #2: %s" % token2.group(1)) - token3 = re.search(r'."asconf".\s.\s,"(.*?)".', html) + token3 = re.search(r'."asconf".\s,".*?".\s,"(.*?)".', html) self.plugin.logDebug("ReCaptcha token #3: %s" % token3.group(1)) html = self.plugin.req.load("https://www.google.com/recaptcha/api2/reload", - post={'c' : token2.group(1), + post={'k' : key, + 'c' : token2.group(1), 'reason': "fi", 'fbg' : token3.group(1)}) token4 = re.search(r'"rresp","(.*?)",', html) self.plugin.logDebug("ReCaptcha token #4: %s" % token4.group(1)) - + millis_captcha_loading = int(round(time.time() * 1000)) captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload", - get={'c':token4.group(1)}, forceUser=True) + get={'c':token4.group(1), 'k':key}, forceUser=True) response = b64encode('{"response":"%s"}' % captcha_response) self.plugin.logDebug("ReCaptcha result: %s" % response) @@ -224,7 +226,8 @@ class ReCaptcha(CaptchaService): timeToSolveMore = timeToSolve + int(float("0." + str(randint(1, 99999999))) * 500) html = self.plugin.req.load("https://www.google.com/recaptcha/api2/userverify", - post={'c' : token4.group(1), + post={'k' : key, + 'c' : token4.group(1), 'response': response, 't' : timeToSolve, 'ct' : timeToSolveMore, -- cgit v1.2.3 From ddccf7b36d7a941e4ab5539ff0c35b1367fe5337 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sat, 31 Jan 2015 03:45:19 +0100 Subject: [ExtractArchive] Fix typo Fix https://github.com/pyload/pyload/issues/1011#issuecomment-72268195, https://github.com/pyload/pyload/issues/1113, https://github.com/pyload/pyload/issues/1115 --- module/plugins/internal/CaptchaService.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index c7dab2a0a..45672ce70 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -190,7 +190,7 @@ class ReCaptcha(CaptchaService): token1 = re.search(r'id="recaptcha-token" value="(.*?)">', html) self.plugin.logDebug("ReCaptcha token #1: %s" % token1.group(1)) - + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/frame", get={'c' : token1.group(1), 'hl' : language, @@ -214,7 +214,7 @@ class ReCaptcha(CaptchaService): token4 = re.search(r'"rresp","(.*?)",', html) self.plugin.logDebug("ReCaptcha token #4: %s" % token4.group(1)) - + millis_captcha_loading = int(round(time.time() * 1000)) captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload", get={'c':token4.group(1), 'k':key}, forceUser=True) -- cgit v1.2.3 From 78e902d280648a9776327ed717e23ec300c6792f Mon Sep 17 00:00:00 2001 From: zapp-brannigan Date: Mon, 9 Feb 2015 12:47:44 +0100 Subject: [CaptchaService.py] Updated Solvemedia Some additional requests to make it work again. --- module/plugins/internal/CaptchaService.py | 40 +++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 7 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index 45672ce70..ecf8385c8 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -12,7 +12,7 @@ from module.common.json_layer import json_loads class CaptchaService: __name__ = "CaptchaService" - __version__ = "0.21" + __version__ = "0.22" __description__ = """Base captcha service plugin""" __license__ = "GPLv3" @@ -190,7 +190,7 @@ class ReCaptcha(CaptchaService): token1 = re.search(r'id="recaptcha-token" value="(.*?)">', html) self.plugin.logDebug("ReCaptcha token #1: %s" % token1.group(1)) - + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/frame", get={'c' : token1.group(1), 'hl' : language, @@ -214,7 +214,7 @@ class ReCaptcha(CaptchaService): token4 = re.search(r'"rresp","(.*?)",', html) self.plugin.logDebug("ReCaptcha token #4: %s" % token4.group(1)) - + millis_captcha_loading = int(round(time.time() * 1000)) captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload", get={'c':token4.group(1), 'k':key}, forceUser=True) @@ -311,7 +311,7 @@ class AdsCaptcha(CaptchaService): class SolveMedia(CaptchaService): __name__ = "SolveMedia" - __version__ = "0.08" + __version__ = "0.09" __description__ = """SolveMedia captcha service plugin""" __license__ = "GPLv3" @@ -331,6 +331,7 @@ class SolveMedia(CaptchaService): raise TypeError(errmsg) m = re.search(self.KEY_PATTERN, html) + magic = re.search(r'name="magic" value="(.*?)"',html) if m: self.key = m.group(1).strip() self.plugin.logDebug("SolveMedia key: %s" % self.key) @@ -340,7 +341,7 @@ class SolveMedia(CaptchaService): return None - def challenge(self, key=None, html=None): + def challenge(self, key=None, html=None, pyfile_url=""): if not key: if self.detect_key(html): key = self.key @@ -361,9 +362,34 @@ class SolveMedia(CaptchaService): raise AttributeError(errmsg) self.plugin.logDebug("SolveMedia challenge: %s" % challenge) + + try: + magic = re.search(r'name="magic" value="(.*?)"',html).group(1) + except AttributeError: + errmsg = _("SolveMedia magic string not found") + self.plugin.fail(errmsg) + raise AttributeError(errmsg) - return self.result(server, challenge), challenge - + result = self.result(server, challenge) + + html = self.plugin.req.load("http://api.solvemedia.com/papi/verify.noscript", + cookies=True, + post={"adcopy_response" : result, + "k" : key, + "l" : "en", + "t" : "img", + "s" : "standard", + "magic" : magic, + "adcopy_challenge" : challenge, + "ref" : pyfile_url}) + try: + url = re.search(r'URL=(.*?)">',html).group(1) + html = self.plugin.req.load(url,cookies=True) + gibberish = re.search(r'id=gibberish>(.*?)',html).group(1) + except: + self.plugin.logDebug("Wrong captcha answer!") + + return result,challenge def result(self, server, challenge): result = self.plugin.decryptCaptcha(server, get={'c': challenge}, imgtype="gif") -- cgit v1.2.3 From 5a0adb38f6ed5eaba0fab771b3f1308e65df14a6 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Mon, 9 Feb 2015 17:21:49 +0100 Subject: [CaptchaService] Cleanup --- module/plugins/internal/CaptchaService.py | 147 +++++++++++++++++------------- 1 file changed, 83 insertions(+), 64 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index ecf8385c8..664d10fb7 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -10,9 +10,9 @@ from urlparse import urljoin, urlparse from module.common.json_layer import json_loads -class CaptchaService: +class CaptchaService(object): __name__ = "CaptchaService" - __version__ = "0.22" + __version__ = "0.23" __description__ = """Base captcha service plugin""" __license__ = "GPLv3" @@ -40,7 +40,7 @@ class CaptchaService: class ReCaptcha(CaptchaService): __name__ = "ReCaptcha" - __version__ = "0.12" + __version__ = "0.13" __description__ = """ReCaptcha captcha service plugin""" __license__ = "GPLv3" @@ -73,21 +73,6 @@ class ReCaptcha(CaptchaService): def challenge(self, key=None, html=None, version=None): - if not html: - if hasattr(self.plugin, "html") and self.plugin.html: - html = self.plugin.html - else: - errmsg = _("ReCaptcha html not found") - self.plugin.fail(errmsg) - raise TypeError(errmsg) - - challenge = "challenge_v%s" % (version if version in (1, 2) else - 2 if re.search(self.KEY_V2_PATTERN, html) else 1) - - return getattr(self, challenge)(key, html) - - - def challenge_v1(self, key=None, html=None): if not key: if self.detect_key(html): key = self.key @@ -96,7 +81,22 @@ class ReCaptcha(CaptchaService): self.plugin.fail(errmsg) raise TypeError(errmsg) - html = self.plugin.req.load("http://www.google.com/recaptcha/api/challenge", get={'k': key}) + if version in (1, 2): + return getattr(self, "_challenge_v%s" % version)(key, html) + + elif not html and hasattr(self.plugin, "html") and self.plugin.html: + version = 2 if re.search(self.KEY_V2_PATTERN, self.plugin.html) else 1 + return self.challenge(key, self.plugin.html, version) + + else: + errmsg = _("ReCaptcha html not found") + self.plugin.fail(errmsg) + raise TypeError(errmsg) + + + def _challenge_v1(self, key): + html = self.plugin.req.load("http://www.google.com/recaptcha/api/challenge", + get={'k': key}) try: challenge = re.search("challenge : '(.+?)',", html).group(1) server = re.search("server : '(.+?)',", html).group(1) @@ -159,20 +159,13 @@ class ReCaptcha(CaptchaService): return millis, rpc - def challenge_v2(self, key=None, html=None): - if not key: - if self.detect_key(html): - key = self.key - else: - errmsg = _("ReCaptcha key not found") - self.plugin.fail(errmsg) - raise TypeError(errmsg) + def _challenge_v2(self, key, parent=None): + if parent is None: + try: + parent = urljoin("http://", urlparse(self.plugin.pyfile.url).netloc) - try: - parent = urljoin("http://", urlparse(self.plugin.pyfile.url).netloc) - - except Exception: - parent = "" + except Exception: + parent = "" botguardstring = "!A" vers, language, jsh = self._collectApiInfo() @@ -190,7 +183,7 @@ class ReCaptcha(CaptchaService): token1 = re.search(r'id="recaptcha-token" value="(.*?)">', html) self.plugin.logDebug("ReCaptcha token #1: %s" % token1.group(1)) - + html = self.plugin.req.load("https://www.google.com/recaptcha/api2/frame", get={'c' : token1.group(1), 'hl' : language, @@ -214,10 +207,12 @@ class ReCaptcha(CaptchaService): token4 = re.search(r'"rresp","(.*?)",', html) self.plugin.logDebug("ReCaptcha token #4: %s" % token4.group(1)) - + millis_captcha_loading = int(round(time.time() * 1000)) captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload", - get={'c':token4.group(1), 'k':key}, forceUser=True) + get={'c':token4.group(1), 'k':key}, + cookies=True, + forceUser=True) response = b64encode('{"response":"%s"}' % captcha_response) self.plugin.logDebug("ReCaptcha result: %s" % response) @@ -236,7 +231,10 @@ class ReCaptcha(CaptchaService): token5 = re.search(r'"uvresp","(.*?)",', html) self.plugin.logDebug("ReCaptcha token #5: %s" % token5.group(1)) - return token5.group(1), None + result = token5.group(1) + + return result, None + class AdsCaptcha(CaptchaService): @@ -283,7 +281,9 @@ class AdsCaptcha(CaptchaService): PublicKey, CaptchaId = key - html = self.plugin.req.load("http://api.adscaptcha.com/Get.aspx", get={'CaptchaId': CaptchaId, 'PublicKey': PublicKey}) + html = self.plugin.req.load("http://api.adscaptcha.com/Get.aspx", + get={'CaptchaId': CaptchaId, + 'PublicKey': PublicKey}) try: challenge = re.search("challenge: '(.+?)',", html).group(1) server = re.search("server: '(.+?)',", html).group(1) @@ -311,7 +311,7 @@ class AdsCaptcha(CaptchaService): class SolveMedia(CaptchaService): __name__ = "SolveMedia" - __version__ = "0.09" + __version__ = "0.10" __description__ = """SolveMedia captcha service plugin""" __license__ = "GPLv3" @@ -331,7 +331,6 @@ class SolveMedia(CaptchaService): raise TypeError(errmsg) m = re.search(self.KEY_PATTERN, html) - magic = re.search(r'name="magic" value="(.*?)"',html) if m: self.key = m.group(1).strip() self.plugin.logDebug("SolveMedia key: %s" % self.key) @@ -341,7 +340,7 @@ class SolveMedia(CaptchaService): return None - def challenge(self, key=None, html=None, pyfile_url=""): + def challenge(self, key=None, html=None): if not key: if self.detect_key(html): key = self.key @@ -350,7 +349,8 @@ class SolveMedia(CaptchaService): self.plugin.fail(errmsg) raise TypeError(errmsg) - html = self.plugin.req.load("http://api.solvemedia.com/papi/challenge.noscript", get={'k': key}) + html = self.plugin.req.load("http://api.solvemedia.com/papi/challenge.noscript", + get={'k': key}) try: challenge = re.search(r'', html).group(1) @@ -362,37 +362,56 @@ class SolveMedia(CaptchaService): raise AttributeError(errmsg) self.plugin.logDebug("SolveMedia challenge: %s" % challenge) - + + result = self.result(server, challenge) + + if not self.verify(result, challenge, key): + self.plugin.logDebug("SolveMedia captcha code was invalid") + + return result, challenge + + + def verify(self, result, challenge, key, ref=None): + if ref is None: + try: + ref = self.plugin.pyfile.url + + except Exception: + ref = "" + try: - magic = re.search(r'name="magic" value="(.*?)"',html).group(1) + magic = re.search(r'name="magic" value="(.+?)"', html).group(1) + except AttributeError: - errmsg = _("SolveMedia magic string not found") + errmsg = _("SolveMedia magic key not found") self.plugin.fail(errmsg) raise AttributeError(errmsg) - result = self.result(server, challenge) - - html = self.plugin.req.load("http://api.solvemedia.com/papi/verify.noscript", - cookies=True, - post={"adcopy_response" : result, - "k" : key, - "l" : "en", - "t" : "img", - "s" : "standard", - "magic" : magic, - "adcopy_challenge" : challenge, - "ref" : pyfile_url}) + html = self.plugin.req.load("http://api.solvemedia.com/papi/verify.noscript", + post={'adcopy_response' : result, + 'k' : key, + 'l' : "en", + 't' : "img", + 's' : "standard", + 'magic' : magic, + 'adcopy_challenge' : challenge, + 'ref' : ref) try: - url = re.search(r'URL=(.*?)">',html).group(1) - html = self.plugin.req.load(url,cookies=True) - gibberish = re.search(r'id=gibberish>(.*?)',html).group(1) - except: - self.plugin.logDebug("Wrong captcha answer!") - - return result,challenge + html = self.plugin.req.load(re.search(r'URL=(.+?)">', html).group(1)) + gibberish = re.search(r'id=gibberish>(.+?)', html).group(1) + + except Exception: + return False + + else: + return True + def result(self, server, challenge): - result = self.plugin.decryptCaptcha(server, get={'c': challenge}, imgtype="gif") + result = self.plugin.decryptCaptcha(server, + get={'c': challenge}, + cookies=True, + imgtype="gif") self.plugin.logDebug("SolveMedia result: %s" % result) -- cgit v1.2.3 From 04f3273f59d9bb2259d43422ba10ed5e682b8926 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Mon, 9 Feb 2015 18:16:37 +0100 Subject: [CaptchaService] Fix https://github.com/pyload/pyload/issues/1162 --- module/plugins/internal/CaptchaService.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index 664d10fb7..8f6a5086d 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -12,7 +12,7 @@ from module.common.json_layer import json_loads class CaptchaService(object): __name__ = "CaptchaService" - __version__ = "0.23" + __version__ = "0.24" __description__ = """Base captcha service plugin""" __license__ = "GPLv3" @@ -311,7 +311,7 @@ class AdsCaptcha(CaptchaService): class SolveMedia(CaptchaService): __name__ = "SolveMedia" - __version__ = "0.10" + __version__ = "0.11" __description__ = """SolveMedia captcha service plugin""" __license__ = "GPLv3" @@ -395,7 +395,7 @@ class SolveMedia(CaptchaService): 's' : "standard", 'magic' : magic, 'adcopy_challenge' : challenge, - 'ref' : ref) + 'ref' : ref}) try: html = self.plugin.req.load(re.search(r'URL=(.+?)">', html).group(1)) gibberish = re.search(r'id=gibberish>(.+?)', html).group(1) -- cgit v1.2.3 From e89ab5a01a986b815102c17ee04bdaceb4eb1ebf Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Tue, 10 Feb 2015 02:22:44 +0100 Subject: [CaptchaService] Fix https://github.com/pyload/pyload/issues/1166 --- module/plugins/internal/CaptchaService.py | 92 ++++++++++++++++--------------- 1 file changed, 47 insertions(+), 45 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index 8f6a5086d..6f2c8e06d 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -8,11 +8,13 @@ from random import random, randint from urlparse import urljoin, urlparse from module.common.json_layer import json_loads +from module.plugins.Plugin import Base -class CaptchaService(object): +#@TODO: Extend (new) Plugin class; remove all `html` args +class CaptchaService(Base): __name__ = "CaptchaService" - __version__ = "0.24" + __version__ = "0.25" __description__ = """Base captcha service plugin""" __license__ = "GPLv3" @@ -24,6 +26,7 @@ class CaptchaService(object): def __init__(self, plugin): self.plugin = plugin + super(CaptchaService, self).__init__(plugin.core) def detect_key(self, html=None): @@ -40,7 +43,7 @@ class CaptchaService(object): class ReCaptcha(CaptchaService): __name__ = "ReCaptcha" - __version__ = "0.13" + __version__ = "0.14" __description__ = """ReCaptcha captcha service plugin""" __license__ = "GPLv3" @@ -65,10 +68,10 @@ class ReCaptcha(CaptchaService): m = re.search(self.KEY_V2_PATTERN, html) or re.search(self.KEY_V1_PATTERN, html) if m: self.key = m.group(1).strip() - self.plugin.logDebug("ReCaptcha key: %s" % self.key) + self.logDebug("Key: %s" % self.key) return self.key else: - self.plugin.logDebug("ReCaptcha key not found") + self.logDebug("Key not found") return None @@ -82,7 +85,7 @@ class ReCaptcha(CaptchaService): raise TypeError(errmsg) if version in (1, 2): - return getattr(self, "_challenge_v%s" % version)(key, html) + return getattr(self, "_challenge_v%s" % version)(key) elif not html and hasattr(self.plugin, "html") and self.plugin.html: version = 2 if re.search(self.KEY_V2_PATTERN, self.plugin.html) else 1 @@ -106,7 +109,7 @@ class ReCaptcha(CaptchaService): self.plugin.fail(errmsg) raise AttributeError(errmsg) - self.plugin.logDebug("ReCaptcha challenge: %s" % challenge) + self.logDebug("Challenge: %s" % challenge) return self.result(server, challenge), challenge @@ -118,7 +121,7 @@ class ReCaptcha(CaptchaService): forceUser=True, imgtype="jpg") - self.plugin.logDebug("ReCaptcha result: %s" % result) + self.logDebug("Result: %s" % result) return result @@ -128,17 +131,17 @@ class ReCaptcha(CaptchaService): a = re.search(r'po.src = \'(.*?)\';', html).group(1) vers = a.split("/")[5] - self.plugin.logDebug("ReCaptcha API version: %s" %vers) + self.logDebug("API version: %s" %vers) language = a.split("__")[1].split(".")[0] - self.plugin.logDebug("ReCaptcha API language: %s" % language) + self.logDebug("API language: %s" % language) html = self.plugin.req.load("https://apis.google.com/js/api.js") b = re.search(r'"h":"(.*?)","', html).group(1) jsh = b.decode('unicode-escape') - self.plugin.logDebug("ReCaptcha API jsh-string: %s" % jsh) + self.logDebug("API jsh-string: %s" % jsh) return vers, language, jsh @@ -148,13 +151,13 @@ class ReCaptcha(CaptchaService): millis = int(round(time.time() * 1000)) - self.plugin.logDebug("ReCaptcha time: %s" % millis) + self.logDebug("Time: %s" % millis) rand = randint(1, 99999999) a = "0.%s" % str(rand * 2147483647) rpc = int(100000000 * float(a)) - self.plugin.logDebug("ReCaptcha rpc-token: %s" % rpc) + self.logDebug("Rpc-token: %s" % rpc) return millis, rpc @@ -182,7 +185,7 @@ class ReCaptcha(CaptchaService): 'rpctoken': rpc}) token1 = re.search(r'id="recaptcha-token" value="(.*?)">', html) - self.plugin.logDebug("ReCaptcha token #1: %s" % token1.group(1)) + self.logDebug("Token #1: %s" % token1.group(1)) html = self.plugin.req.load("https://www.google.com/recaptcha/api2/frame", get={'c' : token1.group(1), @@ -194,10 +197,10 @@ class ReCaptcha(CaptchaService): 'jsh' : jsh}).decode('unicode-escape') token2 = re.search(r'"finput","(.*?)",', html) - self.plugin.logDebug("ReCaptcha token #2: %s" % token2.group(1)) + self.logDebug("Token #2: %s" % token2.group(1)) token3 = re.search(r'."asconf".\s,".*?".\s,"(.*?)".', html) - self.plugin.logDebug("ReCaptcha token #3: %s" % token3.group(1)) + self.logDebug("Token #3: %s" % token3.group(1)) html = self.plugin.req.load("https://www.google.com/recaptcha/api2/reload", post={'k' : key, @@ -206,7 +209,7 @@ class ReCaptcha(CaptchaService): 'fbg' : token3.group(1)}) token4 = re.search(r'"rresp","(.*?)",', html) - self.plugin.logDebug("ReCaptcha token #4: %s" % token4.group(1)) + self.logDebug("Token #4: %s" % token4.group(1)) millis_captcha_loading = int(round(time.time() * 1000)) captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload", @@ -215,7 +218,7 @@ class ReCaptcha(CaptchaService): forceUser=True) response = b64encode('{"response":"%s"}' % captcha_response) - self.plugin.logDebug("ReCaptcha result: %s" % response) + self.logDebug("Result: %s" % response) timeToSolve = int(round(time.time() * 1000)) - millis_captcha_loading timeToSolveMore = timeToSolve + int(float("0." + str(randint(1, 99999999))) * 500) @@ -229,7 +232,7 @@ class ReCaptcha(CaptchaService): 'bg' : botguardstring}) token5 = re.search(r'"uvresp","(.*?)",', html) - self.plugin.logDebug("ReCaptcha token #5: %s" % token5.group(1)) + self.logDebug("Token #5: %s" % token5.group(1)) result = token5.group(1) @@ -239,7 +242,7 @@ class ReCaptcha(CaptchaService): class AdsCaptcha(CaptchaService): __name__ = "AdsCaptcha" - __version__ = "0.07" + __version__ = "0.08" __description__ = """AdsCaptcha captcha service plugin""" __license__ = "GPLv3" @@ -263,10 +266,10 @@ class AdsCaptcha(CaptchaService): n = re.search(self.CAPTCHAID_PATTERN, html) if m and n: self.key = (m.group(1).strip(), n.group(1).strip()) #: key is the tuple(PublicKey, CaptchaId) - self.plugin.logDebug("AdsCaptcha key|id: %s | %s" % self.key) + self.logDebug("Key|id: %s | %s" % self.key) return self.key else: - self.plugin.logDebug("AdsCaptcha key or id not found") + self.logDebug("Key or id not found") return None @@ -293,7 +296,7 @@ class AdsCaptcha(CaptchaService): self.plugin.fail(errmsg) raise AttributeError(errmsg) - self.plugin.logDebug("AdsCaptcha challenge: %s" % challenge) + self.logDebug("Challenge: %s" % challenge) return self.result(server, challenge), challenge @@ -304,14 +307,14 @@ class AdsCaptcha(CaptchaService): cookies=True, imgtype="jpg") - self.plugin.logDebug("AdsCaptcha result: %s" % result) + self.logDebug("Result: %s" % result) return result class SolveMedia(CaptchaService): __name__ = "SolveMedia" - __version__ = "0.11" + __version__ = "0.12" __description__ = """SolveMedia captcha service plugin""" __license__ = "GPLv3" @@ -333,10 +336,10 @@ class SolveMedia(CaptchaService): m = re.search(self.KEY_PATTERN, html) if m: self.key = m.group(1).strip() - self.plugin.logDebug("SolveMedia key: %s" % self.key) + self.logDebug("Key: %s" % self.key) return self.key else: - self.plugin.logDebug("SolveMedia key not found") + self.logDebug("Key not found") return None @@ -361,17 +364,24 @@ class SolveMedia(CaptchaService): self.plugin.fail(errmsg) raise AttributeError(errmsg) - self.plugin.logDebug("SolveMedia challenge: %s" % challenge) + self.logDebug("Challenge: %s" % challenge) result = self.result(server, challenge) - if not self.verify(result, challenge, key): - self.plugin.logDebug("SolveMedia captcha code was invalid") + try: + magic = re.search(r'name="magic" value="(.+?)"', html).group(1) + + except AttributeError: + self.logDebug("Magic code not found") + + else: + if not self._verify(key, magic, result, challenge): + self.logDebug("Captcha code was invalid") return result, challenge - def verify(self, result, challenge, key, ref=None): + def _verify(self, key, magic, result, challenge, ref=None): #@TODO: Clean up if ref is None: try: ref = self.plugin.pyfile.url @@ -379,14 +389,6 @@ class SolveMedia(CaptchaService): except Exception: ref = "" - try: - magic = re.search(r'name="magic" value="(.+?)"', html).group(1) - - except AttributeError: - errmsg = _("SolveMedia magic key not found") - self.plugin.fail(errmsg) - raise AttributeError(errmsg) - html = self.plugin.req.load("http://api.solvemedia.com/papi/verify.noscript", post={'adcopy_response' : result, 'k' : key, @@ -413,14 +415,14 @@ class SolveMedia(CaptchaService): cookies=True, imgtype="gif") - self.plugin.logDebug("SolveMedia result: %s" % result) + self.logDebug("Result: %s" % result) return result class AdYouLike(CaptchaService): __name__ = "AdYouLike" - __version__ = "0.04" + __version__ = "0.05" __description__ = """AdYouLike captcha service plugin""" __license__ = "GPLv3" @@ -444,10 +446,10 @@ class AdYouLike(CaptchaService): n = re.search(self.CALLBACK_PATTERN, html) if m and n: self.key = (m.group(1).strip(), n.group(1).strip()) - self.plugin.logDebug("AdYouLike ayl|callback: %s | %s" % self.key) + self.logDebug("Ayl|callback: %s | %s" % self.key) return self.key #: key is the tuple(ayl, callback) else: - self.plugin.logDebug("AdYouLike ayl or callback not found") + self.logDebug("Ayl or callback not found") return None @@ -478,7 +480,7 @@ class AdYouLike(CaptchaService): self.plugin.fail(errmsg) raise AttributeError(errmsg) - self.plugin.logDebug("AdYouLike challenge: %s" % challenge) + self.logDebug("Challenge: %s" % challenge) return self.result(ayl, challenge), challenge @@ -515,6 +517,6 @@ class AdYouLike(CaptchaService): '_ayl_token_challenge': challenge['token'], '_ayl_response' : response} - self.plugin.logDebug("AdYouLike result: %s" % result) + self.logDebug("Result: %s" % result) return result -- cgit v1.2.3 From 93eb54614d512396a5505cb9bdea4e201920b434 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sun, 1 Mar 2015 00:33:21 +0100 Subject: Spare code cosmetics --- module/plugins/internal/CaptchaService.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index 6f2c8e06d..fcb8f0095 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -14,6 +14,7 @@ from module.plugins.Plugin import Base #@TODO: Extend (new) Plugin class; remove all `html` args class CaptchaService(Base): __name__ = "CaptchaService" + __type__ = "captcha" __version__ = "0.25" __description__ = """Base captcha service plugin""" @@ -43,6 +44,7 @@ class CaptchaService(Base): class ReCaptcha(CaptchaService): __name__ = "ReCaptcha" + __type__ = "captcha" __version__ = "0.14" __description__ = """ReCaptcha captcha service plugin""" @@ -239,9 +241,9 @@ class ReCaptcha(CaptchaService): return result, None - class AdsCaptcha(CaptchaService): __name__ = "AdsCaptcha" + __type__ = "captcha" __version__ = "0.08" __description__ = """AdsCaptcha captcha service plugin""" @@ -314,6 +316,7 @@ class AdsCaptcha(CaptchaService): class SolveMedia(CaptchaService): __name__ = "SolveMedia" + __type__ = "captcha" __version__ = "0.12" __description__ = """SolveMedia captcha service plugin""" @@ -422,6 +425,7 @@ class SolveMedia(CaptchaService): class AdYouLike(CaptchaService): __name__ = "AdYouLike" + __type__ = "captcha" __version__ = "0.05" __description__ = """AdYouLike captcha service plugin""" -- cgit v1.2.3 From 589121e80835c63aea0880a53c6678de5c31c16e Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sat, 28 Mar 2015 01:59:01 +0100 Subject: Spare code cosmetics --- module/plugins/internal/CaptchaService.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index fcb8f0095..3978a96c4 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -251,8 +251,8 @@ class AdsCaptcha(CaptchaService): __authors__ = [("pyLoad Team", "admin@pyload.org")] - CAPTCHAID_PATTERN = r'api\.adscaptcha\.com/Get\.aspx\?[^"\']*CaptchaId=(\d+)' - PUBLICKEY_PATTERN = r'api\.adscaptcha\.com/Get\.aspx\?[^"\']*PublicKey=([\w-]+)' + CAPTCHAID_PATTERN = r'api\.adscaptcha\.com/Get\.aspx\?.*?CaptchaId=(\d+)' + PUBLICKEY_PATTERN = r'api\.adscaptcha\.com/Get\.aspx\?.*?PublicKey=([\w-]+)' def detect_key(self, html=None): @@ -358,7 +358,7 @@ class SolveMedia(CaptchaService): html = self.plugin.req.load("http://api.solvemedia.com/papi/challenge.noscript", get={'k': key}) try: - challenge = re.search(r'', + challenge = re.search(r'', html).group(1) server = "http://api.solvemedia.com/papi/media" -- cgit v1.2.3 From 0099cce1f73598ad271bbb8685362f8e10a6c3ba Mon Sep 17 00:00:00 2001 From: zapp-brannigan Date: Thu, 9 Apr 2015 11:28:01 +0200 Subject: Update CaptchaService.py Fix ReCaptchaV2 --- module/plugins/internal/CaptchaService.py | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index 3978a96c4..ec938079a 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -15,7 +15,7 @@ from module.plugins.Plugin import Base class CaptchaService(Base): __name__ = "CaptchaService" __type__ = "captcha" - __version__ = "0.25" + __version__ = "0.26" __description__ = """Base captcha service plugin""" __license__ = "GPLv3" @@ -45,7 +45,7 @@ class CaptchaService(Base): class ReCaptcha(CaptchaService): __name__ = "ReCaptcha" __type__ = "captcha" - __version__ = "0.14" + __version__ = "0.15" __description__ = """ReCaptcha captcha service plugin""" __license__ = "GPLv3" @@ -201,21 +201,12 @@ class ReCaptcha(CaptchaService): token2 = re.search(r'"finput","(.*?)",', html) self.logDebug("Token #2: %s" % token2.group(1)) - token3 = re.search(r'."asconf".\s,".*?".\s,"(.*?)".', html) + token3 = re.search(r'"rresp","(.*?)",', html) self.logDebug("Token #3: %s" % token3.group(1)) - html = self.plugin.req.load("https://www.google.com/recaptcha/api2/reload", - post={'k' : key, - 'c' : token2.group(1), - 'reason': "fi", - 'fbg' : token3.group(1)}) - - token4 = re.search(r'"rresp","(.*?)",', html) - self.logDebug("Token #4: %s" % token4.group(1)) - millis_captcha_loading = int(round(time.time() * 1000)) captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload", - get={'c':token4.group(1), 'k':key}, + get={'c':token3.group(1), 'k':key}, cookies=True, forceUser=True) response = b64encode('{"response":"%s"}' % captcha_response) @@ -227,16 +218,16 @@ class ReCaptcha(CaptchaService): html = self.plugin.req.load("https://www.google.com/recaptcha/api2/userverify", post={'k' : key, - 'c' : token4.group(1), + 'c' : token3.group(1), 'response': response, 't' : timeToSolve, 'ct' : timeToSolveMore, 'bg' : botguardstring}) - token5 = re.search(r'"uvresp","(.*?)",', html) - self.logDebug("Token #5: %s" % token5.group(1)) + token4 = re.search(r'"uvresp","(.*?)",', html) + self.logDebug("Token #4: %s" % token4.group(1)) - result = token5.group(1) + result = token4.group(1) return result, None -- cgit v1.2.3 From 1ef93e913238275f7657d496ba3d2e7eeb5a30a2 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Fri, 1 May 2015 01:06:01 +0200 Subject: Use 'import' instead 'from' --- module/plugins/internal/CaptchaService.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index ec938079a..b6afad22a 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- +import random import re import time +import urlparse from base64 import b64encode -from random import random, randint -from urlparse import urljoin, urlparse from module.common.json_layer import json_loads from module.plugins.Plugin import Base @@ -155,7 +155,7 @@ class ReCaptcha(CaptchaService): self.logDebug("Time: %s" % millis) - rand = randint(1, 99999999) + rand = random.randint(1, 99999999) a = "0.%s" % str(rand * 2147483647) rpc = int(100000000 * float(a)) @@ -167,7 +167,7 @@ class ReCaptcha(CaptchaService): def _challenge_v2(self, key, parent=None): if parent is None: try: - parent = urljoin("http://", urlparse(self.plugin.pyfile.url).netloc) + parent = urlparse.urljoin("http://", urlparse.urlparse(self.plugin.pyfile.url).netloc) except Exception: parent = "" @@ -214,7 +214,7 @@ class ReCaptcha(CaptchaService): self.logDebug("Result: %s" % response) timeToSolve = int(round(time.time() * 1000)) - millis_captcha_loading - timeToSolveMore = timeToSolve + int(float("0." + str(randint(1, 99999999))) * 500) + timeToSolveMore = timeToSolve + int(float("0." + str(random.randint(1, 99999999))) * 500) html = self.plugin.req.load("https://www.google.com/recaptcha/api2/userverify", post={'k' : key, @@ -296,7 +296,7 @@ class AdsCaptcha(CaptchaService): def result(self, server, challenge): result = self.plugin.decryptCaptcha("%sChallenge.aspx" % server, - get={'cid': challenge, 'dummy': random()}, + get={'cid': challenge, 'dummy': random.random()}, cookies=True, imgtype="jpg") -- cgit v1.2.3 From 15b1c2636c24d0345bf1c86a43c4a235a0b44455 Mon Sep 17 00:00:00 2001 From: zapp-brannigan Date: Sun, 24 May 2015 11:14:04 +0200 Subject: [CaptchaService.py] Update ReCaptchaV1 Fix https://github.com/pyload/pyload/issues/1423 --- module/plugins/internal/CaptchaService.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index b6afad22a..e349b5b42 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -15,7 +15,7 @@ from module.plugins.Plugin import Base class CaptchaService(Base): __name__ = "CaptchaService" __type__ = "captcha" - __version__ = "0.26" + __version__ = "0.27" __description__ = """Base captcha service plugin""" __license__ = "GPLv3" @@ -45,7 +45,7 @@ class CaptchaService(Base): class ReCaptcha(CaptchaService): __name__ = "ReCaptcha" __type__ = "captcha" - __version__ = "0.15" + __version__ = "0.16" __description__ = """ReCaptcha captcha service plugin""" __license__ = "GPLv3" @@ -113,10 +113,26 @@ class ReCaptcha(CaptchaService): self.logDebug("Challenge: %s" % challenge) - return self.result(server, challenge), challenge + return self.result(server, challenge, key) #, challenge - def result(self, server, challenge): + def result(self, server, challenge, key): + self.plugin.req.load("http://www.google.com/recaptcha/api/js/recaptcha.js", cookies=True) + html = self.plugin.req.load("http://www.google.com/recaptcha/api/reload", + get={"c":challenge, + "k":key, + "reason":"i", + "type":"image"}, + cookies=True) + + try: + challenge = re.search('\(\'(.+?)\',',html).group(1) + except AttributeError: + errmsg = _("ReCaptcha second challenge pattern not found") + self.plugin.fail(errmsg) + raise AttributeError(errmsg) + + self.logDebug("Second challenge: %s" %challenge) result = self.plugin.decryptCaptcha("%simage" % server, get={'c': challenge}, cookies=True, @@ -125,7 +141,7 @@ class ReCaptcha(CaptchaService): self.logDebug("Result: %s" % result) - return result + return result, challenge def _collectApiInfo(self): -- cgit v1.2.3 From 46b1695da26e6fab544844fc46ad352037396d62 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Mon, 25 May 2015 03:07:02 +0200 Subject: [CaptchaService] Improve SolveMedia --- module/plugins/internal/CaptchaService.py | 175 +++++++++++++----------------- 1 file changed, 76 insertions(+), 99 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index e349b5b42..5badea344 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -15,7 +15,7 @@ from module.plugins.Plugin import Base class CaptchaService(Base): __name__ = "CaptchaService" __type__ = "captcha" - __version__ = "0.27" + __version__ = "0.28" __description__ = """Base captcha service plugin""" __license__ = "GPLv3" @@ -30,6 +30,12 @@ class CaptchaService(Base): super(CaptchaService, self).__init__(plugin.core) + #@TODO: Recheck in 0.4.10 + def fail(self, reason): + self.plugin.fail(reason) + raise AttributeError(reason) + + def detect_key(self, html=None): raise NotImplementedError @@ -45,7 +51,7 @@ class CaptchaService(Base): class ReCaptcha(CaptchaService): __name__ = "ReCaptcha" __type__ = "captcha" - __version__ = "0.16" + __version__ = "0.17" __description__ = """ReCaptcha captcha service plugin""" __license__ = "GPLv3" @@ -63,9 +69,7 @@ class ReCaptcha(CaptchaService): if hasattr(self.plugin, "html") and self.plugin.html: html = self.plugin.html else: - errmsg = _("ReCaptcha html not found") - self.plugin.fail(errmsg) - raise TypeError(errmsg) + self.fail(_("ReCaptcha html not found")) m = re.search(self.KEY_V2_PATTERN, html) or re.search(self.KEY_V1_PATTERN, html) if m: @@ -82,9 +86,7 @@ class ReCaptcha(CaptchaService): if self.detect_key(html): key = self.key else: - errmsg = _("ReCaptcha key not found") - self.plugin.fail(errmsg) - raise TypeError(errmsg) + self.fail(_("ReCaptcha key not found")) if version in (1, 2): return getattr(self, "_challenge_v%s" % version)(key) @@ -94,9 +96,7 @@ class ReCaptcha(CaptchaService): return self.challenge(key, self.plugin.html, version) else: - errmsg = _("ReCaptcha html not found") - self.plugin.fail(errmsg) - raise TypeError(errmsg) + self.fail(_("ReCaptcha html not found")) def _challenge_v1(self, key): @@ -107,31 +107,27 @@ class ReCaptcha(CaptchaService): server = re.search("server : '(.+?)',", html).group(1) except AttributeError: - errmsg = _("ReCaptcha challenge pattern not found") - self.plugin.fail(errmsg) - raise AttributeError(errmsg) + self.fail(_("ReCaptcha challenge pattern not found")) self.logDebug("Challenge: %s" % challenge) - return self.result(server, challenge, key) #, challenge + return self.result(server, challenge, key) def result(self, server, challenge, key): - self.plugin.req.load("http://www.google.com/recaptcha/api/js/recaptcha.js", cookies=True) + self.plugin.req.load("http://www.google.com/recaptcha/api/js/recaptcha.js") html = self.plugin.req.load("http://www.google.com/recaptcha/api/reload", - get={"c":challenge, - "k":key, - "reason":"i", - "type":"image"}, - cookies=True) - + get={'c' : challenge, + 'k' : key, + 'reason': "i", + 'type' : "image"}) + try: challenge = re.search('\(\'(.+?)\',',html).group(1) + except AttributeError: - errmsg = _("ReCaptcha second challenge pattern not found") - self.plugin.fail(errmsg) - raise AttributeError(errmsg) - + self.fail(_("ReCaptcha second challenge pattern not found")) + self.logDebug("Second challenge: %s" %challenge) result = self.plugin.decryptCaptcha("%simage" % server, get={'c': challenge}, @@ -251,7 +247,7 @@ class ReCaptcha(CaptchaService): class AdsCaptcha(CaptchaService): __name__ = "AdsCaptcha" __type__ = "captcha" - __version__ = "0.08" + __version__ = "0.09" __description__ = """AdsCaptcha captcha service plugin""" __license__ = "GPLv3" @@ -267,15 +263,13 @@ class AdsCaptcha(CaptchaService): if hasattr(self.plugin, "html") and self.plugin.html: html = self.plugin.html else: - errmsg = _("AdsCaptcha html not found") - self.plugin.fail(errmsg) - raise TypeError(errmsg) + self.fail(_("AdsCaptcha html not found")) m = re.search(self.PUBLICKEY_PATTERN, html) n = re.search(self.CAPTCHAID_PATTERN, html) if m and n: self.key = (m.group(1).strip(), n.group(1).strip()) #: key is the tuple(PublicKey, CaptchaId) - self.logDebug("Key|id: %s | %s" % self.key) + self.logDebug("Key: %s | ID: %s" % self.key) return self.key else: self.logDebug("Key or id not found") @@ -287,9 +281,7 @@ class AdsCaptcha(CaptchaService): if self.detect_key(html): key = self.key else: - errmsg = _("AdsCaptcha key not found") - self.plugin.fail(errmsg) - raise TypeError(errmsg) + self.fail(_("AdsCaptcha key not found")) PublicKey, CaptchaId = key @@ -301,9 +293,7 @@ class AdsCaptcha(CaptchaService): server = re.search("server: '(.+?)',", html).group(1) except AttributeError: - errmsg = _("AdsCaptcha challenge pattern not found") - self.plugin.fail(errmsg) - raise AttributeError(errmsg) + self.fail(_("AdsCaptcha challenge pattern not found")) self.logDebug("Challenge: %s" % challenge) @@ -324,7 +314,7 @@ class AdsCaptcha(CaptchaService): class SolveMedia(CaptchaService): __name__ = "SolveMedia" __type__ = "captcha" - __version__ = "0.12" + __version__ = "0.13" __description__ = """SolveMedia captcha service plugin""" __license__ = "GPLv3" @@ -339,9 +329,7 @@ class SolveMedia(CaptchaService): if hasattr(self.plugin, "html") and self.plugin.html: html = self.plugin.html else: - errmsg = _("SolveMedia html not found") - self.plugin.fail(errmsg) - raise TypeError(errmsg) + self.fail(_("SolveMedia html not found")) m = re.search(self.KEY_PATTERN, html) if m: @@ -358,65 +346,62 @@ class SolveMedia(CaptchaService): if self.detect_key(html): key = self.key else: - errmsg = _("SolveMedia key not found") - self.plugin.fail(errmsg) - raise TypeError(errmsg) + self.fail(_("SolveMedia key not found")) html = self.plugin.req.load("http://api.solvemedia.com/papi/challenge.noscript", get={'k': key}) - try: - challenge = re.search(r'', - html).group(1) - server = "http://api.solvemedia.com/papi/media" - except AttributeError: - errmsg = _("SolveMedia challenge pattern not found") - self.plugin.fail(errmsg) - raise AttributeError(errmsg) - - self.logDebug("Challenge: %s" % challenge) - - result = self.result(server, challenge) - - try: - magic = re.search(r'name="magic" value="(.+?)"', html).group(1) + for i in xrange(1, 11): + try: + magic = re.search(r'name="magic" value="(.+?)"', html).group(1) - except AttributeError: - self.logDebug("Magic code not found") + except AttributeError: + self.logWarning("Magic pattern not found") + magic = None - else: - if not self._verify(key, magic, result, challenge): - self.logDebug("Captcha code was invalid") + try: + challenge = re.search(r'', + html).group(1) - return result, challenge + except AttributeError: + self.fail(_("SolveMedia challenge pattern not found")) + else: + self.logDebug("Challenge: %s" % challenge) - def _verify(self, key, magic, result, challenge, ref=None): #@TODO: Clean up - if ref is None: try: - ref = self.plugin.pyfile.url + result = self.result("http://api.solvemedia.com/papi/media", challenge) except Exception: - ref = "" - - html = self.plugin.req.load("http://api.solvemedia.com/papi/verify.noscript", - post={'adcopy_response' : result, - 'k' : key, - 'l' : "en", - 't' : "img", - 's' : "standard", - 'magic' : magic, - 'adcopy_challenge' : challenge, - 'ref' : ref}) - try: - html = self.plugin.req.load(re.search(r'URL=(.+?)">', html).group(1)) - gibberish = re.search(r'id=gibberish>(.+?)', html).group(1) + result = None + + html = self.plugin.req.load("http://api.solvemedia.com/papi/verify.noscript", + post={'adcopy_response' : result, + 'k' : key, + 'l' : "en", + 't' : "img", + 's' : "standard", + 'magic' : magic, + 'adcopy_challenge': challenge, + 'ref' : self.plugin.pyfile.url}) + try: + redirect = re.search(r'URL=(.+?)">', html).group(1) + + except AttributeError: + self.fail(_("SolveMedia verify pattern not found")) - except Exception: - return False + else: + if "error" in html: + self.logError("Captcha code was invalid") + self.logDebug("Retry #%d" % i) + html = self.plugin.req.load(redirect) + else: + break else: - return True + self.fail(_("SolveMedia max retries exceeded")) + + return result, challenge def result(self, server, challenge): @@ -433,7 +418,7 @@ class SolveMedia(CaptchaService): class AdYouLike(CaptchaService): __name__ = "AdYouLike" __type__ = "captcha" - __version__ = "0.05" + __version__ = "0.06" __description__ = """AdYouLike captcha service plugin""" __license__ = "GPLv3" @@ -449,15 +434,13 @@ class AdYouLike(CaptchaService): if hasattr(self.plugin, "html") and self.plugin.html: html = self.plugin.html else: - errmsg = _("AdYouLike html not found") - self.plugin.fail(errmsg) - raise TypeError(errmsg) + self.fail(_("AdYouLike html not found")) m = re.search(self.AYL_PATTERN, html) n = re.search(self.CALLBACK_PATTERN, html) if m and n: self.key = (m.group(1).strip(), n.group(1).strip()) - self.logDebug("Ayl|callback: %s | %s" % self.key) + self.logDebug("Ayl: %s | Callback: %s" % self.key) return self.key #: key is the tuple(ayl, callback) else: self.logDebug("Ayl or callback not found") @@ -469,9 +452,7 @@ class AdYouLike(CaptchaService): if self.detect_key(html): key = self.key else: - errmsg = _("AdYouLike key not found") - self.plugin.fail(errmsg) - raise TypeError(errmsg) + self.fail(_("AdYouLike key not found")) ayl, callback = key @@ -487,9 +468,7 @@ class AdYouLike(CaptchaService): challenge = json_loads(re.search(callback + r'\s*\((.+?)\)', html).group(1)) except AttributeError: - errmsg = _("AdYouLike challenge pattern not found") - self.plugin.fail(errmsg) - raise AttributeError(errmsg) + self.fail(_("AdYouLike challenge pattern not found")) self.logDebug("Challenge: %s" % challenge) @@ -518,9 +497,7 @@ class AdYouLike(CaptchaService): result = re.search(u'«(.+?)»', instructions_visual).group(1).strip() except AttributeError: - errmsg = _("AdYouLike result not found") - self.plugin.fail(errmsg) - raise AttributeError(errmsg) + self.fail(_("AdYouLike result not found")) result = {'_ayl_captcha_engine' : "adyoulike", '_ayl_env' : server['all']['env'], -- cgit v1.2.3 From 436b5d60fc52bc88e0973ec09527bb5907542142 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Mon, 25 May 2015 12:37:27 +0200 Subject: [CaptchaService] Improve SolveMedia (2) --- module/plugins/internal/CaptchaService.py | 379 ++++++++++++++---------------- 1 file changed, 179 insertions(+), 200 deletions(-) (limited to 'module/plugins/internal/CaptchaService.py') diff --git a/module/plugins/internal/CaptchaService.py b/module/plugins/internal/CaptchaService.py index 5badea344..e51844965 100644 --- a/module/plugins/internal/CaptchaService.py +++ b/module/plugins/internal/CaptchaService.py @@ -8,14 +8,14 @@ import urlparse from base64 import b64encode from module.common.json_layer import json_loads -from module.plugins.Plugin import Base +from module.plugins.Plugin import Base, Fail #@TODO: Extend (new) Plugin class; remove all `html` args class CaptchaService(Base): __name__ = "CaptchaService" __type__ = "captcha" - __version__ = "0.28" + __version__ = "0.29" __description__ = """Base captcha service plugin""" __license__ = "GPLv3" @@ -36,6 +36,22 @@ class CaptchaService(Base): raise AttributeError(reason) + #@TODO: Recheck in 0.4.10 + def retrieve_key(self, html): + if self.detect_key(html): + return self.key + else: + self.fail(_("%s key not found") % self.__name__) + + + #@TODO: Recheck in 0.4.10 + def retrieve_html(self): + if hasattr(self.plugin, "html") and self.plugin.html: + return self.plugin.html + else: + self.fail(_("%s html not found") % self.__name__) + + def detect_key(self, html=None): raise NotImplementedError @@ -48,6 +64,148 @@ class CaptchaService(Base): raise NotImplementedError +class AdYouLike(CaptchaService): + __name__ = "AdYouLike" + __type__ = "captcha" + __version__ = "0.06" + + __description__ = """AdYouLike captcha service plugin""" + __license__ = "GPLv3" + __authors__ = [("Walter Purcaro", "vuolter@gmail.com")] + + + AYL_PATTERN = r'Adyoulike\.create\s*\((.+?)\)' + CALLBACK_PATTERN = r'(Adyoulike\.g\._jsonp_\d+)' + + + def detect_key(self, html=None): + html = html or self.retrieve_html() + + m = re.search(self.AYL_PATTERN, html) + n = re.search(self.CALLBACK_PATTERN, html) + if m and n: + self.key = (m.group(1).strip(), n.group(1).strip()) + self.logDebug("Ayl: %s | Callback: %s" % self.key) + return self.key #: key is the tuple(ayl, callback) + else: + self.logWarning("Ayl or callback pattern not found") + return None + + + def challenge(self, key=None, html=None): + ayl, callback = key or self.retrieve_key(html) + + # {"adyoulike":{"key":"P~zQ~O0zV0WTiAzC-iw0navWQpCLoYEP"}, + # "all":{"element_id":"ayl_private_cap_92300","lang":"fr","env":"prod"}} + ayl = json_loads(ayl) + + html = self.plugin.req.load("http://api-ayl.appspot.com/challenge", + get={'key' : ayl['adyoulike']['key'], + 'env' : ayl['all']['env'], + 'callback': callback}) + try: + challenge = json_loads(re.search(callback + r'\s*\((.+?)\)', html).group(1)) + + except AttributeError: + self.fail(_("AdYouLike challenge pattern not found")) + + self.logDebug("Challenge: %s" % challenge) + + return self.result(ayl, challenge), challenge + + + def result(self, server, challenge): + # Adyoulike.g._jsonp_5579316662423138 + # ({"translations":{"fr":{"instructions_visual":"Recopiez « Soonnight » ci-dessous :"}}, + # "site_under":true,"clickable":true,"pixels":{"VIDEO_050":[],"DISPLAY":[],"VIDEO_000":[],"VIDEO_100":[], + # "VIDEO_025":[],"VIDEO_075":[]},"medium_type":"image/adyoulike", + # "iframes":{"big":""},"shares":{},"id":256, + # "token":"e6QuI4aRSnbIZJg02IsV6cp4JQ9~MjA1","formats":{"small":{"y":300,"x":0,"w":300,"h":60}, + # "big":{"y":0,"x":0,"w":300,"h":250},"hover":{"y":440,"x":0,"w":300,"h":60}}, + # "tid":"SqwuAdxT1EZoi4B5q0T63LN2AkiCJBg5"}) + + if isinstance(server, basestring): + server = json_loads(server) + + if isinstance(challenge, basestring): + challenge = json_loads(challenge) + + try: + instructions_visual = challenge['translations'][server['all']['lang']]['instructions_visual'] + result = re.search(u'«(.+?)»', instructions_visual).group(1).strip() + + except AttributeError: + self.fail(_("AdYouLike result not found")) + + result = {'_ayl_captcha_engine' : "adyoulike", + '_ayl_env' : server['all']['env'], + '_ayl_tid' : challenge['tid'], + '_ayl_token_challenge': challenge['token'], + '_ayl_response' : response} + + self.logDebug("Result: %s" % result) + + return result + + +class AdsCaptcha(CaptchaService): + __name__ = "AdsCaptcha" + __type__ = "captcha" + __version__ = "0.09" + + __description__ = """AdsCaptcha captcha service plugin""" + __license__ = "GPLv3" + __authors__ = [("pyLoad Team", "admin@pyload.org")] + + + CAPTCHAID_PATTERN = r'api\.adscaptcha\.com/Get\.aspx\?.*?CaptchaId=(\d+)' + PUBLICKEY_PATTERN = r'api\.adscaptcha\.com/Get\.aspx\?.*?PublicKey=([\w-]+)' + + + def detect_key(self, html=None): + html = html or self.retrieve_html() + + m = re.search(self.PUBLICKEY_PATTERN, html) + n = re.search(self.CAPTCHAID_PATTERN, html) + if m and n: + self.key = (m.group(1).strip(), n.group(1).strip()) #: key is the tuple(PublicKey, CaptchaId) + self.logDebug("Key: %s | ID: %s" % self.key) + return self.key + else: + self.logWarning("Key or id pattern not found") + return None + + + def challenge(self, key=None, html=None): + PublicKey, CaptchaId = key or self.retrieve_key(html) + + html = self.plugin.req.load("http://api.adscaptcha.com/Get.aspx", + get={'CaptchaId': CaptchaId, + 'PublicKey': PublicKey}) + try: + challenge = re.search("challenge: '(.+?)',", html).group(1) + server = re.search("server: '(.+?)',", html).group(1) + + except AttributeError: + self.fail(_("AdsCaptcha challenge pattern not found")) + + self.logDebug("Challenge: %s" % challenge) + + return self.result(server, challenge), challenge + + + def result(self, server, challenge): + result = self.plugin.decryptCaptcha("%sChallenge.aspx" % server, + get={'cid': challenge, 'dummy': random.random()}, + cookies=True, + imgtype="jpg") + + self.logDebug("Result: %s" % result) + + return result + + class ReCaptcha(CaptchaService): __name__ = "ReCaptcha" __type__ = "captcha" @@ -65,11 +223,7 @@ class ReCaptcha(CaptchaService): def detect_key(self, html=None): - if not html: - if hasattr(self.plugin, "html") and self.plugin.html: - html = self.plugin.html - else: - self.fail(_("ReCaptcha html not found")) + html = html or self.retrieve_html() m = re.search(self.KEY_V2_PATTERN, html) or re.search(self.KEY_V1_PATTERN, html) if m: @@ -77,26 +231,19 @@ class ReCaptcha(CaptchaService): self.logDebug("Key: %s" % self.key) return self.key else: - self.logDebug("Key not found") + self.logWarning("Key pattern not found") return None def challenge(self, key=None, html=None, version=None): - if not key: - if self.detect_key(html): - key = self.key - else: - self.fail(_("ReCaptcha key not found")) + key = key or self.retrieve_key(html) if version in (1, 2): return getattr(self, "_challenge_v%s" % version)(key) - elif not html and hasattr(self.plugin, "html") and self.plugin.html: - version = 2 if re.search(self.KEY_V2_PATTERN, self.plugin.html) else 1 - return self.challenge(key, self.plugin.html, version) - else: - self.fail(_("ReCaptcha html not found")) + return self.challenge(key, + version=2 if re.search(self.KEY_V2_PATTERN, html or self.retrieve_html()) else 1) def _challenge_v1(self, key): @@ -128,7 +275,7 @@ class ReCaptcha(CaptchaService): except AttributeError: self.fail(_("ReCaptcha second challenge pattern not found")) - self.logDebug("Second challenge: %s" %challenge) + self.logDebug("Second challenge: %s" % challenge) result = self.plugin.decryptCaptcha("%simage" % server, get={'c': challenge}, cookies=True, @@ -145,7 +292,7 @@ class ReCaptcha(CaptchaService): a = re.search(r'po.src = \'(.*?)\';', html).group(1) vers = a.split("/")[5] - self.logDebug("API version: %s" %vers) + self.logDebug("API version: %s" % vers) language = a.split("__")[1].split(".")[0] @@ -217,11 +364,11 @@ class ReCaptcha(CaptchaService): self.logDebug("Token #3: %s" % token3.group(1)) millis_captcha_loading = int(round(time.time() * 1000)) - captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload", - get={'c':token3.group(1), 'k':key}, - cookies=True, - forceUser=True) - response = b64encode('{"response":"%s"}' % captcha_response) + captcha_response = self.plugin.decryptCaptcha("https://www.google.com/recaptcha/api2/payload", + get={'c':token3.group(1), 'k':key}, + cookies=True, + forceUser=True) + response = b64encode('{"response":"%s"}' % captcha_response) self.logDebug("Result: %s" % response) @@ -244,73 +391,6 @@ class ReCaptcha(CaptchaService): return result, None -class AdsCaptcha(CaptchaService): - __name__ = "AdsCaptcha" - __type__ = "captcha" - __version__ = "0.09" - - __description__ = """AdsCaptcha captcha service plugin""" - __license__ = "GPLv3" - __authors__ = [("pyLoad Team", "admin@pyload.org")] - - - CAPTCHAID_PATTERN = r'api\.adscaptcha\.com/Get\.aspx\?.*?CaptchaId=(\d+)' - PUBLICKEY_PATTERN = r'api\.adscaptcha\.com/Get\.aspx\?.*?PublicKey=([\w-]+)' - - - def detect_key(self, html=None): - if not html: - if hasattr(self.plugin, "html") and self.plugin.html: - html = self.plugin.html - else: - self.fail(_("AdsCaptcha html not found")) - - m = re.search(self.PUBLICKEY_PATTERN, html) - n = re.search(self.CAPTCHAID_PATTERN, html) - if m and n: - self.key = (m.group(1).strip(), n.group(1).strip()) #: key is the tuple(PublicKey, CaptchaId) - self.logDebug("Key: %s | ID: %s" % self.key) - return self.key - else: - self.logDebug("Key or id not found") - return None - - - def challenge(self, key=None, html=None): - if not key: - if self.detect_key(html): - key = self.key - else: - self.fail(_("AdsCaptcha key not found")) - - PublicKey, CaptchaId = key - - html = self.plugin.req.load("http://api.adscaptcha.com/Get.aspx", - get={'CaptchaId': CaptchaId, - 'PublicKey': PublicKey}) - try: - challenge = re.search("challenge: '(.+?)',", html).group(1) - server = re.search("server: '(.+?)',", html).group(1) - - except AttributeError: - self.fail(_("AdsCaptcha challenge pattern not found")) - - self.logDebug("Challenge: %s" % challenge) - - return self.result(server, challenge), challenge - - - def result(self, server, challenge): - result = self.plugin.decryptCaptcha("%sChallenge.aspx" % server, - get={'cid': challenge, 'dummy': random.random()}, - cookies=True, - imgtype="jpg") - - self.logDebug("Result: %s" % result) - - return result - - class SolveMedia(CaptchaService): __name__ = "SolveMedia" __type__ = "captcha" @@ -325,11 +405,7 @@ class SolveMedia(CaptchaService): def detect_key(self, html=None): - if not html: - if hasattr(self.plugin, "html") and self.plugin.html: - html = self.plugin.html - else: - self.fail(_("SolveMedia html not found")) + html = html or self.retrieve_html() m = re.search(self.KEY_PATTERN, html) if m: @@ -337,16 +413,12 @@ class SolveMedia(CaptchaService): self.logDebug("Key: %s" % self.key) return self.key else: - self.logDebug("Key not found") + self.logWarning("Key pattern not found") return None def challenge(self, key=None, html=None): - if not key: - if self.detect_key(html): - key = self.key - else: - self.fail(_("SolveMedia key not found")) + key = key or self.retrieve_key(html) html = self.plugin.req.load("http://api.solvemedia.com/papi/challenge.noscript", get={'k': key}) @@ -372,7 +444,9 @@ class SolveMedia(CaptchaService): try: result = self.result("http://api.solvemedia.com/papi/media", challenge) - except Exception: + except Fail, e: + self.logWarning(e) + self.plugin.invalidCaptcha() result = None html = self.plugin.req.load("http://api.solvemedia.com/papi/verify.noscript", @@ -392,7 +466,7 @@ class SolveMedia(CaptchaService): else: if "error" in html: - self.logError("Captcha code was invalid") + self.logWarning("Captcha code was invalid") self.logDebug("Retry #%d" % i) html = self.plugin.req.load(redirect) else: @@ -413,98 +487,3 @@ class SolveMedia(CaptchaService): self.logDebug("Result: %s" % result) return result - - -class AdYouLike(CaptchaService): - __name__ = "AdYouLike" - __type__ = "captcha" - __version__ = "0.06" - - __description__ = """AdYouLike captcha service plugin""" - __license__ = "GPLv3" - __authors__ = [("Walter Purcaro", "vuolter@gmail.com")] - - - AYL_PATTERN = r'Adyoulike\.create\s*\((.+?)\)' - CALLBACK_PATTERN = r'(Adyoulike\.g\._jsonp_\d+)' - - - def detect_key(self, html=None): - if not html: - if hasattr(self.plugin, "html") and self.plugin.html: - html = self.plugin.html - else: - self.fail(_("AdYouLike html not found")) - - m = re.search(self.AYL_PATTERN, html) - n = re.search(self.CALLBACK_PATTERN, html) - if m and n: - self.key = (m.group(1).strip(), n.group(1).strip()) - self.logDebug("Ayl: %s | Callback: %s" % self.key) - return self.key #: key is the tuple(ayl, callback) - else: - self.logDebug("Ayl or callback not found") - return None - - - def challenge(self, key=None, html=None): - if not key: - if self.detect_key(html): - key = self.key - else: - self.fail(_("AdYouLike key not found")) - - ayl, callback = key - - # {"adyoulike":{"key":"P~zQ~O0zV0WTiAzC-iw0navWQpCLoYEP"}, - # "all":{"element_id":"ayl_private_cap_92300","lang":"fr","env":"prod"}} - ayl = json_loads(ayl) - - html = self.plugin.req.load("http://api-ayl.appspot.com/challenge", - get={'key' : ayl['adyoulike']['key'], - 'env' : ayl['all']['env'], - 'callback': callback}) - try: - challenge = json_loads(re.search(callback + r'\s*\((.+?)\)', html).group(1)) - - except AttributeError: - self.fail(_("AdYouLike challenge pattern not found")) - - self.logDebug("Challenge: %s" % challenge) - - return self.result(ayl, challenge), challenge - - - def result(self, server, challenge): - # Adyoulike.g._jsonp_5579316662423138 - # ({"translations":{"fr":{"instructions_visual":"Recopiez « Soonnight » ci-dessous :"}}, - # "site_under":true,"clickable":true,"pixels":{"VIDEO_050":[],"DISPLAY":[],"VIDEO_000":[],"VIDEO_100":[], - # "VIDEO_025":[],"VIDEO_075":[]},"medium_type":"image/adyoulike", - # "iframes":{"big":""},"shares":{},"id":256, - # "token":"e6QuI4aRSnbIZJg02IsV6cp4JQ9~MjA1","formats":{"small":{"y":300,"x":0,"w":300,"h":60}, - # "big":{"y":0,"x":0,"w":300,"h":250},"hover":{"y":440,"x":0,"w":300,"h":60}}, - # "tid":"SqwuAdxT1EZoi4B5q0T63LN2AkiCJBg5"}) - - if isinstance(server, basestring): - server = json_loads(server) - - if isinstance(challenge, basestring): - challenge = json_loads(challenge) - - try: - instructions_visual = challenge['translations'][server['all']['lang']]['instructions_visual'] - result = re.search(u'«(.+?)»', instructions_visual).group(1).strip() - - except AttributeError: - self.fail(_("AdYouLike result not found")) - - result = {'_ayl_captcha_engine' : "adyoulike", - '_ayl_env' : server['all']['env'], - '_ayl_tid' : challenge['tid'], - '_ayl_token_challenge': challenge['token'], - '_ayl_response' : response} - - self.logDebug("Result: %s" % result) - - return result -- cgit v1.2.3