Estou querendo criar um robô HTTP em Java, para aprendizado, apenas. Bem, a única coisa que este robô deve fazer é solicitar o usuário e a senha do usuário aqui do GUJ, e após isso retornar sua classificação (What the classpath?, Virtual Machine Man, GUJ Ranger, e etc). Bem, sei que posso fazer isso através de sockets, no entanto, não domino-o por completo. Tudo que sei fazer com sockets em Java é trocar mensagens entre cliente e servidor. Enfim, alguém poderia me apontar o caminho das pedras, através de sockets? Ou, se houver, sugerir uma API para facilitar meu trabalho?
Muito boa a sua iniciativa de aprendizado, soh tenho uma dúvida:
quem vai passar a senha aqui do guj pra vc?
nao entendi muito bem?
vai manipular a senha do usario aqui do guj?
acho estranho hem…
mas eu pq acho que nao entendi a sua idea…
R
rjbcordeiro
a ideia é o seguinte:
basicamente vc vai utilizar a Runtime para poder executar os programas tipo: mandar abrir o browser.
depois vc vai utilizar a classe robot , mas antes vc precisa ler a pagina para poder colocar os comandos nos lugares certos.
bom, basicamente isto.
fica a dica…
A
Andre_Rosa
ivansalvadori:
Muito boa a sua iniciativa de aprendizado, soh tenho uma dúvida:
quem vai passar a senha aqui do guj pra vc?
nao entendi muito bem?
vai manipular a senha do usario aqui do guj?
acho estranho hem…
mas eu pq acho que nao entendi a sua idea…
Não é para me passar a senha. Talvez nem precise. A senha seria só para poder chegar ao perfil do usuário em questão, mas talvez só seja necessário informar a id do perfil. Eu encontrei um exemplo de robô HTTP, só que em C.
Um abraço,
Aguardo mais respostas.
A
Andre_Rosa
rjbcordeiro:
a ideia é o seguinte:
basicamente vc vai utilizar a Runtime para poder executar os programas tipo: mandar abrir o browser.
depois vc vai utilizar a classe robot , mas antes vc precisa ler a pagina para poder colocar os comandos nos lugares certos.
bom, basicamente isto.
fica a dica…
Legal, mas teria de ser algo independente de browser. Como neste exemplo:
Esse exemplo mostra como executar o post em uma página e pega o retorno após o post.
Att.
Muito obrigado, molmedo. Com toda certeza será de extrema utilidade.
sim com isto vc pode pegar a página, mas como vai executar um evento?
tipo o robot(no caso do awt) ele cria eventos como se fosse um usuario de verdade, mas com sockets como vc vai dar um evento de click em um botão?(por exemplo)
Esse exemplo mostra como executar o post em uma página e pega o retorno após o post.
Att.
Muito obrigado, molmedo. Com toda certeza será de extrema utilidade.
sim com isto vc pode pegar a página, mas como vai executar um evento?
tipo o robot(no caso do awt) ele cria eventos como se fosse um usuario de verdade, mas com sockets como vc vai dar um evento de click em um botão?(por exemplo)
rjbcordeiro,
Como mencionei, para o caso específico do André, onde ele sabe que são dois campos preenchidos e quer analisar algum retorno, a partir do socket você consegue simular o POST do formulário, que é a ação de clicar no botão (por exemplo).
A
Andre_Rosa
Na verdade não precisarei de usuário e senha de ninguém, precisarei apenas do id do perfil. Bem, estou fazendo da seguinte forma: o usuário entra com a id, eu formulo uma string com, o endereço completo, eu baixo o código fonte HTML da página, e vejo como posso chegar até a classificação. Basicamente é isso, não será tão difícil como imaginei.
a classificação fica dentro de uma classe especifica, e essa classe (postdetails) só está presente neste trecho.
A
Andre_Rosa
Pessoal,
para onde posso jogar o código fonte da página? Pra um arquivo de texto?
R
rjbcordeiro
tu pode jogar para uma variavel String e usar expressão regular para pegar o conteudo apos o “Classificação:”
ou então tu pode utilizar o jtidy , ai tu pega do inputstream, já fiz algo parecido
com o jtidy tu trabalha com o xml do html, pode ser melhor
A
Andre_Rosa
rjbcordeiro:
tu pode jogar para uma variavel String e usar expressão regular para pegar o conteudo apos o “Classificação:”
ou então tu pode utilizar o jtidy , ai tu pega do inputstream, já fiz algo parecido
com o jtidy tu trabalha com o xml do html, pode ser melhor
Acho que a expressão regular seria a melhor forma. No entanto, há um problema. O código fonte é pego em loop, percorrendo linha por linha. Como eu poderia tentar casar a linha com a expressão regular? O loop está assim:
while ((LinhaCod = in.readLine()) != null){
/* imprimir o conteúdo da string LinhaCod */
}
Obrigado.
A
Andre_Rosa
Ótimo! Estou salvando tudo em arquivo. Localizei a classificação:
Obrigado, Matheus. Vou procurar me informar à respeito de suas sugestões.
R
rjbcordeiro
cara fiz o que tu precisa, mas lembrando que é para fins educacionais:
qualquer dúvida tu posta ai.
Lembrando que fiz o código rapido(hoje ehehe) e se parecer inlegível… sabe como é né… é para estudos…
qualquer dúvida ou melhora ou qualquer coisa que seja produtiva (ehehe) é bem vindo ai viu. bye
R
rjbcordeiro
fiz a conexão com o http do java e não por sockets, mas é só trocar pequenas coisas que vai funcionar com sockets
A
Andre_Rosa
rjbcordeiro,
Eu gostaria de terminar da forma como comecei, pois a intenção é o aprendizado mesmo. Instalei a JTidy, e adicionei-a ao meu projeto. O que fiz até agora foi:
/******************************************************** * Robô HTTP Java - Versão 1.0 * Autor: André Rosa * Criação: 29 de Julho de 2011, às 21:36 * Código aberto para estudo. Favor, preservar * os créditos do autor. *********************************************************/packageguj;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.URL;importjava.net.URLConnection;importjava.util.Scanner;importjava.io.File;importjava.io.FileWriter;importorg.w3c.dom.Document;importorg.w3c.dom.Node;importorg.w3c.dom.NodeList;importorg.w3c.tidy.Tidy;publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{/* Criação do objeto escreve, do tipo Filewriter */FileWriterescreve=newFileWriter(newFile("tmp.txt"),true);/* Criação de um objeto do tipo Scanner */Scanneren=newScanner(System.in);System.out.print("Entre com o id: ");Stringendereco=en.nextLine();endereco="http://www.guj.com.br/user/profile/"+endereco+".java";try{/* Criação de um objeto do tipo URL */URLsite=newURL(endereco);URLConnectionobj=site.openConnection();/* Criação do objeto de entrada de buffer */BufferedReaderin=newBufferedReader(newInputStreamReader(obj.getInputStream()));StringLinhaCod;while((LinhaCod=in.readLine())!=null){escreve.write(LinhaCod);}/* Fecha o objeto */in.close();/* Fecha o objeto de escrita */escreve.close();}catch(Exceptione){System.out.println(e);System.exit(1);}}}
Pois bem, eu poderia jogar todo conteúdo deste txt em um ArrayList, e depois chamar este método getElementsByTagName()? Será que funcionaria?
Obrigado!
M
matheuslmota
Uma dica. Já que você não vai precisar do arquivo poteriormente, pois ele é só para armazenamento temporário de informações, você pode usar um buffer de bytes no lugar do arquivo.
publicstaticvoidteste(){byte[]buffer=newbyte[2*1024*1024];// Cria um buffer de bytes de// 2MbByteArrayInputStreamarrayInputStream;Scanneren=newScanner(System.in);System.out.print("Entre com o id: ");Stringendereco=en.nextLine();endereco="http://www.guj.com.br/user/profile/"+endereco+".java";try{/* Criacao do objeto url */URLsite=newURL(endereco);URLConnectionobj=site.openConnection();/* Criacao do buffer de bytes*/InputStreamin=obj.getInputStream();in.read(buffer,0,buffer.length);//arrayInputStream=newByteArrayInputStream(buffer);//Pode-se agora usa o bufferedReader para ler os dados do buffer de bytesBufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(arrayInputStream));bufferedReader.close();in.close();/* Fecha o objeto de escrita */}catch(Exceptione){System.out.println(e);System.exit(1);}}
Isso evita a dor de cabeça de ter que deletar o arquivo, que é algo que nem sempre dá certo no windows.
A
Andre_Rosa
Mais uma vez, obrigado, Matheus. Eu estava pensando ontem como eu poderia apagar este arquivo, já que eu só tinha o objeto de escrita dele.
M
matheuslmota
E às vezes você nem consegue apagar o arquivo. Se por acaso o arquivo estiver aberto em outro programa ou por algum motivo, algum processo do Windows que usava o arquivo não foi corretamente encerrado, você não vai coneguir apagar o arquivo.