• Publicidad

Usar un convertidor online desde perl

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Usar un convertidor online desde perl

Notapor Abraham » 2013-07-22 18:19 @804

Otra vez pasando por aquí.

Tengo un problema. Al tratar de automatizar el uso de este convertidor online a través de perl usé el LWP::UserAgent pero no funciona. No funciona porque el servidor es algo especial y sumado a mis pocos conocimientos es fatal pero creo conocer lo básico. Paso a explicar lo que he podido analizar con este servidor:

Primero aislé el form que hace una petición POST al servidor (al parecer hacía una petición JSON. Esa parte la borré y ahora solo es un "simple" POST).
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <html>
  2. <body>
  3. <form id="forms" class="forms" action="http://www23.online-convert.com/es/inicio-conversion-imagen" name="forms" method="post">
  4.         <input type="text" name="external_url" id="external_url" value="http://www.madboxpc.com/wp-content/uploads/2011/07/opera_next_12.jpg">
  5.         <input type="checkbox" name="equalize" value="1"> Ecualizar
  6.         <input type="checkbox" name="normalize" value="1"> Normalizar
  7.         <input type="checkbox" name="enhance" value="1"> Mejorar
  8.         <input type="checkbox" name="sharpen" value="1"> Enfocar
  9.         <input type="checkbox" name="antialias" value="1"> Antialias
  10.         <input type="checkbox" name="despeckle" value="1"> Eliminar manchas
  11.         <input type="submit">
  12.         <input type="hidden" name="string_method" value="convertir-a-webp">
  13. </form>
  14. </body>
  15. </html>
  16.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

El código HTML hace una conversión de una URL JPG a WEBP.

Inspeccionando con la herramienta del Chrome veo esto (con el método POST, sus cabeceras):

Request URL:http://www23.online-convert.com/es/inicio-conversion-imagen
Request Method:POST
Status Code:302 Moved Temporarily
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:es-ES,es;q=0.8
Cache-Control:max-age=0
Content-Length:128
Content-Type:application/x-www-form-urlencoded
Host:www23.online-convert.com
Origin:null
Proxy-Connection:keep-alive
User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36
Form Data view source view URL encoded
external_url:http://www.madboxpc.com/wp-content/uploads/2011/07/opera_next_12.jpg
string_method:convertir-a-webp
Response Headers view source
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:keep-alive
Content-Encoding:gzip
Content-Length:20
Content-Type:text/html
Date:Mon, 22 Jul 2013 22:47:36 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Location:http://www.online-convert.com/es/resultado/accc0a9071ee3547238b8088528ee57e
Pragma:no-cache
Server:Apache
Set-Cookie:OC_PHPSESSID=3grah00tcff5plhih9vvr9e3fr8hcbj3m0bg28ituvgvntmkg6h1; expires=Mon, 29-Jul-2013 22:47:40 GMT; path=/; domain=.online-convert.com; HttpOnly
Vary:User-Agent,Accept-Encoding
Via:1.0 Internet_Kawaii_El_Alto-Bolivia_2012 (squid/3.1.19)
X-Cache:MISS from Internet_Kawaii_El_Alto-Bolivia_2012
X-Cache-Lookup:MISS from Internet_Kawaii_El_Alto-Bolivia_2012:3128
X-Powered-By:PHP/5.3.17submit

En la parte de Response Headers existe un valor de redirección (creo): Location:http://www.online-convert.com/es/resultado/accc0a9071ee3547238b8088528ee57e. En esta URL se encuentra la respuesta de la conversión. En este caso la URL de la imagen en formato WEBP.

Aunque existe una cookie en esta parte, al parecer no es importante ya que en el navegador las cookies están borradas y bloqueadas.

La respuesta que da este servidor al parecer es solamente las cabeceras y nada en el contenido, redireccionándolo inmediatamente a esa URL de Location.

Tratando de hacer esto con LWP useragent recibo una página de error generado por el servidor (no son los típicos errores de HTML).

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use CGI       qw(:standard      );
  2. use CGI::Carp qw(fatalsToBrowser);
  3. use LWP::UserAgent;
  4.  
  5.  
  6. my $url = "http://www23.online-convert.com/es/inicio-conversion-imagen";
  7. my $query = "external_url:http%3A%2F%2Fwww.madboxpc.com%2Fwp-content%2Fuploads%2F2011%2F07%2Fopera_next_12.jpg&string_method:convertir-a-webp";
  8.  
  9. my $ua = LWP::UserAgent->new;
  10.    $ua->agent('Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36');
  11.  
  12. my $req = HTTP::Request->new(POST => $url);
  13.    $req->content_type('application/x-www-form-urlencoded');
  14.    $req->content($query);
  15.  
  16. my $response = $ua->request($req);
  17. my $content  = $response->content(); # contenido de la respuesta. AQUÍ ESPERO RECIBIR NADA, AL IGUAL QUE EL NAVEGADOR, PERO RECIBO EL ERROR GENERADO
  18.  
  19. print "Content-type: text/txt\n\n";
  20. print $content;
  21.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Falta algo y no sé qué puede ser.

Apelando a sus conocimientos me despido esperando una respuesta... Gracias.
Abraham
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2013-07-08 19:10 @840

Publicidad

Re: Usar un convertidor online desde perl

Notapor explorer » 2013-07-22 19:35 @858

¿Y cuál es el error que aparece?

Lo que veo en el código... es que creo que el POST no se hace de la forma correcta. Por ejemplo, en $query, tienes el valor con códigos URL, lo cual no es necesario, ya que LWP se encargará de eso.

my $query = "external_url=http://www.madboxpc.com/wp-content/uploads/2011/07/opera_next_12.jpg&string_method=convertir-a-webp";

Repasa la documentación de lwpcook, para ver ejemplos sencillos de POST.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Usar un convertidor online desde perl

Notapor Abraham » 2013-07-22 21:25 @934

Bueno, esa URL es el archivo de origen.

En un convertidor tenemos el origen y el destino, ¿¿¿verdad???

Ese dato puede ser un archivo que subiría al servidor en la página http://imagen.online-convert.com/es/convertir-a-webp

external_url=http://www.madboxpc.com/wp-content/uploads/2011/07/opera_next_12.jpg

external_url es la variable y la URL es el dato.

Lo he probado codificándolo también como http%3A%2F%2Fwww.madboxpc.com%2Fwp-content%2Fuploads%2F2011%2F07%2Fopera_next_12.jpg y no funciona.

El error es:

501 No implementado

Y es por eso que digo que es un error generado por el servidor.

Pienso que la solución iría por leer las cabeceras que el servidor PHP entrega al realizar la consulta POST ya que uno de ellos, Location, tiene la URL de respuesta, pero para eso lo que se entrega al contenido debería de ser vació y no esa página de error.
Abraham
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2013-07-08 19:10 @840

Re: Usar un convertidor online desde perl

Notapor explorer » 2013-07-23 07:42 @362

La cosa no es tan sencilla: la página con el formulario es cierto que devuelve una redirección.

Esa nueva dirección lleva a una página de espera (no a la imagen resultado). La página de espera es un código HTML que contiene un <iframe>, que muestra el progreso de la conversión.

El <iframe> enlaza a otra página, que va mostrando el progreso. En un momento dado (no es inmediato), la conversión termina, y obtenemos otro HTML (el tercero) donde se nos informa que ha terminado y nos dan el enlace (por fin) a la imagen convertida, para que la bajemos.

En tu programa, no entiendo porque sacas un "Content-type", al final. ¿Estás ejecutando tu propio programa como si fuera un CGI?

Esta es la solución que he encontrado (una de muchas) para bajar la imagen ya convertida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.10;
  3. use HTTP::Request::Common;      # método POST
  4. use LWP::UserAgent;             # agente de usuario HTTP
  5. use LWP::Simple;                # métodos get, getstore
  6.  
  7. ## Definimos nuestro agente de usuario
  8. my $ua = LWP::UserAgent->new(
  9.     agent       => 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36',
  10.     timeout     => 20,
  11.     cookie_jar  => undef,
  12. );
  13.  
  14. ## Hacemos nuestra petición POST de conversión
  15. my $respuesta = $ua->request(
  16.     POST 'http://www19.online-convert.com/es/inicio-conversion-imagen',
  17.         [
  18.             external_url        => 'http://www.madboxpc.com/wp-content/uploads/2011/07/opera_next_12.jpg',
  19.             width               => '',
  20.             height              => '',
  21.             color               => 1,
  22.             equalize            => 1,
  23.             normalize           => 1,
  24.             enhance             => 1,
  25.             sharpen             => 1,
  26.             antialias           => 1,
  27.             despeckle           => 1,
  28.             dpi                 => '',
  29.             submit_button       => 'Convertir archivo',
  30.             string_method       => 'convertir-a-webp',
  31.         ]
  32. );
  33. #say $respuesta->as_string;
  34.  
  35. say "Es info"     if $respuesta->is_info;
  36. say "Es éxito"    if $respuesta->is_success;
  37. say "Es redirect" if $respuesta->is_redirect;
  38. say "Es error"    if $respuesta->is_error;
  39.  
  40. my $location = $respuesta->header('Location');                    # extraemos el campo Location:
  41. say "Location: $location";
  42.  
  43. my $pagina_espera = get($location);                               # pedimos esa nueva página
  44. #say "URL espera: $pagina_espera";
  45.  
  46.                                                                   # buscamos el enlace en el marco de espera
  47. my($enlace_pagina_descarga) = $pagina_espera =~ /<iframe id="download_try" .+? src="(.+?)"/;
  48. say "URL descarga: $enlace_pagina_descarga";
  49.  
  50. while(1) {                                                        # bucle infinito
  51.     say "Espera..."; sleep 2;                                                         # esperamos un par de segundos
  52.  
  53.     my $pagina_descarga = get($enlace_pagina_descarga);                               # vemos el resultado de la conversión
  54.  
  55.     if ($pagina_descarga =~ /Tu archivo ha sido convertido/) {                        # nos dicen que sí ha sido convertido
  56.  
  57.         my($enlace) = $pagina_descarga =~ /"(.+?)">enlace de descarga directa/;       # entonces, sacamos el enlace de descarga
  58.  
  59.         if ($enlace) {
  60.             getstore($enlace, 'imagen.webp');                                         # bajamos la imagen a nuestro disco
  61.             say "Descargada la imagen";
  62.         }
  63.  
  64.         last;                                                                         # y terminamos el bucle (salimos)
  65.     }
  66. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
> ./kk.pl
Es redirect
Location: http://www.online-convert.com/es/result ... 29355be7f8
URL descarga: http://www.online-convert.com/es/descar ... 29355be7f8
Espera...
Descargada la imagen
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Usar un convertidor online desde perl

Notapor Abraham » 2013-07-23 09:41 @445

Sí que funciona, pero surge un problema, (que ya esperaba, aunque, no me había pasado aún, ¿sera el while?) esperare el tiempo y lo probaré de nuevo pero este límite, no me gusta nada, están en su derecho, solo me queda la satisfacción de haber aprendido este método, que se va a la colección de códigos y lo usaré en otros propósitos:

Mensaje de error
Ha habido demasiadas peticiones de conversión desde tu dirección de IP en las últimas 24 horas. Por favor, prueba más tarde.

El "Content-type" del final, efectivamente, es un CGI. La razón es porque tengo un servidor Apache para mi red interna con Linux y no es de fácil acceso y por eso opté por esta, que considero una solución, para probar código Perl...

GRACIAS, explorer.
Abraham
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2013-07-08 19:10 @840

Re: Usar un convertidor online desde perl

Notapor explorer » 2013-07-23 11:13 @509

Abraham escribiste:Sí que funciona, pero surge un problema, (que ya esperaba, aunque, no me había pasado aún, ¿sera el while?) esperare el tiempo y lo probaré de nuevo pero este límite, no me gusta nada, están en su derecho, solo me queda la satisfacción de haber aprendido este método, que se va a la colección de códigos y lo usaré en otros propósitos:

Mensaje de error
Ha habido demasiadas peticiones de conversión desde tu dirección de IP en las últimas 24 horas. Por favor, prueba más tarde.


Lo dice claramente en las condiciones de uso: «The services provide the following types of service levels: "Free", "24h", "Silver", "Gold" and "Platin". The Customer acknowledges and agrees that the Provider may establish general practices and policies concerning the use of the services, including, without limitation, the maximum number of files that a Customer may upload through the services, the maximum size of the files that a Customer may convert through the services, the maximum number of hours or days that a file will be stored by the services, and the maximum number of times a user may access the services in a given period of time.»

O sea, que según les pagues, tendrás más o menos servicios. Lista de precios y servicios.


Abraham escribiste:El "Content-type" del final, efectivamente, es un CGI. La razón es porque tengo un servidor Apache para mi red interna con Linux y no es de fácil acceso y por eso opté por esta, que considero una solución, para probar código Perl...
¿Que no es de fácil acceso? Yo accedo a todos mis Linux a través de SSH. No es necesario tener un servidor Apache entero para ver la ejecución de un programa que puede lanzarse desde la misma línea de comandos. Solo necesitas un programa de terminal, como PuttySSH (en caso de Windows).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Usar un convertidor online desde perl

Notapor Abraham » 2013-07-23 15:53 @704

Estás en lo correcto.

Ahora, sobre Linux entiendo poco, pero cada día un poco más. El servidor Apache lo implementé hace mucho y lo uso en la red interna con PHP y últimamente con CGI y de ahí salió esa pseudo solución. Veré el SSH, pero por ahora tengo no más, ya que el proyecto se basa y espero que se base en CGI.
Abraham
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2013-07-08 19:10 @840

Re: Usar un convertidor online desde perl

Notapor explorer » 2013-07-23 16:41 @737

Si tienes un Linux, no necesitas de ningún conversor externo.

Basta con instalar el software ImageMagick (o compatible), que seguro que lo tienes en la lista de software que puedes instalar, y ejecutas
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
$ identify -list format
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y verás docenas de formatos de imagen que puedes convertir de uno a otro (incluido el WEBP).

Es más, apuesto a que esa web está usando ImageMagick :)

Incluso apostaría a que ya lo tienes instalado :) (a veces viene de base).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Usar un convertidor online desde perl

Notapor Abraham » 2013-07-23 19:59 @874

Es correcto si solo quisiera la conversión, ahí se oculta un propósito mas...

Ya, en fin, el proyecto global se trata de mejorar el acceso a Internet de la red interna, ¿y por qué eso?, simplemente por no contar con una conexión decente, no por lo que yo lo quise así, si no que no hay de otra, el ADSL parece que jamás llegará por estos lados, y más cuando han aparecido esos "dichosos" modems de 3G y 4G que se cobra por megas y además el número de conexiones está limitado. Las empresas ISP han comenzado a dar prioridad a estos aparatitos móviles. Y ahora sólo cuento con una conexión de 1Mbps por WIMAX que solo garantiza el 30 %.

Gracias a Squid, Apache, (PHP y Perl), PostgreSQL he ideado un "sistema" más o menos aceptable.

Cómo te podrás dar cuenta ese propósito oculto era de aprovechar la compresión del WEBP comparado al JPG y no solo de las imágenes...
Y con esto mejorar el ancho de banda de mi triste conexión, ¡ja, ja, ja, ja!
El sistema funciona, o funcionaba por ese límite que impone el servidor; aun pagando 1GB por mes no abastecería.

Y por eso, cuando nace una idea, voy en busca de códigos que me serían útiles para mi propósito.
Abraham
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2013-07-08 19:10 @840

Re: Usar un convertidor online desde perl

Notapor explorer » 2013-07-23 20:23 @891

Te entiendo. Yo también estuve en esa situación, pero lo resolví usando el lynx o el links (navegar en puro texto), así que podías acceder y leer lo que quisieras, con muy poco consumo.

Hoy en día, en alguna situación especial (estás fuera de casa, no tienes tarifa plana de datos móviles), pues con ir a las propiedades de Firefox, pestaña Contenido, puedo desactivar la carga automática de las imágenes, con lo que yo decido qué imagen quiero ver, en cada momento, y así se limita fácil el consumo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados