def _unshorten_viidme(self, uri): try: sts, html = self.cm.getPage(uri, {'header': HTTP_HEADER}) session_id = re.findall(r'sessionId\:(.*?)\"\,', html) if len(session_id) > 0: session_id = re.sub(r'\s\"', '', session_id[0]) http_header = copy.copy(HTTP_HEADER) http_header[ "Content-Type"] = "application/x-www-form-urlencoded" http_header["Host"] = "viid.me" http_header["Referer"] = uri http_header["Origin"] = "http://viid.me" http_header["X-Requested-With"] = "XMLHttpRequest" GetIPTVSleep().Sleep(5) payload = {'adSessionId': session_id, 'callback': 'c'} sts, response = self.cm.getPage( 'http://viid.me/shortest-url/end-adsession', {'header': http_header}, payload) resp_uri = byteify(json.loads( response[6:-2]))['destinationUrl'] if resp_uri is not None: uri = resp_uri return uri, 'OK' except Exception as e: printExc() return uri, str(e)
def getVideoLinks(self, url): printDBG("StreamingSeriesWatch.getVideoLinks [%s]" % url) urlTab = [] if 'protect-stream.com' not in url: return [] sts, data = self.getPage(url, self.defaultParams) if not sts: return [] k = self.cm.ph.getSearchGroups(data, 'var\s+?k[^"]*?=[^"]*?"([^"]+?)"')[0] secure = self.cm.ph.getSearchGroups(data, '''['"/](secur[^\.]*?)\.js''')[0] try: sts, tmp = self.getPage( 'https://www.protect-stream.com/%s.js' % secure, self.defaultParams) count = self.cm.ph.getSearchGroups( tmp, 'var\s+?count\s*?=\s*?([0-9]+?);')[0] if int(count) < 15: GetIPTVSleep().Sleep(int(count)) except Exception: printExc() return [] header = dict(self.defaultParams['header']) params = dict(self.defaultParams) header['Referer'] = url header['Content-Type'] = "application/x-www-form-urlencoded" header['Accept-Encoding'] = 'gzip, deflate' params['header'] = header params['use_cookie'] = False sts, data = self.getPage( 'https://www.protect-stream.com/%s.php' % secure, params, {'k': k}) if not sts: return [] printDBG('==========================================') printDBG(data) printDBG('==========================================') videoUrl = self.cm.ph.getSearchGroups( data, '''<iframe[^>]+?src=['"]([^'^"]+?)['"]''')[0] if not self.cm.isValidUrl(videoUrl): videoUrl = self.cm.ph.getSearchGroups( data, '''<a[^>]+?href=['"]([^'^"]+?)['"]''')[0] return self.up.getVideoLinkExt(videoUrl)
def getPage(self, baseUrl, addParams={}, post_data=None): while True: if addParams == {}: addParams = dict(self.defaultParams) origBaseUrl = baseUrl baseUrl = self.cm.iriToUri(baseUrl) def _getFullUrl(url): if self.cm.isValidUrl(url): return url else: return urlparse.urljoin(baseUrl, url) addParams['cloudflare_params'] = { 'domain': self.up.getDomain(baseUrl), 'cookie_file': self.COOKIE_FILE, 'User-Agent': self.USER_AGENT, 'full_url_handle': _getFullUrl } sts, data = self.cm.getPageCFProtection(baseUrl, addParams, post_data) if sts and addParams.get('return_data', True) and 'class="loading"' in data: GetIPTVSleep().Sleep(5) continue break return sts, data
def processCaptcha(self, sitekey, referer=''): sleepObj = None token = '' errorMsgTab = [] apiKey = config.plugins.iptvplayer.api_key_9kweu.value apiUrl = self.getFullUrl( '/index.cgi?apikey=' ) + apiKey + '&action=usercaptchaupload&interactive=1&json=1&file-upload-01=' + sitekey + '&oldsource=recaptchav2&pageurl=' + urllib.quote( referer) try: token = '' sts, data = self.cm.getPage(apiUrl) if sts: printDBG('API DATA:\n%s\n' % data) data = byteify(json.loads(data)) if 'captchaid' in data: captchaid = data['captchaid'] sleepObj = GetIPTVSleep() sleepObj.Sleep(300, False) tries = 0 while True: tries += 1 timeout = sleepObj.getTimeout() if tries == 1: timeout = 10 elif timeout > 10: timeout = 5 time.sleep(timeout) apiUrl = self.getFullUrl( '/index.cgi?apikey=' ) + apiKey + '&action=usercaptchacorrectdata&json=1&id=' + captchaid sts, data = self.cm.getPage(apiUrl) if not sts: continue # maybe simple continue here ? errorMsgTab.append(_('Network failed %s.') % '2') break else: printDBG('API DATA:\n%s\n' % data) data = byteify(json.loads(data)) token = data['answer'] if token != '': break if sleepObj.getTimeout() == 0: errorMsgTab.append( _('%s timeout.') % self.getMainUrl()) break else: errorMsgTab.append(data['error']) else: errorMsgTab.append(_('Network failed %s.') % '1') except Exception as e: errorMsgTab.append(str(e)) printExc() if sleepObj != None: sleepObj.Reset() if token == '': self.sessionEx.waitForFinishOpen( MessageBox, (_('Resolving reCaptcha with %s failed!\n\n') % self.getMainUrl()) + '\n'.join(errorMsgTab), type=MessageBox.TYPE_ERROR, timeout=10) return token
def processCaptcha(self, sitekey, referer=''): sleepObj = None token = '' errorMsgTab = [] apiKey = config.plugins.iptvplayer.api_key_2captcha.value apiUrl = self.getFullUrl( '/in.php?key=' ) + apiKey + '&method=userrecaptcha&invisible=1&googlekey=' + sitekey + '&json=1&pageurl=' + urllib.quote( referer) try: token = '' sts, data = self.cm.getPage(apiUrl) if sts: printDBG('API DATA:\n%s\n' % data) data = byteify(json.loads(data), '', True) if data['status'] == '1': captchaid = data['request'] sleepObj = GetIPTVSleep() sleepObj.Sleep(300, False) tries = 0 while True: tries += 1 timeout = sleepObj.getTimeout() if tries == 1: timeout = 10 elif timeout > 10: timeout = 5 time.sleep(timeout) apiUrl = self.getFullUrl( '/res.php?key=' ) + apiKey + '&action=get&json=1&id=' + captchaid sts, data = self.cm.getPage(apiUrl) if not sts: continue # maybe simple continue here ? errorMsgTab.append(_('Network failed %s.') % '2') break else: printDBG('API DATA:\n%s\n' % data) data = byteify(json.loads(data), '', True) if data['status'] == '1' and data['request'] != '': token = data['request'] break if sleepObj.getTimeout() == 0: errorMsgTab.append( _('%s timeout.') % self.getMainUrl()) break else: errorMsgTab.append(data['request']) else: errorMsgTab.append(_('Network failed %s.') % '1') except Exception as e: errorMsgTab.append(str(e)) printExc() if sleepObj != None: sleepObj.Reset() if token == '': self.sessionEx.waitForFinishOpen( MessageBox, (_('Resolving reCaptcha with %s failed!\n\n') % self.getMainUrl()) + '\n'.join(errorMsgTab), type=MessageBox.TYPE_ERROR, timeout=10) return token
def _unshorten_iivpl(self, baseUri): baseUri = strwithmeta(baseUri) ref = baseUri.meta.get('Referer', baseUri) USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0' HTTP_HEADER = { 'User-Agent': USER_AGENT, 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Referer': ref } HTTP_HEADER_AJAX = { 'User-Agent': USER_AGENT, 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Referer': baseUri, 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest' } COOKIE_FILE = GetCookieDir('iit.pl') tries = 0 retUri, retSts = '', 'KO' while tries < 2 and retSts != 'OK': tries += 1 rm(COOKIE_FILE) try: params = { 'header': HTTP_HEADER, 'use_cookie': True, 'load_cookie': True, 'save_cookie': True, 'cookiefile': COOKIE_FILE } sts, data = self.cm.getPage(baseUri, params) sts, headers = self.cm.getPage( 'http://iiv.pl/modules/system/assets/js/framework.js', params) headers = self.cm.ph.getDataBeetwenMarkers( headers, 'headers', '}')[1] headers = re.compile('''['"]([^'^"]+?)['"]''').findall(headers) salt = self.cm.ph.getSearchGroups( data, '''data\-salt="([^"]+?)"''')[0] time = self.cm.ph.getSearchGroups( data, '''data\-time="([^"]+?)"''')[0] action = self.cm.ph.getSearchGroups( data, '''data\-action="([^"]+?)"''')[0] banner = self.cm.ph.getSearchGroups( data, '''data\-banner="([^"]+?)"''')[0] component = self.cm.ph.getSearchGroups( data, '''data\-component="([^"]+?)"''')[0] if tries > 1: GetIPTVSleep().Sleep(int(time)) sts, partials = self.cm.getPage( 'http://iiv.pl/themes/cutso/assets/javascript/shortcut/shortcut.js', params) partials = self.cm.ph.getDataBeetwenMarkers( partials, 'update:', '}')[1] partials = self.cm.ph.getSearchGroups( partials, '''['"]([^'^"]+?)['"]''')[0] if partials == '': partials = 'shortcut/link_show' for header in headers: if 'HANDLER' in header: HTTP_HEADER_AJAX[header] = action elif 'PARTIALS' in header: HTTP_HEADER_AJAX[header] = partials post_data = {'salt': salt, 'banner': banner, 'blocker': 0} params['header'] = HTTP_HEADER_AJAX sts, data = self.cm.getPage(baseUri, params, post_data) data = byteify(json.loads(data)) printDBG(">>>%s<<<" % data) uri = self.cm.ph.getSearchGroups( data[partials], '''href="(https?://[^"]+?)"''')[0] retUri, retSts = uri, 'OK' except Exception as e: retUri, retSts = baseUri, str(e) printExc() return retUri, retSts
def _unshorten_linkbucks(self, uri): ''' (Attempt) to decode linkbucks content. HEAVILY based on the OSS jDownloader codebase. This has necessidated a license change. ''' r = requests.get(uri, headers=HTTP_HEADER, timeout=self._timeout) firstGet = time.time() baseloc = r.url if "/notfound/" in r.url or \ "(>Link Not Found<|>The link may have been deleted by the owner|To access the content, you must complete a quick survey\.)" in r.text: return uri, 'Error: Link not found or requires a survey!' link = None content = r.text regexes = [ r"<div id=\"lb_header\">.*?/a>.*?<a.*?href=\"(.*?)\".*?class=\"lb", r"AdBriteInit\(\"(.*?)\"\)", r"Linkbucks\.TargetUrl = '(.*?)';", r"Lbjs\.TargetUrl = '(http://[^<>\"]*?)'", r"src=\"http://static\.linkbucks\.com/tmpl/mint/img/lb\.gif\" /></a>.*?<a href=\"(.*?)\"", r"id=\"content\" src=\"([^\"]*)", ] for regex in regexes: if self.inValidate(link): link = find_in_text(regex, content) if self.inValidate(link): match = find_in_text(r"noresize=\"[0-9+]\" src=\"(http.*?)\"", content) if match: link = find_in_text(r"\"frame2\" frameborder.*?src=\"(.*?)\"", content) if self.inValidate(link): scripts = re.findall( "(<script type=\"text/javascript\">[^<]+</script>)", content) if not scripts: return uri, "No script bodies found?" js = False for script in scripts: # cleanup script = re.sub(r"[\r\n\s]+\/\/\s*[^\r\n]+", "", script) if re.search( r"\s*var\s*f\s*=\s*window\['init'\s*\+\s*'Lb'\s*\+\s*'js'\s*\+\s*''\];[\r\n\s]+", script): js = script if not js: return uri, "Could not find correct script?" token = find_in_text(r"Token\s*:\s*'([a-f0-9]{40})'", js) if not token: token = find_in_text(r"\?t=([a-f0-9]{40})", js) assert token authKeyMatchStr = r"A(?:'\s*\+\s*')?u(?:'\s*\+\s*')?t(?:'\s*\+\s*')?h(?:'\s*\+\s*')?K(?:'\s*\+\s*')?e(?:'\s*\+\s*')?y" l1 = find_in_text( r"\s*params\['" + authKeyMatchStr + r"'\]\s*=\s*(\d+?);", js) l2 = find_in_text( r"\s*params\['" + authKeyMatchStr + r"'\]\s*=\s?params\['" + authKeyMatchStr + r"'\]\s*\+\s*(\d+?);", js) if any([not l1, not l2, not token]): return uri, "Missing required tokens?" print(l1, l2) authkey = int(l1) + int(l2) p1_url = urljoin(baseloc, "/director/?t={tok}".format(tok=token)) print(p1_url) r2 = requests.get(p1_url, headers=HTTP_HEADER, timeout=self._timeout, cookies=r.cookies) p1_url = urljoin( baseloc, "/scripts/jquery.js?r={tok}&{key}".format(tok=token, key=l1)) print(p1_url) r2_1 = requests.get(p1_url, headers=HTTP_HEADER, timeout=self._timeout, cookies=r.cookies) time_left = 5.033 - (time.time() - firstGet) GetIPTVSleep().Sleep(max(time_left, 0)) p3_url = urljoin( baseloc, "/intermission/loadTargetUrl?t={tok}&aK={key}&a_b=false". format(tok=token, key=str(authkey))) r3 = requests.get(p3_url, headers=HTTP_HEADER, timeout=self._timeout, cookies=r2.cookies) resp_json = json.loads(r3.text) if "Url" in resp_json: return resp_json['Url'], r3.status_code print(p3_url) print(r3) print(r3.text) print(resp_json) return "Wat", "wat"
def getPageCFProtection(self, baseUrl, params={}, post_data=None): cfParams = params.get('cloudflare_params', {}) def _getFullUrlEmpty(url): return url _getFullUrl = cfParams.get('full_url_handle', _getFullUrlEmpty) _getFullUrl2 = cfParams.get('full_url_handle2', _getFullUrlEmpty) url = baseUrl header = {'Referer':url, 'User-Agent':cfParams.get('User-Agent', ''), 'Accept-Encoding':'text'} header.update(params.get('header', {})) params.update({'with_metadata':True, 'use_cookie': True, 'save_cookie': True, 'load_cookie': True, 'cookiefile': cfParams.get('cookie_file', ''), 'header':header}) sts, data = self.getPage(url, params, post_data) current = 0 while current < 5: #if True: if not sts and None != data: start_time = time.time() current += 1 doRefresh = False try: domain = self.getBaseUrl(data.fp.geturl()) verData = data.fp.read() if data.fp.info().get('Content-Encoding', '') == 'gzip': verData = DecodeGzipped(verData) printDBG("------------------") printDBG(verData) printDBG("------------------") if 'sitekey' not in verData and 'challenge' not in verData: break printDBG(">>") printDBG(verData) printDBG("<<") sitekey = self.ph.getSearchGroups(verData, 'data-sitekey="([^"]+?)"')[0] id = self.ph.getSearchGroups(verData, 'data-ray="([^"]+?)"')[0] if sitekey != '': from Plugins.Extensions.IPTVPlayer.libs.recaptcha_v2 import UnCaptchaReCaptcha # google captcha recaptcha = UnCaptchaReCaptcha(lang=GetDefaultLang()) recaptcha.HTTP_HEADER['Referer'] = baseUrl if '' != cfParams.get('User-Agent', ''): recaptcha.HTTP_HEADER['User-Agent'] = cfParams['User-Agent'] token = recaptcha.processCaptcha(sitekey) if token == '': return False, None sts, tmp = self.ph.getDataBeetwenMarkers(verData, '<form', '</form>', caseSensitive=False) if not sts: return False, None url = self.ph.getSearchGroups(tmp, 'action="([^"]+?)"')[0] if url != '': url = _getFullUrl( url ) else: url = data.fp.geturl() actionType = self.ph.getSearchGroups(tmp, 'method="([^"]+?)"', 1, True)[0].lower() post_data2 = dict(re.findall(r'<input[^>]*name="([^"]*)"[^>]*value="([^"]*)"[^>]*>', tmp)) #post_data2['id'] = id if '' != token: post_data2['g-recaptcha-response'] = token else: continue params2 = dict(params) params2['header']= dict(params['header']) params2['header']['Referer'] = baseUrl if actionType == 'get': if '?' in url: url += '&' else: url += '?' url += urllib.urlencode(post_data2) post_data2 = None sts, data = self.getPage(url, params2, post_data2) printDBG("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") printDBG(sts) printDBG("------------------------------------------------------------------") printDBG(data) printDBG("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") else: dat = self.ph.getAllItemsBeetwenNodes(verData, ('<script', '>'), ('</script', '>'), False) for item in dat: if 'setTimeout' in item and 'submit()' in item: dat = item break decoded = '' jscode = base64.b64decode('''ZnVuY3Rpb24gc2V0VGltZW91dCh0LGUpe2lwdHZfcmV0LnRpbWVvdXQ9ZSx0KCl9dmFyIGlwdHZfcmV0PXt9LGlwdHZfZnVuPW51bGwsZG9jdW1lbnQ9e30sd2luZG93PXRoaXMsZWxlbWVudD1mdW5jdGlvbih0KXt0aGlzLl9uYW1lPXQsdGhpcy5fc3JjPSIiLHRoaXMuX2lubmVySFRNTD0iIix0aGlzLl9wYXJlbnRFbGVtZW50PSIiLHRoaXMuc2hvdz1mdW5jdGlvbigpe30sdGhpcy5hdHRyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuInNyYyI9PXQmJiIjdmlkZW8iPT10aGlzLl9uYW1lJiZpcHR2X3NyY2VzLnB1c2goZSksdGhpc30sdGhpcy5maXJzdENoaWxkPXtocmVmOmlwdHZfZG9tYWlufSx0aGlzLnN0eWxlPXtkaXNwbGF5OiIifSx0aGlzLnN1Ym1pdD1mdW5jdGlvbigpe3ByaW50KEpTT04uc3RyaW5naWZ5KGlwdHZfcmV0KSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzcmMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3JjfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fc3JjPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlubmVySFRNTCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbm5lckhUTUx9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9pbm5lckhUTUw9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidmFsdWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sc2V0OmZ1bmN0aW9uKHQpe2lwdHZfcmV0LmFuc3dlcj10fX0pfSwkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZWxlbWVudCh0KX07ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlbGVtZW50KHQpfSxkb2N1bWVudC5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZWxlbWVudCh0KX0sZG9jdW1lbnQuYXR0YWNoRXZlbnQ9ZnVuY3Rpb24oKXtpcHR2X2Z1bj1hcmd1bWVudHNbMV19Ow==''') jscode = "var location = {hash:''}; var iptv_domain='%s';\n%s\n%s\niptv_fun();" % (domain, jscode, dat) #cfParams['domain'] printDBG("+ CODE +") printDBG(jscode) printDBG("++++++++") ret = iptv_js_execute( jscode ) decoded = byteify(json.loads(ret['data'].strip())) verData = self.ph.getDataBeetwenReMarkers(verData, re.compile('<form[^>]+?id="challenge-form"'), re.compile('</form>'), False)[1] printDBG(">>") printDBG(verData) printDBG("<<") verUrl = _getFullUrl( self.ph.getSearchGroups(verData, 'action="([^"]+?)"')[0] ) get_data = dict(re.findall(r'<input[^>]*name="([^"]*)"[^>]*value="([^"]*)"[^>]*>', verData)) get_data['jschl_answer'] = decoded['answer'] verUrl += '?' for key in get_data: verUrl += '%s=%s&' % (key, get_data[key]) verUrl = _getFullUrl( self.ph.getSearchGroups(verData, 'action="([^"]+?)"')[0] ) + '?jschl_vc=%s&pass=%s&jschl_answer=%s' % (get_data['jschl_vc'], get_data['pass'], get_data['jschl_answer']) verUrl = _getFullUrl2( verUrl ) params2 = dict(params) params2['load_cookie'] = True params2['save_cookie'] = True params2['header'] = dict(params.get('header', {})) params2['header'].update({'Referer':url, 'User-Agent':cfParams.get('User-Agent', ''), 'Accept-Encoding':'text'}) printDBG("Time spent: [%s]" % (time.time() - start_time)) if current == 1: GetIPTVSleep().Sleep(1 + (decoded['timeout'] / 1000.0)-(time.time() - start_time)) else: GetIPTVSleep().Sleep((decoded['timeout'] / 1000.0)) printDBG("Time spent: [%s]" % (time.time() - start_time)) printDBG("Timeout: [%s]" % decoded['timeout']) sts, data = self.getPage(verUrl, params2, post_data) except Exception: printExc() break else: break return sts, data
def getVideoLinks(self, baseUrl): printDBG("AkoAm.getVideoLinks [%s]" % baseUrl) baseUrl = strwithmeta(baseUrl) urlTab = [] # mark requested link as used one if len(self.cacheLinks.keys()): for key in self.cacheLinks: for idx in range(len(self.cacheLinks[key])): if baseUrl in self.cacheLinks[key][idx]['url']: if not self.cacheLinks[key][idx]['name'].startswith( '*'): self.cacheLinks[key][idx][ 'name'] = '*' + self.cacheLinks[key][idx][ 'name'] + '*' break if 1 != self.up.checkHostSupport(baseUrl): paramsUrl = {'header': dict(self.HTTP_HEADER)} paramsUrl['header']['Referer'] = baseUrl.meta.get( 'Referer', self.getMainUrl()) paramsUrl['return_data'] = False try: sts, response = self.getPage(baseUrl, paramsUrl) cUrl = response.geturl() if 'Set-Cookie' in response.info(): data = self.cm.ph.getDataBeetwenMarkers( response.info()['Set-Cookie'], 'golink=', ';', False)[1] response.close() printDBG(data) data = urllib.unquote(data) data = byteify(json.loads(data)) baseUrl = data['route'] paramsUrl = dict(self.defaultParams) paramsUrl['header'] = dict(self.HTTP_HEADER) paramsUrl['header']['Referer'] = cUrl sts, data = self.getPage(baseUrl, paramsUrl) if sts: cUrl = data.meta['url'] url = self.getFullUrl( self.cm.ph.getSearchGroups( data, '''<iframe[^>]+?src=['"]([^"^']+?)['"]''', 1, True)[0]) if url == '': time = self.cleanHtmlStr( self.cm.ph.getDataBeetwenNodes( data, ('<div', '>', 'timerHolder'), ('</div', '>'), False)[1]) GetIPTVSleep().Sleep(int(time)) paramsUrl = dict(self.defaultParams) paramsUrl['header'] = dict(self.AJAX_HEADER) paramsUrl['header']['Referer'] = cUrl sts, data = self.getPage(cUrl, paramsUrl, {}) if sts: printDBG(data) data = byteify(json.loads(data)) urlTab.append({ 'name': 'direct_link', 'url': self.getFullUrl(data['direct_link']) }) else: baseUrl = strwithmeta(url, {'Referer': cUrl}) except Exception: printExc() urlTab.extend(self.up.getVideoLinkExt(baseUrl)) return urlTab