• Publicidad

Problema con API de Google Translate

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

Problema con API de Google Translate

Notapor zeit009 » 2011-03-30 12:20 @556

¡Buenas!

He empezado a trabajar hace poco con Perl, CGI, etc... y ando un poco perdido.

Mi problema es el siguiente: he creado un pequeño formulario para que la gente introduzca un texto, y dicho texto lo quiero traducir llamando a un programa de Perl que lo tengo guardado en /lib/cgi-bin/ que se conecta a Google y utilizando las API de Google Translate me devuelva el resultado.

El formulario es el siguiente (sencillito) y lo tengo guardado en var/www:

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <FORM method=post action="cgi-bin/ApiPerl.pl">
  2. Traductor WEB
  3. <TABLE BORDER=0>
  4. <TR>
  5.         <TD>Introduzca texto a traducir</TD>
  6.         <TD>
  7.         <TEXTAREA rows="3" input name="textointroducido">
  8.         </TEXTAREA>
  9.  
  10.         </TD>
  11. </TR>
  12.  
  13. <TR>
  14.         <TD COLSPAN=2>
  15.         <INPUT name="traducir" type="submit" value="traducir">
  16.         </TD>
  17. </TR>
  18. </TABLE>
  19. </FORM>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El programa Perl al que se llama es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use REST::Client;
  4. use JSON;
  5. use HTML::Entities qw(decode_entities);
  6.  
  7.  
  8. while (1)
  9. {
  10.     print "Please enter English word: ";
  11.     chop ( $_ = <STDIN>);
  12.    
  13.     my $client = REST::Client->new();
  14.     $client->GET("https://www.googleapis.com/language/translate/v2?key=AIzaSyACJybEm6lyelnYHZzXfydtk-V6-Uz48bQ&en&target=fr&q=$_");
  15.     $response = $client->responseContent();
  16.  
  17.     $json_text = from_json( $response );
  18.  
  19.     foreach my $french(@{$json_text->{data}->{translations}})
  20.     {
  21.         my %ep_hash = ();
  22.         $ep_hash{translatedText} = "Translated to French: $french->{translatedText}";
  23.  
  24.         # print french
  25.         while (my($key, $value) = each (%ep_hash))
  26.         {
  27.             print decode_entities($value);
  28.         }
  29.     }
  30.     print "\n";
  31. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Pero este programa está diseñado para que el texto se introduzca por la entrada estándar y yo lo quiero es que coja el texto introducido por el usuario, es decir, utilizando algo parecido a esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use CGI;
  3.  
  4. my $form = new CGI;
  5. my $txt = $form ->param('textointroducido');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
en donde se guarda el texto introducido por el usuario en el Formulario en $txt.

Por lo tanto, el texto lo obtengo bien con el método POST, pero ¿alguien sabe cómo puedo integrar lo que quiero hacer en el código Perl para que haga la llamada a Google con el texto obtenido? ¿O si hay una manera más fácil de hacer lo que quiero hacer?

Bueno, a ver si alguien me puede echar una mano.
¡Muchas gracias!
Un saludo.
zeit009
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2011-03-30 11:58 @540

Publicidad

Re: Problema con API de Google Translate

Notapor explorer » 2011-03-30 12:34 @565

Bienvenido a los foros de Perl en español, zeit009.

Debes convertir tu programa a un CGI. Si usas el módulo CGI tendrás la mayor parte del trabajo realizado.

Los pasos que hay que dar, dentro de un CGI, en Perl, son:

* Crear el objeto CGI
* Leer los argumentos pasados por el formulario, usando param()
* Procesos esos argumentos
* Crear la salida, en formato texto o HTML, de respuesta, hacia el usuario.

La primera parte ya las mostrado tu, creando el objeto y leyendo el argumento textointroducido. Ahora solo te queda pasar el $txt a la llamada a Google Translate. Por lo que se ve en el código, se trataría de meterlo en la línea 14, pero no es tan sencillo como eso.

Primero tienes que codificar el $txt para que se pueda integrar dentro del URL. Eso lo puedes hacer con las funciones del módulo URI::Encode.

Luego, haces la llamada a Google Translate, obtienes la respuesta, y usando las funciones de creación de etiquetas HTML de CGI, puedes crear la respuesta hacia el usuario.

En estos foros, en la sección Tutoriales tienes las bases de creación de los CGI. En el mensaje CGI mínimo tienes un ejemplo de respuesta con marcas HTML.

Esta no es, desde luego, la única manera de responder al usuario. Sí una de las más simples.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con API de Google Translate

Notapor zeit009 » 2011-03-31 05:24 @266

¡Buenas explorer!
Muchas gracias por tu respuesta y la rapidez. Pero ahora me ha surgido otras dudas

He estado mirando lo de codificar mi variable $txt pero no me queda claro...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  $uri->encode("http://perl.com/foo bar");      # http://perl.com/foo%20bar
  $uri->encode("http://perl.com/foo bar", 1);   # http%3A%2F%2Fperl.com%2Ffoo%20bar
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Viendo esto no me queda muy claro... ¿cómo tengo que hacer la llamada? Y si la respuesta a esa llamada me la guarda en una variable, por ejemplo, $uritxt ¿cómo introduzco esto en la llamada a la API de Google? ¿Se pone el $uritxt en la URL?

El formato de la respuesta que he hecho es este (sencillito):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print $form ->header;

print "<b> $respuesta </b>\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Bueno, a ver si me podéis echar una mano.

¡Gracias!
¡Un saludo!
zeit009
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2011-03-30 11:58 @540

Re: Problema con API de Google Translate

Notapor explorer » 2011-03-31 07:11 @341

La llamada es igual a como lo tienes en el programa a partir de la línea 13, pero cambiando $_ por la variable que contiene el texto codificado.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con API de Google Translate

Notapor explorer » 2011-03-31 15:12 @675

Sería algo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use CGI ':standard';
  4. use REST::Client;
  5. use JSON;
  6. use HTML::Entities qw(decode_entities);
  7. use URI::Encode;
  8.  
  9. my $form = new CGI;
  10. my $uri = URI::Encode->new();
  11. my $txt = $form->param('textointroducido');
  12. $txt    = $uri->encode( $txt, 1);
  13.  
  14. my $client = REST::Client->new();
  15. $client->GET("https://www.googleapis.com/language/translate/v2?key=AIzaSyACJybEm6lyelnYHZzXfydtk-V6-Uz48bQ&en&target=fr&q=$txt");
  16. $response = $client->responseContent();
  17. $json_text = from_json( $response );
  18.  
  19. print $form->header;
  20. print $form->start_html;
  21.  
  22. for my $french(@{$json_text->{data}->{translations}}) {
  23.     my %ep_hash = ();
  24.     $ep_hash{translatedText} = "Translated to French: $french->{translatedText}";
  25.  
  26.     # print french
  27.     while (my($key, $value) = each (%ep_hash)) {
  28.         print $form->p(decode_entities($value));
  29.     }
  30. }
  31.  
  32. print $form->end_html;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Creo que se ve la intención:
* Lees el parámetro pasado por el usuario en el formulario
* Hacemos la codificación tipo uri
* Luego lo mandas a Google Translate
* Comienzas a crear la respuesta hacia el usuario, enviando el header() y el start_html
* Mandas la traducción en forma de párrafos
* Fin del html con end_html.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con API de Google Translate

Notapor zeit009 » 2011-04-02 13:54 @621

Ya he conseguido que funcione el programa.

El código que has puesto es correcto, lo único que he tenido que quitar es "use strict". También me he tenido que bajar varios paquetes para que me funcionara (URI,...)

Muchas gracias explorer, me ha sido de gran utilidad tu ayuda.

¡Hasta la próxima!
zeit009
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2011-03-30 11:58 @540


Volver a Web

¿Quién está conectado?

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

cron