Cómo descargar un archivo a través de una solicitud POST personalizada con CasperJS

Estoy escribiendo un rastreador y necesito descargar el archivo generado después de una solicitud de formulario usando POST.

He utilizado con éxito this.download (url, ‘POST’, Params) para formularios regulares. Uno de los sitios tiene muchos campos con el mismo nombre, lo que me impide utilizar el método de descarga normal.

Después de probar muchas cosas, intenté con $.ajax() y __utils.sendAJAX() procesar el formulario de esta manera:

 response = this.evaluate(function(){ url=... params = $('form#theirForm').serialize(); data = __utils__.sendAJAX(url, 'POST', params,false,{contentType:"application/x-www-form-urlencoded"}); return __utils__.encode(data); }); function decode_base64(s) { var e={},i,k,v=[],r='',w=String.fromCharCode; var n=[[65,91],[97,123],[48,58],[43,44],[47,48]]; for(z in n){for(i=n[z][0];i<n[z][1];i++){v.push(w(i));}} for(i=0;i<64;i++){e[v[i]]=i;} for(i=0;i<s.length;i+=72){ var b=0,c,x,l=0,o=s.substring(i,i+72); for(x=0;x<o.length;x++){ c=e[o.charAt(x)];b=(b<=8){r+=w((b>>>(l-=8))%256);} } } return r; } casper.then(function() { utils.dump(response); fs.write("test.zip",decode_base64(response),'w'); }); 

Los códigos me devuelven los datos base64 que convierto y almaceno en un archivo test.zip. Pero no puedo descomprimirlo, dice que está corrompido. Vuelvo los datos de un archivo zip correcto =>

 PK^C^D^T^@^H^@^H^@F^@^@^@^@^@^@^@^@^@^@^@^@?^@^@^@fourniture denres alimentairs - dietetique infantile\CCAP.pdf^ET\K;^D^@^Y^F'^D^D^ON^Dwww'^P^D^H^^܂%'97f^SVOzf 

Lo comparé con la primera línea de mi archivo:

 PK^C^D^T^@^H^@^H^@)_^M^@^@^@^@^@^@^@^@^@^@^@^@^@b^@^@^@fourniture denres alimentairs - dietetique infantile\Bordereau de prix dietetique infantile.xlsxzuTI^^4hp^M^D^M^R^H.}p3kpw@pw^M^R4Gv~[ 

¿Alguien tiene una idea de lo que podría haber salido mal?

He intentado muchas cosas (herramientas de encoding, configuración de encoding, volcado desde la consola Chrome para obtener base64 puro, etc.)

No entiendo por qué está relacionado con la encoding latin-1 o utf8, ya que un sitio web me pide que seleccione qué encoding usar. Intenté ambos.

casper.download() acepta felizmente un formulario serializado en lugar de un objeto, por lo que aún puede usarlo. Solo tienes que serializar el formulario en el contexto de la página de antemano:

 var formData = casper.evaluate(function(){ return $('form#theirForm').serialize(); }); var url; casper.download(url, targetFile, 'POST', params); 

El único problema podría ser que se use otro mimeType: “text / plain; charset = x-user-defined”.

En ese caso, tendrá que recrear toda la cascada de funciones que van a casper.download() :

 var url; var response = casper.evaluate(function(url){ var params = $('form#theirForm').serialize(); var data = __utils__.sendAJAX(url, 'POST', params, false); return __utils__.encode(data); }, url); var cu = require('clientutils'); fs.write("test.zip", cu.decode(response), 'wb'); 

“application / x-www-form-urlencoded” se usa de forma predeterminada para __utils__.sendAJAX() .

    Intereting Posts