1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Login Automático com Java na OLX! Alguém sabe onde estou errando?

Caros amigos(as), Estou estudando HTTP Components da Apache para fazer login em sites de forma automática. No código em questão estou tentando logar automaticamente na OLX, mas não está efetivando o login.

Alguém poderia me dizer onde estou errando?

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;

import org.apache.http.Consts;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

@SuppressWarnings("deprecation")
public class LogarOLX {

    private final DefaultHttpClient client = new DefaultHttpClient();

    /**
     * Efetua login no site
     * @param url - URL de Login do site
     * @param email - usuario
     * @param password - senha
     * @return true - login ok | false - login fail
     * @throws UnsupportedEncodingException
     * @throws IOException 
     */
    public boolean login(final String url, final String email, final String password) throws UnsupportedEncodingException, IOException {

        /* Método POST */
        final HttpPost post = new HttpPost(url);
        boolean result = false;

        /* Configura os parâmetros do POST */
        final ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("return_to", ""));
        nameValuePairs.add(new BasicNameValuePair("usuario", email));
        nameValuePairs.add(new BasicNameValuePair("senha", password));
        nameValuePairs.add(new BasicNameValuePair("entrar", "Entrar"));

        /* 
         * Codifica os parametros.
         * Antes do encoder: fulano@email.com
         * Depois do enconder: fulano%40email.com
         */        
        post.setEntity(new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8));        

        /* Define navegador */
        post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0");

        /* Efetua o POST */
        HttpResponse response = client.execute(post);

        /* Resposta HTTP: Sempre imprimirá “HTTP/1.1 302 Object moved” (no caso da devmedia) */
        System.out.println("Login form get: " + response.getStatusLine());

        /* 
         * Consome o conteúdo retornado pelo servidor
         * Necessário esvaziar o response antes de usar o httpClient novamente
         */
        EntityUtils.consume(response.getEntity());

        /* 
         * Testar se o login funcionou.
         * 
         * Estratégia: acessar uma página que só está disponível quando se está logado
         * Em caso de erro, o servidor irá redirecionar para a página de login
         * A pagina de login contem uma string: "Login DevMedia"
         * Se esta String estiver presente, significa que o login não foi efetuado com sucesso
         * 
         */
        final HttpGet get = new HttpGet("https://www3.olx.com.br/account/form_userinfo/");
        response = client.execute(get);        

        /*
         * Verifica se a String: "login ou crie uma conta" está presente
         */
        if (checkSuccess(response)) {
            System.out.println("Conexao Estabelecida!");
            result = true;
        } else {
            System.out.println("Login não-efetuado!");
        }

        return result;
    }

    /**
     * Abre página
     * @param url - Página a acessar
     * @throws IOException 
     */
    public void openPage(final String url) throws IOException {
        final HttpGet get = new HttpGet(url);
        final HttpResponse response = client.execute(get);
        saveHTLM(response);
    }

    /**
     * Encerra conexão
     */
    public void close() {
        client.getConnectionManager().shutdown();
    }

    /**
     * Busca por String que indica se o usuário está logado ou não
     * @param response
     * @return true - Não achou String | false - Achou String
     * @throws IOException 
     */
    private boolean checkSuccess(final HttpResponse response) throws IOException {
        final BufferedReader rd = new BufferedReader(new InputStreamReader(
                response.getEntity().getContent()));
        String line;
        boolean found = false;
        /* Deixa correr todo o laco, mesmo achando a String, para consumir o content */
        while ((line = rd.readLine()) != null) {
            if(line.contains("login ou crie uma conta")) {
                found = true;
            }
        }
        return !found;
    }

    /**
     * Salva a página
     * @param response
     * @throws IOException 
     */
    private void saveHTLM(final HttpResponse response) throws IOException {
        final BufferedReader conteudo = new BufferedReader(new InputStreamReader(
                response.getEntity().getContent()));
        String line;
        File arquivoOLX = new File("S:\\arquivoOLX.html");
        PrintWriter writer = new PrintWriter(arquivoOLX);        
        while ((line = conteudo.readLine()) != null) {
            //            System.out.println(line);
            writer.println(line);            
        }        
        writer.flush();
        writer.close();
    }

    /**
     * Roda aplicação
     * @param args 
     */
    public static void main(String[] args) {

        LogarOLX navegador = new LogarOLX();

        try {
            // Tenta efetuar login
            boolean ok = navegador.login("https://www3.olx.com.br/account/do_login", 
                                         "EMAIL DO USUÁRIO", "SENHA DO USUÁRIO");
            if (ok) {
                // Acessa página restrita
                navegador.openPage("https://www3.olx.com.br/account/form_userinfo/");
            }
            navegador.close();
        } catch (UnsupportedEncodingException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
  • Já verificou se a OLX não possui as informações de login no Header? Outra, verifique se eles possuem uma API para isso, dessa forma que você está fazendo parece complicada, pois se eles mudarem as strings do site você terá que mudar o programa toda vez. Bom de qualquer forma vou te dar uma dica, sempre dê um get na tela de login e passe os dados do usuário nela, não precisa verificar se está logado ou não, só tente logar e pronto, se der erro no login você trata, claro, isso se sua aplicação não for web. Se você puder liberar esse projeto com os arquivos dele eu posso tentar debugar em casa.

    rof20004   25 de dez de 2016
  • É somente esta classe teste que fiz... Acredito que o site possa ter algum tipo de tratamento e validação de login. A OLX não tem interesse em disponibilizar API para login automático uma vez que não querem que maquina utilize seu sistema. A função de verificação de login pela string é só uma função temporária, apenas para eu testar o login, eu poderia ter feito de outras formas, mas fiz assim para melhor visualização do status. Mas assim que estiver logando esta função de verificação deixará de existir. Se puder, vê para mim o que pode ser por favor?

    Santiago Ferraz   26 de dez de 2016
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags login http java ou faça a sua própria pergunta.