Ignore:
Timestamp:
Jul 28, 2018, 2:14:27 PM (16 months ago)
Author:
obi
Message:

tithek optimize cloudflare and switch foxx to cloudflare

File:
1 edited

Legend:

Unmodified
Added
Removed
  • titan/mediathek/localhoster/lib/net.py

    r42561 r42564  
    1616    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    1717'''
     18
     19from __future__ import division
     20import urllib, urllib2, re, sys
     21from time import sleep
    1822
    1923import random
     
    231235            raise Exception
    232236
     237    def checkpart(self, s, sens):
     238        number = 0
     239        p = 0
     240        if sens == 1:
     241            pos = 0
     242        else:
     243            pos = len(s) - 1
     244
     245        try:
     246            while 1:
     247                c = s[pos]
     248
     249                if ((c == '(') and (sens == 1)) or ((c == ')') and (sens == -1)):
     250                    p = p + 1
     251                if ((c == ')') and (sens == 1)) or ((c == '(') and (sens == -1)):
     252                    p = p - 1
     253                if (c == '+') and (p == 0) and (number > 1):
     254                    break
     255
     256                number += 1
     257                pos = pos + sens
     258        except:
     259            pass
     260        if sens == 1:
     261            return s[:number], number
     262        else:
     263            return s[-number:], number
     264
     265    def parseInt(self, s):
     266        offset = 1 if s[0] == '+' else 0
     267        chain = s.replace('!+[]', '1').replace('!![]', '1').replace('[]', '0').replace('(', 'str(')[offset:]
     268
     269        if '/' in chain:
     270            val = chain.split('/')
     271            links, sizeg = self.checkpart(val[0], -1)
     272            rechts, sized = self.checkpart(val[1], 1)
     273
     274            if rechts.startswith('+') or rechts.startswith('-'):
     275                rechts = rechts[1:]
     276            gg = eval(links)
     277            dd = eval(rechts)
     278            chain = val[0][:-sizeg] + str(gg) + '/' + str(dd) + val[1][sized:]
     279        val = float(eval(chain))
     280        return val
     281
     282    def _extract_js(self, htmlcontent, domain):
     283        line1 = re.findall('var s,t,o,p,b,r,e,a,k,i,n,g,f, (.+?)={"(.+?)":\+*(.+?)};', htmlcontent)
     284        varname = line1[0][0] + '.' + line1[0][1]
     285        calc = self.parseInt(line1[0][2])
     286        AllLines = re.findall(';' + varname + '([*\-+])=([^;]+)', htmlcontent)
     287
     288        for aEntry in AllLines:
     289            calc = eval(format(calc, '.17g') + str(aEntry[0]) + format(self.parseInt(aEntry[1]), '.17g'))
     290        rep = calc + len(domain)
     291        return format(rep, '.10f')
    233292
    234293    def _cloudflare_challenge(self, url, challenge, form_data={}, headers={}, compression=True):
     
    242301        https://offshoregit.com/lambda81/
    243302        """
     303
    244304        jschl = re.compile('name="jschl_vc" value="(.+?)"/>').findall(challenge)[0]
    245         init = re.compile('setTimeout\(function\(\){\s*.*?.*:(.*?)};').findall(challenge)[0]
    246         builder = re.compile(r"challenge-form\'\);\s*(.*)a.v").findall(challenge)[0]
    247         decrypt_val = self._parseJSString(init)
    248         lines = builder.split(';')
    249 
    250         for line in lines:
    251             if len(line)>0 and '=' in line:
    252                 sections=line.split('=')
    253                 line_val = self._parseJSString(sections[1])
    254                 decrypt_val = int(eval(str(decrypt_val)+sections[0][-1]+str(line_val)))
     305        passw = re.compile('name="pass" value="(.+?)"/>').findall(challenge)[0]
     306        js = self._extract_js(challenge, url)
     307
     308        body = challenge
     309        parsed_url = urlparse(url)
     310        submit_url = "%s://%s/cdn-cgi/l/chk_jschl" % (parsed_url.scheme, parsed_url.netloc)
     311        params = {}
     312        try:
     313            params["jschl_vc"] = re.search(r'name="jschl_vc" value="(\w+)"', body).group(1)
     314            params["pass"] = re.search(r'name="pass" value="(.+?)"', body).group(1)
     315            js = self._extract_js(body, parsed_url.netloc)
     316        except:
     317            return None
     318
     319        params["jschl_answer"] = js
     320        sParameters = urllib.urlencode(params, True)
     321        request = urllib2.Request("%s?%s" % (submit_url, sParameters))
     322
     323        for key in headers:
     324            request.add_header(key, headers[key])
     325        sleep(5)
    255326
    256327        path = urlparse(url).path
    257328        netloc = urlparse(url).netloc
     329
    258330        if not netloc:
    259331            netloc = path
    260332
    261         answer = decrypt_val + len(netloc)
     333#        answer = decrypt_val + len(netloc)
     334        answer = js
    262335
    263336        url = url.rstrip('/')
     
    268341            query = '%s/cdn-cgi/l/chk_jschl?pass=%s&jschl_vc=%s&jschl_answer=%s' % \
    269342                    (url, urllib.quote_plus(passval), jschl, answer)
    270             time.sleep(9)
     343 #           time.sleep(9)
    271344
    272345        self._update_opener(cloudflare_jar=True)
     
    304377            compression.
    305378        """
     379        print "aaaaaaaaa"
    306380        netloc = urlparse(url).netloc
    307381        if not netloc:
     
    309383        cloudflare_url = urlunparse((urlparse(url).scheme, netloc, '', '', '', ''))
    310384        try:
     385            print "bbbbbbbbbb"
     386
    311387            self._cloudflare_challenge(cloudflare_url, challenge, form_data, headers, compression)
     388            print "bbbbbbbbbb1"
     389
    312390            for c in self._cloudflare_jar:
    313391                self._cj.set_cookie(c)
     392            print "bbbbbbbbbb2"
     393
    314394            self._update_opener()
    315         except:
     395            print "bbbbbbbbbb3"
     396
     397        except:
     398            print "ccccccccc"
     399
    316400            # make sure we update to main jar
    317401            self._update_opener()
     
    564648            except urllib2.HTTPError as e:
    565649                if e.code == 503:
     650                    print "111111111"
    566651                    try:
     652                        print "222222222"
    567653                        self._set_cloudflare(url, e.read(), form_data, headers, compression)
    568654                    except:
     655                        print "333333333"
    569656                        raise urllib2.HTTPError, e
    570657                    req = urllib2.Request(url)
     658                    print "4"
     659
    571660                    if form_data:
    572661                        form_data = urllib.urlencode(form_data)
Note: See TracChangeset for help on using the changeset viewer.