2010-05-02 38 views
6

que tendrá que obtener algún resultado en una página web, que utilizan un código JavaScript para generar la parte estoy interesantes de como seguirCómo evaluar el código Javascript en Python

eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--)d[c]=k[c]||c;k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('5 11=17;5 12=["/3/2/1/0/13.4","/3/2/1/0/15.4","/3/2/1/0/14.4","/3/2/1/0/7.4","/3/2/1/0/6.4","/3/2/1/0/8.4","/3/2/1/0/10.4","/3/2/1/0/9.4","/3/2/1/0/23.4","/3/2/1/0/22.4","/3/2/1/0/24.4","/3/2/1/0/26.4","/3/2/1/0/25.4","/3/2/1/0/18.4","/3/2/1/0/16.4","/3/2/1/0/19.4","/3/2/1/0/21.4"];5 20=0;',10,27,'40769|54|Images|Files|png|var|imanhua_005_140430179|imanhua_004_140430179|imanhua_006_140430226|imanhua_008_140430242|imanhua_007_140430226|len|pic|imanhua_001_140429664|imanhua_003_140430117|imanhua_002_140430070|imanhua_015_140430414||imanhua_014_140430382|imanhua_016_140430414|sid|imanhua_017_140430429|imanhua_010_140430289|imanhua_009_140430242|imanhua_011_140430367|imanhua_013_140430382|imanhua_012_140430367'.split('|'),0,{})) 

El resultado de eval() es valioso para mí , Estoy escribiendo un script Python, ¿hay alguna biblioteca que pueda usar para ejecutar virtualmente este fragmento de código JavaScript y obtener el resultado?

Gracias

Respuesta

6

Utilice un spidermonkey binding

from spidermonkey import Runtime 
rt = Runtime() 
cx = rt.new_context() 
result = cx.eval_script(whatyoupostedabove) 
+0

Este proyecto parece estar muerto desde hace mucho tiempo, y no funcionará en el leopardo de las nieves – overboming

+0

Uso la versión de ruby ​​en Linux, y también está algo muerta. Pero funciona. El mayor problema en ruby ​​no son los enlaces en sí, sino obtener la spidermonkey correcta (no funcionó con 1.9, por ejemplo). – duncan

+0

parece que hay una continuación en https://github.com/davisp/python-spidermonkey pero tampoco se ha actualizado en dos años en este momento. –

9

pyv8 es un conjunto de enlaces para el JavaScript V8 motor (Google Chrome)

+0

amor para ver tantas opciones , entre spidermonkey y v8, es cuestión de preferir Firefox o Chrome, ¡gracias! – overboming

+0

He tenido éxito con pyv8 – Henry

4

Puede utilizar PyQt con el WebKit módulo :) Tiene motor JS y puede evaluar JS dentro del contexto de un documento (X) HTML.

+0

Qué BTW usa SquirrelFish (Extreme) de Safari/Webkit en plataformas compatibles. –

+0

Ah, y también puede usar QScript, que es más eficiente porque no tiene que preocuparse por el DOM o la representación.(Utiliza SquirrelFish también) –

2

supongo que resolvió el problema ahora, pero quería compartir otra (una en mi opinión mucho más viable) opción. Cuando esté interesado en evaluar solo una función --known-- javascript, puede ser más fácil implementar esta función en Python en lugar de utilizar una herramienta enorme que está diseñada para analizar y ejecutar todos los javascript imaginables en el mundo.

Así que sugeriría escribir una versión python de la función javascript unpacker y la mayoría está resuelta. De hecho, hice eso y aquí hay un ejemplo. La función int2base es la implementación de Alex Martelli, que se puede encontrar en here.

def unpack(p, a, c, k, e=None, d=None): 
    ''' unpack 
    Unpacker for the popular Javascript compression algorithm. 

    @param p template code 
    @param a radix for variables in p 
    @param c number of variables in p 
    @param k list of c variable substitutions 
    @param e not used 
    @param d not used 
    @return p decompressed string 
    ''' 
    # Paul Koppen, 2011 
    for i in xrange(c-1,-1,-1): 
     if k[i]: 
      p = re.sub('\\b'+int2base(i,a)+'\\b', k[i], p) 
    return p 

Finalmente, debe hacer un pequeño análisis para extraer los cuatro argumentos de función. Solo por el simple hecho de una ilustración, uso eval aquí para dejar que Python haga eso por mí.

s = '''eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--)d[c]=k[c]||c;k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('5 11=17;5 12=["/3/2/1/0/13.4","/3/2/1/0/15.4","/3/2/1/0/14.4","/3/2/1/0/7.4","/3/2/1/0/6.4","/3/2/1/0/8.4","/3/2/1/0/10.4","/3/2/1/0/9.4","/3/2/1/0/23.4","/3/2/1/0/22.4","/3/2/1/0/24.4","/3/2/1/0/26.4","/3/2/1/0/25.4","/3/2/1/0/18.4","/3/2/1/0/16.4","/3/2/1/0/19.4","/3/2/1/0/21.4"];5 20=0;',10,27,'40769|54|Images|Files|png|var|imanhua_005_140430179|imanhua_004_140430179|imanhua_006_140430226|imanhua_008_140430242|imanhua_007_140430226|len|pic|imanhua_001_140429664|imanhua_003_140430117|imanhua_002_140430070|imanhua_015_140430414||imanhua_014_140430382|imanhua_016_140430414|sid|imanhua_017_140430429|imanhua_010_140430289|imanhua_009_140430242|imanhua_011_140430367|imanhua_013_140430382|imanhua_012_140430367'.split('|'),0,{}))''' 
js = eval('unpack' + s[s.find('}(')+1:-1]) 

Resultado:

'var len=17;var pic=["/Files/Images/54/40769/imanhua_001_140429664.png","/Files/Images/54/40769/imanhua_002_140430070.png","/Files/Images/54/40769/imanhua_003_140430117.png","/Files/Images/54/40769/imanhua_004_140430179.png","/Files/Images/54/40769/imanhua_005_140430179.png","/Files/Images/54/40769/imanhua_006_140430226.png","/Files/Images/54/40769/imanhua_007_140430226.png","/Files/Images/54/40769/imanhua_008_140430242.png","/Files/Images/54/40769/imanhua_009_140430242.png","/Files/Images/54/40769/imanhua_010_140430289.png","/Files/Images/54/40769/imanhua_011_140430367.png","/Files/Images/54/40769/imanhua_012_140430367.png","/Files/Images/54/40769/imanhua_013_140430382.png","/Files/Images/54/40769/imanhua_014_140430382.png","/Files/Images/54/40769/imanhua_015_140430414.png","/Files/Images/54/40769/imanhua_016_140430414.png","/Files/Images/54/40769/imanhua_017_140430429.png"];var sid=40769;' 

Nota adicional: fue traído a mi atención que si la raíz> 36 luego de Alex int2base descansos de función. La solución es modificar mediante la adición de caracteres en mayúsculas así: digs = string.digits + string.lowercase + string.uppercase

0

al importar el módulo javacript no es opción, yo uso esta salida

import re 

def baseN(num,b,numerals="abcdefghijklmnopqrstuvwxyz"): 
    return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b]) 

def unpack(p, a, c, k, e=None, d=None): 
    while (c): 
     c-=1 
     if (k[c]): 
      p = re.sub("\\b" + baseN(c, a) + "\\b", k[c], p) 
    return p 

encrypted = r'''eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--)d[c]=k[c]||c;k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('5 11=17;5 12=["/3/2/1/0/13.4","/3/2/1/0/15.4","/3/2/1/0/14.4","/3/2/1/0/7.4","/3/2/1/0/6.4","/3/2/1/0/8.4","/3/2/1/0/10.4","/3/2/1/0/9.4","/3/2/1/0/23.4","/3/2/1/0/22.4","/3/2/1/0/24.4","/3/2/1/0/26.4","/3/2/1/0/25.4","/3/2/1/0/18.4","/3/2/1/0/16.4","/3/2/1/0/19.4","/3/2/1/0/21.4"];5 20=0;',10,27,'40769|54|Images|Files|png|var|imanhua_005_140430179|imanhua_004_140430179|imanhua_006_140430226|imanhua_008_140430242|imanhua_007_140430226|len|pic|imanhua_001_140429664|imanhua_003_140430117|imanhua_002_140430070|imanhua_015_140430414||imanhua_014_140430382|imanhua_016_140430414|sid|imanhua_017_140430429|imanhua_010_140430289|imanhua_009_140430242|imanhua_011_140430367|imanhua_013_140430382|imanhua_012_140430367'.split('|'),0,{}))''' 

encrypted = encrypted.split('}(')[1][:-1] 

print eval('unpack(' + encrypted) 

:

var len=17;var pic=["/Files/Images/54/40769/imanhua_001_140429664.png","/Files/Images/54/40769/imanhua_002_140430070.png","/Files/Images/54/40769/imanhua_003_140430117.png","/Files/Images/54/40769/imanhua_004_140430179.png","/Files/Images/54/40769/imanhua_005_140430179.png","/Files/Images/54/40769/imanhua_006_140430226.png","/Files/Images/54/40769/imanhua_007_140430226.png","/Files/Images/54/40769/imanhua_008_140430242.png","/Files/Images/54/40769/imanhua_009_140430242.png","/Files/Images/54/40769/imanhua_010_140430289.png","/Files/Images/54/40769/imanhua_011_140430367.png","/Files/Images/54/40769/imanhua_012_140430367.png","/Files/Images/54/40769/imanhua_013_140430382.png","/Files/Images/54/40769/imanhua_014_140430382.png","/Files/Images/54/40769/imanhua_015_140430414.png","/Files/Images/54/40769/imanhua_016_140430414.png","/Files/Images/54/40769/imanhua_017_140430429.png"];var sid=40769; 
Cuestiones relacionadas