Ed Poliglota
em
[Migrado do LetsHackIt]
Hmm, vamos brincar um pouco com Robô Ed? É aquele Robô Ed que está no site do Ministério de Minas de Energia do Brasil… Não sabe qual? Olhe aqui: http://www.ed.conpet.gov.br/br/converse.php – Mas não vamos brincar de conversar não! Vamos fazer algo mais legal, vamos ver o que da pra fazer!
Vamos analisar o código fonte do site e ver se descobrimos algo legal!
Bom, o botão Enviar tem a função DoTalk() , percorrendo o código para achar o que ela faz achei umas coisas interessantes:
var e_usermsg = escape(usermsg); e_usermsg = e_usermsg.replace(/\+/g, "%2B"); var url = '/mod_perl/bot_gateway.cgi?server='+bot_server+'&charset=utf-8&pure=1&js=0&msg='+e_usermsg; // Salva tudo em campo hidden para que outro frame possa ler os dados da conversa document.form1.fulltext.value += "Você: "+usermsg+"\n"; document.form1.fulltext.value += "Ed: "+answer+"\n";
Vamos ver, tem uma var ali com a URL de request. Será que da pra brincar?
——————————————————————————-
Seguindo a lógica da URL, começando com a / significa root do documento, vendo o site por http://www.ed.conpet.gov.br/br/converse.php o root seria http://www.ed.conpet.gov.br . Logo: http://www.ed.conpet.gov.br/mod_perl/bot_gateway.cgi?server=’+bot_server+’&charset=utf-8&pure=1&js=0&msg=’+e_usermsg Vamos descobrir o valor da variável bot_server, afinal o e_usermsg nem preciso comentar né?
——————————————————————————-
Olha que legal! Achei o endereço no próprio código:
var bot_id = 5; //bot_server = ‘r.bot.insite.com.br:8085’; //bot_server = ‘bot.insite.com.br:8085’; bot_server = ‘0.0.0.0:8085’;
Vamos tentar substituir para ver?
http://www.ed.conpet.gov.br/mod_perl/bot_gateway.cgi?server=0.0.0.0:8085&charset=utf-8&pure=1&js=0&msg=Ola Opa! Funcionou, consegui uma resposta!
Oi, como posso ajudar?
——————————————————————————-
Vamos ao meu amigo Python por enquanto! Que tal fazer um script que pergunte pergunte algo pro Ed? Vamos lá!
import urllib print “Insira a mensagem pro Ed! :” mensagem = raw_input() f = urllib.urlopen(“http://www.ed.conpet.gov.br/mod_perl/bot_gateway.cgi?server=0.0.0.0:8085&charset=utf-8&pure=1&js=0&msg=”+mensagem) s = f.read() f.close() print “Resposta do Ed: “+s
Deve funcionar, vamos ver!
# python ed.py
Insira a mensagem pro Ed! :
Ola Ed!
Resposta do Ed: Oi, como posso ajudar?
Uhul! Funciona! Vamos pensar em algo mais legal para fazer 😀
——————————————————————————-
Olha que legal o que eu descobri! Google Text-To-Speech API!
——————————————————————————-
O @gustavojordan sugeriu fazer um Robô Ed para os gringos, vamos lá então!
Ele sugeriu o uso dessa lib: http://www.catonmat.net/blog/python-library-for-google-translate/
——————————————————————————-
É, essa lib xgoogle vai quebrar o galho:
from xgoogle.translate import Translator
translate = Translator().translate
print translate(“Estou doido”)
I’m very excited
——————————————————————————-
Bom, essa lib não tem suporte a pt-br, mas uma pequena modificação faz ela suportar (afinal o tio Google suporta pt-br). Só adicionei pt-br nos índices de línguas do translator.py e voi-lá!
from xgoogle.translate import Translator
translate = Translator().translate
print translate(“Hello world”, lang_to=’pt-br’)
Olá, mundo
——————————————————————————-
Yahooooo! Ops, Gooooooogle!
Tradução funciona! Agora os gringos podem falar com o Ed!
# python ed.py
Insert your message for Ed:
Hello
Ed says: Hello, how are you?
O código? Claro, por que não!
import urllib from xgoogle.translate import Translator translate = Translator().translate print "Insert your message for Ed: " mensagem = raw_input() mensagem = translate(mensagem, lang_to='pt-br').encode('utf-8') url = 'http://www.ed.conpet.gov.br/mod_perl/bot_gateway.cgi?server=0.0.0.0:8085&charset=utf-8&pure=1&js=0&msg=' f = urllib.urlopen(url+mensagem) s = f.read() f.close() print "Ed says: "+ translate(s)
——————————————————————————-
# python ed.py
Insert your message for Ed:
la luna piena piange lo sangue de l’innocenza
Ed says: Auuuuuuuuuuuu! Full moon makes me inspired!
Agora sabemos que pode-se falar em qualquer língua que o Google Translate aceite!
——————————————————————————-
Bom o Taka disse que é ruim o bot sempre responder em inglês. Então vou fazer ele responder na língua que for digitada!
Pequena modificação no translate.py para que ele me retorne também a informação que o Google da sobre a linguagem de origem:
Após:
try: translation = self.browser.get_page(real_url) data = json.loads(translation) if data[‘responseStatus’] != 200: raise TranslationError, “Failed translating: %s” % data[‘responseDetails’]
Vamos ver 😀
from xgoogle.translate import Translator
translate = Translator().translate
translate(“Hello World”, lang_to=’pt-br’)
{u’responseData’: {u’translatedText’: u’Ol\xe1 Mundo’, u’detectedSourceLanguage’: u’en’}, u’responseDetails’: None, u’responseStatus’: 200}
Funciona!
——————————————————————————-
É isso ai pessoal! Agora o Ed é poliglota!
# python ed_pol.py
Insert your message for Ed:
Hello Ed
Ed Response: Hi, how can I help?
# python ed_pol.py
Insert your message for Ed:
Buenos Dias Ed
Ed Response: Muy buenos dias! Gusto en conocerlo.
# python ed_pol.py
Insert your message for Ed:
ange ou démon, qui l’emporte à la fin?
Ed Response: Emily a dàcouvert dans la Voie Lactàe gràce doeun petit ange avec une aile cassàe. Il Àtait en voyage vers le ciel
Código? Claro!
import urllib from xgoogle.translate import Translator translate = Translator().translate print "Insert your message for Ed: " mensagem = raw_input() mensagem = translate(mensagem, lang_to='pt-br') url = 'http://www.ed.conpet.gov.br/mod_perl/bot_gateway.cgi?server=0.0.0.0:8085&charset=utf-8&pure=1&js=0&msg=' f = urllib.urlopen(url+mensagem['responseData']['translatedText'].encode('utf-8')) s = f.read() f.close() langfrom=mensagem['responseData']['detectedSourceLanguage'] resp=translate(s, lang_to=langfrom)['responseData']['translatedText'] print "Ed Response: "+resp
——————————————————————————-
Estou pensando, que tal algo mais público? Tipo uma página onde qualquer um possa falar com o Robô Ed em qualquer língua? É uma boa! Vamos fazer com PHP então e disponibilizar um link para vocês!
——————————————————————————-
Com PHP é simples também para pegar a mensagem do Ed:
$mensagem = utf8_encode($_REQUEST["mensagem"]); echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'; $url = "http://www.ed.conpet.gov.br/mod_perl/bot_gateway.cgi?server=0.0.0.0:8085&charset=utf-8&pure=1&js=0&msg="; $x = strip_tags(file_get_contents($url.$mensagem)); echo $x;
Isso já faz o papel 😀
——————————————————————————-
Brinquei tanto na API de Translate da Google, que parece que me baniram #EPIC FAIL
——————————————————————————-
Falsifiquei o User Agent dizendo que era um browser Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) e a Google aceitou!
Função usada no PHP para traduzir com google translate:
function translate($msg, $from="", $to="pt-br") { $tUrl = "http://ajax.googleapis.com/ajax/services/language/translate? v=1.0&q=\".urlencode\(\$msg).\"&langpair=\".\$from.\"|\".\$to; $curl = curl_init($tUrl); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_COOKIEFILE, "cookiefile"); curl_setopt($curl, CURLOPT_COOKIEJAR, "cookiefile"); # SAME cookiefile $output = curl_exec($curl); curl_close($curl); $rt = json_decode($output); return $rt; }
——————————————————————————-
O Ed Agora é poliglota em PHP também!
You asked: Buenos Dias, Ed
Ed Response: Eso está muy bien …
O código? Claro!
function translate($msg, $from="", $to="pt-br") { $tUrl = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=\".urlencode\(\$msg).\"&langpair=\".\$from.\"|\".\$to; $curl = curl_init($tUrl); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_COOKIEFILE, "cookiefile"); curl_setopt($curl, CURLOPT_COOKIEJAR, "cookiefile"); # SAME cookiefile $output = curl_exec($curl); curl_close($curl); $rt = json_decode($output, TRUE); return $rt; } $mensagem = translate($_REQUEST["mensagem"]); $from = $mensagem["responseData"]["detectedSourceLanguage"]; $mensagem = utf8_encode($mensagem["responseData"]["translatedText"]); echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'; $x = strip_tags(file_get_contents("http://www.ed.conpet.gov.br/mod_perl/bot_gateway.cgi?server=0.0.0.0:8085&charset=utf-8&pure=1&js=0&msg=".$mensagem)); $resp = translate($x,"",$from); echo("You asked: ".$_REQUEST["mensagem"]."<BR> Ed Response: ".$resp["responseData"]["translatedText"]);
——————————————————————————-
É triste isso pessoal, mas API da Google não detecta a linguagem de origem se for a mesma de destino. Vejam só:
http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair= | pt-br&q=Ol%C3%A1%20Ed!</a> |
Tenho como resultado:
{“responseData”: null, “responseDetails”: “could not reliably detect source language”, “responseStatus”: 400}
Logo Ed falará todas as línguas MENOS português. Fail Eterno?
——————————————————————————-
Resolvido o problema com o bug da Google:
function translate($msg, $from="", $to="pt-br") { $tUrl = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=\".urlencode\(\$msg).\"&langpair=\".\$from.\"|\".\$to; $curl = curl_init($tUrl); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_COOKIEFILE, "cookiefile"); curl_setopt($curl, CURLOPT_COOKIEJAR, "cookiefile"); # SAME cookiefile $output = curl_exec($curl); curl_close($curl); $rt = json_decode($output, TRUE); return $rt; } header("Content-Type: text/plain; charset=UTF-8"); $mensagem = translate($_REQUEST["mensagem"]); $from = $mensagem["responseData"]["detectedSourceLanguage"]; if($mensagem["responseStatus"] == 400) $mensagem = $_REQUEST["mensagem"]; else $mensagem = utf8_encode($mensagem["responseData"]["translatedText"]); $x = strip_tags(file_get_contents("http://www.ed.conpet.gov.br/mod_perl/bot_gateway.cgi?server=0.0.0.0:8085&charset=utf-8&pure=1&js=0&msg=".$mensagem)); if($mensagem == $_REQUEST["mensagem"]) echo $x; else{ $resp = translate($x,"",$from); echo($resp["responseData"]["translatedText"]); }
——————————————————————————-
——————————————————————————-
É isso ae! Agora o Ed Poliglóta pode ser acessado por todos!
Aqui está: http://www.energylabs.com.br/edpol/
É claro que tem muitos erros, mas isso a gente releva, olha só o que fizemos em tão pouco tempo!
Divirtam-se!
——————————————————————————-
Sim estou com uma grande preguiça de fazer o AutoScroll Down… Quem sabe um outro dia? Se alguém quiser colaborar ai! UOIASHEOIAUHe o código fonte inteiro está aqui 😀
index.php (HTML puro)
Em breve novos hacks!