# -*- coding: utf-8 -*- # -------------------------------------------------------------------------------- # Cloudflare decoder # -------------------------------------------------------------------------------- import re import time import urllib import urlparse from platformcode import logger class Cloudflare: def __init__(self, response): self.timeout = 5 self.domain = urlparse.urlparse(response["url"])[1] self.protocol = urlparse.urlparse(response["url"])[0] self.js_data = {} self.header_data = {} if not "var s,t,o,p,b,r,e,a,k,i,n,g,f" in response["data"] or "chk_jschl" in response["url"]: return try: self.js_data["data"] = response["data"] self.js_data["auth_url"] = \ re.compile('
').findall(response["data"])[0] self.js_data["params"] = {} self.js_data["params"]["jschl_vc"] = \ re.compile('').findall(response["data"])[0] self.js_data["params"]["pass"] = \ re.compile('').findall(response["data"])[0] self.js_data["wait"] = int(re.compile("\}, ([\d]+)\);", re.MULTILINE).findall(response["data"])[0]) / 1000 self.js_data["params"]["s"] = \ re.compile('> 16 & 255) : r2 === 64 ? g(bm >> 16 & 255, bm >> 8 & 255) : g(bm >> 16 & 255, bm >> 8 & 255, bm & 255); }} return r; }}; function italics (str) {{ return '' + this + ''; }}; var document = {{ getElementById: function () {{ return {{'innerHTML': '{innerHTML}'}}; }} }}; {js} """ innerHTML = re.search(']*)? id="([^<>]*?)">([^<>]*?)<\/div>', body , re.MULTILINE | re.DOTALL) innerHTML = innerHTML.group(2).replace("'", r"\'") if innerHTML else "" import js2py from jsc import jsunc js = jsunc(jsEnv.format(domain=domain, innerHTML=innerHTML, js=js)) def atob(s): return base64.b64decode('{}'.format(s)).decode('utf-8') js2py.disable_pyimport() context = js2py.EvalJs({'atob': atob}) result = context.eval(js) return float(result) @property def wait_time(self): if self.js_data.get("wait", 0): return self.js_data["wait"] else: return self.header_data.get("wait", 0) @property def is_cloudflare(self): return self.header_data.get("wait", 0) > 0 or self.js_data.get("wait", 0) > 0 def get_url(self): # Metodo #1 (javascript) if self.js_data.get("wait", 0): self.js_data["params"]["jschl_answer"] = self.solve_cf(self.js_data["data"], self.domain) response = "%s://%s%s?%s" % ( self.protocol, self.domain, self.js_data["auth_url"], urllib.urlencode(self.js_data["params"])) time.sleep(self.js_data["wait"]) return response