Como acessar um site e preencher seus formulários com java?

Olá pessoal

pensei em fazer um programa em java como projeto final pra disciplina de segurança de informação que estou cursando que faria o seguinte:

1 - Acessar um site específico que contém 2 campos: usuário e senha.
2 - Testar logins e senhas já pré-definidos
3 - Obter o retorno se o login deu certo ou não

Porém não consegui pensar numa forma dele fazer isso

alguma sugestão?

Veja se isso te ajuda http://www.guj.com.br/java/227418-analise-de-tela-login-resolvido

Eu entendi outra coisa na dúvida do nosso colega: fazer um programa que faz o papel do usuário, enviando o login e senha para uma página. Já precisei disso uma vez, mas fiz em .Net

Se o servidor só aceitar método POST fica mais difícil, pois terá de montar uma requisição específica. Se aceitar GET é só chamar a URL.

Digamos que se queira fazer login em www.guj.com.br via software, por exemplo:

1º encontre o formulário de login do site:

<form class="login" action="/jforum.java?module=user&action=validateLogin" method="POST"> <input type="hidden" name="returnPath" id="returnPath"/> Usu&aacute;rio: <input class="campo rounded" size="8" name="username" tabindex="3" /> Senha: <input class="campo rounded" type="password" size="8" name="password" tabindex="4"/> <input type="image" class="botao" src="/images/guj/botao_entrar.gif" tabindex="5" name="login" value="Login"> </form>
2º repare que há uma URL em action,

<form class="login" action="/jforum.java?module=user&action=validateLogin" method="POST">

já temos o começo da nossa URL: http://www.guj.com.br/jforum.java?module=user&action=validateLogin

3º pegamos os nomes dos campos name=“username” e name=“password” e completamos a URL com os valores assim:
http://www.guj.com.br/jforum.java?module=user&action=validateLogin&username=seu_usuario&password=sua_senha

Isso é fácil de se fazer quando o servidor aceita método GET, pois agora é só pegar o html retornado pela URL chamada e ler se o login está ok ou não.
Exemplo simples aqui: http://download.oracle.com/javase/tutorial/networking/urls/readingURL.html

Isso mesmo dyeison!
Seu post ajudou bem.

Agora tô com outro problema
justamente o site que quero acessar retorna “WXIS|fatal error|unavoidable|dbxopen: phl_pwd.cnt (2)|” quando tento pegar o conteúdo de sua página.
em outros site dá certo…

alguém sabe o que? é alguma proteção?

Está com cara de erro no banco. Pode ser que algum parâmetro esteja sendo passado incorretamente ou esteja faltando.

Já testou direto no navegador?

pelo browser tem hora que dá certo e tem hora que dá esse mesmo erro
estranho

Estou com um problema parecido , e não querendo abrir outro assunto resolvi colocar o problema por aqui,
Preciso que meu codigo faça o papel do usuario, acessando uma pagina e preenchendo os campos de login, permanecendo logado e acessar o conteudo, por exemplo acessar a pagina do Google, contas de usuarios e poder entrar no YouTube.
Porem nao consigo preencher o Login, metodo POST.
Tentei de varias formas seguindo exemplos, se alguem puder da uma força. Tentei como o dyeison passou porem nao consegui.


import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class login {
   
    public void login(){
        System.out.println("Fazendo a conexão...");
    }
   
    public void connect (String webp, String user, String pass) throws Exception{

    URL url = new URL(webp);
    String POST_CONTENT_TYPE = "application/x-www-form-urlencoded";

// Fazendo a conexao aqui.

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setDoInput(true);
    conn.setDoOutput(true);
    conn.setUseCaches(false);
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Connection", "Keep-Alive");
    conn.setRequestProperty("Authorization", "Basic" );
    conn.setRequestProperty("Content-Type", POST_CONTENT_TYPE);
    conn.setRequestProperty("Content-Type", "text/html; charset=iso-8859-1");
    conn.setInstanceFollowRedirects(true);
    HttpURLConnection.setFollowRedirects(true);




DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

StringBuilder content = new StringBuilder(1024);
      content.append("Email").append(URLEncoder.encode(user, "UTF-8"));
      content.append("Passwd").append(URLEncoder.encode(pass, "UTF-8"));

dos.writeBytes(content.toString());
System.out.println(conn.getPermission());
System.out.println(conn.getResponseMessage());
System.out.println(conn.getRequestMethod());
System.out.println(conn.getResponseCode());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String responeLine;


StringBuilder response = new StringBuilder();

while ((responeLine = bufferedReader.readLine()) != null)
{
response.append(responeLine + "\n");
}

System.out.println (response.toString());

dos.flush();
dos.close();
    }
    
    public static void main(String args[]) throws Exception{
        login log = new login();
        log.connect("https://accounts.google.com/ServiceLogin?hl=pt-BR&continue=http://www.google.com.br/", "usuario aqui", "senha aqui");
    }

}

Olá Pessoal, estou com o mesmo problema!
Tenho que fazer um programa que faça o login do usuário no Mercado Livre e que busque o codigo dos produtos que meu cliente vendeu pra depois jogar no rastramento dos correios e dizer para os clientes dele se o produto ja está em transito!
Consegui sair do 0 e parei no 1! haha. Estou tentando seguir as dicas do dyeison, mas o Mercado Livre é POST!
to tentando fazer algo parecido com nosso amigo type-type, mas não esta dando certo
Tendei usar Vraptor, Rhino, ta complexo de achar uma solução!

Alguem pode ajudar?

Edgard,

Supondo que o ML e os Correios não possuam uma API, a única forma seria fazendo as requisições “manualmente”.

Eu imagino um fluxo mais ou menos assim: você envia um POST fazendo o login do cliente, pega o retorno da página pra verificar se o login teve sucesso. Faz um request (GET) para acessar a página dos produtos dele e pega o retorno usando o DOM. Aí acessa o correio e verifica a situação da encomenda.

Dá uma olhada na biblioteca Apache Commons, com ela pra fazer algo mais ou menos assim:

[code]HttpPost httpost = new HttpPost(“url.da.pagina.que.vc.precisa.enviar.dados”);

List nvps = new ArrayList();

nvps.add(new BasicNameValuePair(“campo1”, valor1));
nvps.add(new BasicNameValuePair(“campo1”, valor1));

httpost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));

HttpResponse response = client.execute(httpost);
[/code]Até aqui foi feito um request http com método POST. Esse client é um DefaultHttpClient(). Você deve usar o mesmo para fazer todas as requisições, pois é ele que mantém os Cookies entre as requisições. A menos que você queira tratar os Cookies manualmente, mas aí já é masoquismo. Agora é só ler os dados do response. O interessante é pegar esse retorno e mandar pra uma outra biblioteca que trata o HTML, a Jsoup. Com ela você terá acesso aos objetos HTML igual teria no JavaScript, usando DOM:

[code]Document document = Jsoup.parse(response.getEntity().getContent(), “UTF-8”, “url.base”);

Element e = document.getElementById(“message”);[/code]Esse UTF-8 aí pode ser null, geralmente vem informado no HTML e o parse pega de lá. A url.base é pra completar links relativos, caso o Jsoup os encontre na página, já devolve o caminho completo pra você. Pra debugar essas situações assim, com requests e responses personalizados o bom é usar o WireShark. Aí você faz o processo natural, pelo navegador, com o WireShark ligado, pra descobrir todas as requisições feitas no processo. Ignora as requisições de imagens, css, js, etc. Aí faz apenas as requisições úteis e monta elas no seu código. Na hora de testar o código, olha no WireShark pra ver o que ele está realmente fazendo.

Com isso já dá pra você começar. Não é fácil, pois o normal é usar APIs para fazer essa comunicação. Se o MercadoLivre mudar os nomes dos elementos ou os campos necessários nos POSTs, o seu programa precisará ser ajustado para voltar a funcionar.

Dyeison,

Consegui fazer o código do type-type funcionar! Não sei pq o dele não está fuincinando pq só troquei algumas variaveis e o site mas o código ta identico.
Conversei com o meu professor de java sobre isso, ele disse que a melhor forma pra fazer isso era usando HttpURLConnection mesmo, não com Rhino ou Jsoup,
ele fez um digo que faz isso mesmo que eu quero no trampo dele, ele vai passar pra mim e ai posto aqui.

Tambem comentou dessa parte de mudanças e vou falar isso com o meu cliente, mas independente disso ainda quero fazer pra experiencia minha mesmo.
Acho que da pra fazer uns robozinhos legais se der certo! haha

valeu pela dica, assim que conseguir posto o codigo aqui

Oi dyeison, boa noite

minha dúvida talvez seja algo mais simples.

Eu tenho um site (escrito em HTML5) onde publico alguns banners de hotéis de uma determinada rede hoteleira, e ao direcionar o meu usuário para a página do hotel usando as tags , lá na página destino, existe um formulário de reservas, com campos para informar “Data de Chegada” (name=“chegada”), “Data de Partida” (name=“partida”) e e o campo “Código Promocional” (name=“promocode”), exatamente onde eu gostaria de auto-preencher com um código para identificar o hóspede que indiquei.

vi um exemplo num tutorial em HTML5 que tentei fazer mas ao redirecionar, mas não fez nenhuma alteração no formulário, talvez a página do hotel nem permita receber dados de outra página, eu não sei exatamente, vi que o método “action” do formulário é o GET

eis o modelo do código que tentei usar:

var formData = new FormData();
formData.append(“promocode”, “123ABC”);

var xhr = new XMLHttpRequest();
xhr.open(“POST”, “http://hotel.url/”);
xhr.send(formData);

fonte: http://www.html5rocks.com/pt/tutorials/forms/html5forms/

Tem como vc me dar um help? não sei se é permitido aqui, mas o link da minha página onde estou tentando testar é este:
http://www.outdoorvirtual.com/anuncios/bristol-convention.html

Obs.: tenho pouco conhecimento na linguagem e sintaxe do Java e Javascript.
Att. Ezequias =O)

Essa url que do post que está usando é a mesma url que a página usa no post dela? Se for (e como não funcionou) a página deve estar esperando mais alguma informação que a página anterior ao post (página inicial) iria fornecer (pode ser um cookie ou algum campo hidden).

Oi Dyeison,

…sim, exatamente a página é a mesma do post que estou usando… então é necessário conferir todos os campos e variáveis (tanto os input qto os hiddens), mas como o navegador pode estar interpretando o resultado de uma página em php, asp ou outra linguagem diferente do html, provavelmente nem todas as informações são exibidas, não é?
ou temos como capturar estas variáveis com alguma função de memória ou sessão?

bom, se em primeira mão não for possível identificar todas as variáveis e parâmetros necessários, creio que já é um caminho a seguir, vou dar uma olhada aqui nos códigos de exemplo que vc passou aos demais, talvez descubra mais alguns recursos, pelo menos ta me ajudando a compreender a lógica destas funções, farei mais alguns testes aqui… é provável que eu consiga alguma colaboração do pessoal que desenvolveu a página do hotel… mesmo assim, valeu as suas dicas!

Grato novamente! Att. Ezequias