Muy buenas zastilla, ya decía yo que era raro lo de las horas del día

Ahora lo entiendo. Gracias por comentarme lo de esa línea en la función de la api, lo apunto para corregirlo

Y hombre, tampoco es plan de echarse por tierra, ni mediocre aprendiz ni nada, aquí estamos para colaborar y aprender, yo cometo muchísimos fallos y he necesitado mucha ayuda para poder defenderme un poco con python xD
Respecto a la línea que comentas que te da error, seguramente hay algo que está fallando antes, y cuando llega a esa parte la variable magic no tiene el valor correcto. Lo mismo se debe a alguna referencia a scrapertools o a la libreria aadecode. Puedes probar con este código, que no necesita de otros archivos, y a mí al menos por línea de comandos me funciona bien, ya tendrías que cambiar el print videourl por lo que quieras hacer con el enlace
Código: Seleccionar todo
# -*- coding: utf-8 -*-
import re, urllib2, urllib, sys
def get_video_url(url):
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:46.0) Gecko/20100101 Firefox/46.0')
req.add_header('X-Requested-With','XMLHttpRequest')
response = urllib2.urlopen(req)
data = response.read()
response.close()
if "videocontainer" not in data:
url = url.replace("/embed/","/f/")
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:46.0) Gecko/20100101 Firefox/46.0')
req.add_header('X-Requested-With','XMLHttpRequest')
response = urllib2.urlopen(req)
data = response.read()
response.close()
text_encode = re.findall('(゚ω゚.*?\(\'\_\'\));',data,re.DOTALL)
text_decode = ""
for t in text_encode:
text_decode += decode(t)
number = re.findall('charCodeAt\(0\)\s*\+\s*(\d+)',text_decode,re.DOTALL)[0]
varj = re.findall('var magic\s*=\s*(\w+)\.slice',text_decode,re.DOTALL)[0]
varhidden = re.findall('var\s*'+varj+'\s*=\s*\$\("[#]*([^"]+)"\).text',text_decode,re.DOTALL)[0]
valuehidden = re.findall('id="'+varhidden+'">(.*?)<', data,re.DOTALL)[0]
magic = ord(valuehidden[-1])
valuehidden = valuehidden.split(chr(magic-1))
valuehidden = "\t".join(valuehidden)
valuehidden = valuehidden.split(valuehidden[-1])
valuehidden = chr(magic-1).join(valuehidden)
valuehidden = valuehidden.split("\t")
valuehidden = chr(magic).join(valuehidden)
videourl = decode_hidden(valuehidden, number)
print videourl
def decode_hidden(text, number):
text = text.replace(">9", ">").replace(""9", '"').replace("<9", '<') \
.replace("&9", '&').replace(">", ">").replace("<", "<")
text = decodeHtmlentities(text)
s = []
for char in text:
j = ord(char)
s.append(chr(33 + ((j+14) % 94)))
temp = "".join(s)
text_decode = temp[0:-1] + chr(ord(temp[-1]) + int(number))
videourl = "https://openload.co/stream/{0}?mime=true".format(text_decode)
opener = urllib2.build_opener(urllib2.HTTPHandler(), NoRedirectHandler())
urllib2.install_opener(opener)
req = urllib2.Request(videourl)
req.add_header('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:46.0) Gecko/20100101 Firefox/46.0')
response = urllib2.urlopen(req)
info = response.info()
response.close()
for header in info:
if header == "location":
videourl = info[header]
videourl = videourl.replace("https", "http").replace("?mime=true", "")
return videourl
class NoRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, headers):
infourl = urllib.addinfourl(fp, headers, req.get_full_url())
infourl.status = code
infourl.code = code
return infourl
http_error_300 = http_error_302
http_error_301 = http_error_302
http_error_303 = http_error_302
http_error_307 = http_error_302
def decodeHtmlentities(string):
entity_re = re.compile("&(#?)(\d{1,5}|\w{1,8});")
def substitute_entity(match):
from htmlentitydefs import name2codepoint as n2cp
ent = match.group(2)
if match.group(1) == "#":
return unichr(int(ent)).encode('utf-8')
else:
cp = n2cp.get(ent)
if cp:
return unichr(cp).encode('utf-8')
else:
return match.group()
return entity_re.subn(substitute_entity, string)[0]
def decode(text):
text = re.sub(r"\s+|/\*.*?\*/", "", text)
data = text.split("+(゚Д゚)[゚o゚]")[1]
chars = data.split("+(゚Д゚)[゚ε゚]+")[1:]
txt = ""
for char in chars:
char = char \
.replace("(o゚ー゚o)","u") \
.replace("c", "0") \
.replace("(゚Д゚)['0']", "c") \
.replace("゚Θ゚", "1") \
.replace("!+[]", "1") \
.replace("-~", "1+") \
.replace("o", "3") \
.replace("_", "3") \
.replace("゚ー゚", "4") \
.replace("(+", "(")
char = re.sub(r'\((\d)\)', r'\1', char)
c = ""; subchar = ""
for v in char:
c+= v
try: x = c; subchar+= str(eval(x)); c = ""
except: pass
if subchar != '': txt+= subchar + "|"
txt = txt[:-1].replace('+','')
txt_result = "".join([ chr(int(n, 8)) for n in txt.split('|') ])
return toStringCases(txt_result)
def toStringCases(txt_result):
sum_base = ""
m3 = False
if ".toString(" in txt_result:
if "+(" in txt_result:
m3 = True
sum_base = "+"+re.findall(".toString...(\d+).", txt_result,re.DOTALL)[0]
txt_pre_temp = re.findall("..(\d),(\d+).", txt_result,re.DOTALL)
txt_temp = [ (n, b) for b ,n in txt_pre_temp ]
else:
txt_temp = re.findall('(\d+)\.0.\w+.([^\)]+).', txt_result, re.DOTALL)
for numero, base in txt_temp:
code = toString( int(numero), eval(base+sum_base) )
if m3:
txt_result = re.sub( r'"|\+', '', txt_result.replace("("+base+","+numero+")", code) )
else:
txt_result = re.sub( r"'|\+", '', txt_result.replace(numero+".0.toString("+base+")", code) )
return txt_result
def toString(number,base):
string = "0123456789abcdefghijklmnopqrstuvwxyz"
if number < base:
return string[number]
else:
return toString(number//base,base) + string[number%base]
if __name__ == '__main__':
get_video_url(sys.argv[1])
Edito: Vale, veo que ya lo has solucionado, pues perfecto entonces, me alegro
