Avatar billede daniboy Nybegynder
24. marts 2003 - 11:24 Der er 10 kommentarer og
1 løsning

Problem med at hente HTML source... igen igen :D

Hejsa... :)

Herunder er der en masse kode... det er mit forsøg på at logge ind på en side (http://www.hattrick.org/) følgende burde efter min mening poste til siden og få en login session cookie eller lignende tilbage i hovedet igen... men det sker bare ikke... håber der er nogen der kender lidt til det library jeg benytter:
http://jakarta.apache.org/commons/httpclient/

jeg ved ikke om det er min benyttelse af libraryts post classses og methods der er forkert... for de oplysninger er de samme som den form på login siden angiver.... håber der er nogen der kan hjælpe mig... :-/

// Daniboy

(Følgende kode i main burde udskrive en forkert login da det user/pass ikke er korrekt men den gør ingenting overhovedet :-/...)

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.HeadMethod;

import java.io.IOException;

public class GetPage {
   
    private static String url = /*"http://ip.ter.dk/";*/ "http://www.hattrick.org/common/default.asp";
    private static String startMenuUrl = "http://www.hattrick.org/Common/menu.asp";
    private static String loginUrl = /*"http://ip.ter.dk/";*/ "http://195.149.159.155/Common/default.asp";
    private static String checkLogin = "menu.asp?timeOut=&loginError=&showMenu=login";
    private static Cookie cookies[];
    private static boolean haveCookie = false;
    private static HttpClient client = new HttpClient();
   
    public static void login (String username, String password) {
   
        System.out.println("Udskrevet i starten af login()");
        HttpState initialState = new HttpState();

        initialState.setCookiePolicy(CookiePolicy.COMPATIBILITY);       

        System.out.println("Lige før if sætningen: if(!haveCookie)");
        if(!haveCookie) {

            String headerValueAccept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*";       
           
            GetMethod get = new GetMethod(url);

            System.out.println("Dette er Hvis vi ingen Session Cookie havde");
       
            get.setFollowRedirects(true);
            get.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
            get.setRequestHeader("Accept", headerValueAccept);
            get.setRequestHeader("Accept-Encoding", "gzip, deflate");
            get.setRequestHeader("Accept-Language", "da");
            get.setRequestHeader("Connection", "Keep-Alive");
       
            Header[] getRequestHeaders = get.getRequestHeaders();
       
            System.out.println("Request headers i første sidehentning:");
            for(int i = 0; i < getRequestHeaders.length; i++) {
                System.out.println(i + ": " + getRequestHeaders[i].toExternalForm());
            }
       
            client.setConnectionTimeout(5000);
            client.setState(initialState);
       
            try {
                client.executeMethod(get);
            } catch (IOException e) {
                System.out.println("Der skete en fejl i hentningen af default.asp: " + e.toString());
                System.out.println();
                e.printStackTrace();
            }
       
            Header[] getHeader = get.getResponseHeaders();
       
            System.out.println("Response headers i første sidehentning:");
            for(int i = 0; i < getHeader.length; i++) {
                System.out.println(i + ": " + getHeader[i].toExternalForm());
            }
       
            cookies = client.getState().getCookies();
       
            System.out.println("Cookies: ");
            for (int i = 0; i < cookies.length; i++) {
                System.out.println(" - " + cookies[i].toExternalForm());
            }
       
            System.out.println();
            System.out.println("Indholdet af Siden: ");
            System.out.println(get.getResponseBodyAsString());
   
            get.releaseConnection();
       
            if (cookies.length>0) {
                haveCookie = true;
            } else {
                System.out.println("Fik ingen Cookie");
                haveCookie = false;
            }
       
        }
   
        PostMethod post = new PostMethod(loginUrl);
        if(haveCookie) {
   
            NameValuePair[] submitBody = {
                new NameValuePair("loginname", username),
                new NameValuePair("password", password)
            };
   
            post.setRequestBody(submitBody);
            post.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
            post.setFollowRedirects(true);
            client.setConnectionTimeout(30000);
            client.setState(initialState);

            Header[] postMethodHeader = post.getRequestHeaders();
       
            System.out.println("Post headers vi sender:");
            for(int i = 0; i < postMethodHeader.length; i++) {
                System.out.println(i + ": " + postMethodHeader[i].toExternalForm());
            }
       
            try {
                client.executeMethod(post);
            } catch(IOException e) {
                e.printStackTrace();
            }
       
            Header[] loginInputHeader = post.getResponseHeaders();
       
            System.out.println("LoginHeaders fra Post query: ");
            for(int i = 0; i < loginInputHeader.length; i++) {
                System.out.println(i + ": " + loginInputHeader[i].toExternalForm());
            }
   
            cookies = client.getState().getCookies();
   
            for (int i = 0; i < cookies.length; i++) {
                System.out.println(" - " + cookies[i].toExternalForm());
            }
   
            System.out.println("Indholdet af siden: ");
            System.out.println(post.getResponseBodyAsString());
   
            post.releaseConnection();
           
            if(cookies.length>1) {
                haveCookie = true;
            } else {
                System.out.println("Havde ikke mere end 1 Cookie");
                haveCookie = false;
            }
       
        }
       
        PostMethod postMethod = new PostMethod(loginUrl);       
        if(haveCookie) {
   
            NameValuePair[] submitBody = {
                new NameValuePair("loginname", username),
                new NameValuePair("password", password)
            };
   
            postMethod.setRequestBody(submitBody);
            postMethod.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
            postMethod.setFollowRedirects(true);
            client.setConnectionTimeout(30000);
            client.setState(initialState);

            Header[] postHeader = postMethod.getRequestHeaders();
       
            System.out.println("Post headers vi sender:");
            for(int i = 0; i < postHeader.length; i++) {
                System.out.println(i + ": " + postHeader[i].toExternalForm());
            }
       
            try {
                client.executeMethod(postMethod);
            } catch(IOException e) {
                e.printStackTrace();
            }
       
            Header[] loginInputHeader = postMethod.getResponseHeaders();
       
            System.out.println("LoginHeaders fra første login: ");
            for(int i = 0; i < loginInputHeader.length; i++) {
                System.out.println(i + ": " + loginInputHeader[i].toExternalForm());
            }
   
            cookies = client.getState().getCookies();
   
            for (int i = 0; i < cookies.length; i++) {
                System.out.println(" - " + cookies[i].toExternalForm());
            }
   
            System.out.println(postMethod.getResponseBodyAsString());
   
            postMethod.releaseConnection();
           
            if(cookies.length>1) {
                haveCookie = true;
            } else {
                System.out.println("Havde ikke mere end 1 Cookie");
                haveCookie = false;
            }
       
        }
       
     
    }
   
    public static void get(String url) {
       
        if(cookies.length>1) {

        System.out.println("Udskrevet i starten af get(String url)");
        HttpState initialState = new HttpState();

        initialState.setCookiePolicy(CookiePolicy.COMPATIBILITY);       

        System.out.println("Lige før if sætningen: if(haveCookie)");
        if(haveCookie) {

            String headerValueAccept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*";       
           
            GetMethod get = new GetMethod(url);

            System.out.println("Dette er hvis vi havde en cookie");
       
            get.setFollowRedirects(true);
            get.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
            get.setRequestHeader("Accept", headerValueAccept);
            get.setRequestHeader("Accept-Encoding", "gzip, deflate");
            get.setRequestHeader("Accept-Language", "da");
            get.setRequestHeader("Connection", "Keep-Alive");
       
            Header[] getRequestHeaders = get.getRequestHeaders();
       
            System.out.println("Request headers i method get() sidehentning: ");
            for(int i = 0; i < getRequestHeaders.length; i++) {
                System.out.println(i + ": " + getRequestHeaders[i].toExternalForm());
            }
       
            client.setConnectionTimeout(5000);
            client.setState(initialState);
       
            try {
                client.executeMethod(get);
            } catch (IOException e) {
                System.out.println("Der skete en fejl i hentningen af default.asp: " + e.toString());
                System.out.println();
                e.printStackTrace();
            }
       
            Header[] getHeader = get.getResponseHeaders();
       
            System.out.println("Response headers i method get() sidehentning:");
            for(int i = 0; i < getHeader.length; i++) {
                System.out.println(i + ": " + getHeader[i].toExternalForm());
            }
       
            cookies = client.getState().getCookies();
       
            System.out.println("Cookies: ");
            for (int i = 0; i < cookies.length; i++) {
                System.out.println(" - " + cookies[i].toExternalForm());
            }
       
            System.out.println();
            System.out.println("Indholdet af Siden: ");
            System.out.println(get.getResponseBodyAsString());
   
            get.releaseConnection();
       
            if (cookies.length>0) {
                haveCookie = true;
            } else {
                System.out.println("Fik ingen Cookie");
                haveCookie = false;
            }
       
       
        }


        }
    }

    public static void main(String[] args) throws Exception {
        GetPage get = new GetPage();
        get.login("m00m000", "m0000000000000000");
        get.get("http://195.149.159.155/Common/menu.asp?timeOut=&loginError=&showMenu=login");
 
    }
   
}
Avatar billede arne_v Ekspert
24. marts 2003 - 18:44 #1
2 minutters læsen af din kode og læsen HttpClient Java Doc
rejser spørgsmålet:
  skal du ikke kalde addCookies for dit HttpState objekt ?
Avatar billede daniboy Nybegynder
24. marts 2003 - 19:57 #2
Jeg har forsøgt at køre min kode på http://ip.ter.dk/ hvilket viser at den Cookie jeg gemmer i koden i Cookie classen bliver sendt med...
Men det kan da godt værre det har noget at gøre med HttpState objectet..

Må jeg lige kigge på...
Avatar billede arne_v Ekspert
24. marts 2003 - 20:00 #3
Hvis ikke det virker så vil jeg prøve selv at køre det.
Avatar billede arne_v Ekspert
27. marts 2003 - 20:10 #4
Fik du det til at virke ?
Avatar billede daniboy Nybegynder
30. marts 2003 - 04:26 #5
Undskyld jeg ikke har vendt tilbage til spørgsmålet men min højskolens Win NT server fik lige lyst til at gå neden om og hele vejen hjem...= ingen internet og en relativ uviden administrator...

^^^ Nej Jeg får det sammen resultat som uden at sætte HttpState.addCookies(); metotoden...

Du er mere end velkomme til at prøve selv :-)... er efter hånden blev klar over at det jeg har kastet mig ud i enten er så logisk jeg ikke kan se det eller er en smule sværre end jeg regnede med... :)

// Daniboy
Avatar billede arne_v Ekspert
30. marts 2003 - 13:47 #6
Nu har jeg ikke konto på www.hattrick.org, men følgende virker op mod en
af mine egne web applikationer:

import java.io.IOException;

import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;

public class Login {
    private HttpClient client;
   
    public Login() {
        client = new HttpClient();
    } 
   
    public void login(String url,
                      String userField, String userValue,
                      String passField, String passValue) {
        NameValuePair[] nvp = new NameValuePair[2];
        nvp[0] = new NameValuePair(userField, userValue);
        nvp[1] = new NameValuePair(passField, passValue);
        post(url, nvp);
    }

    public String get(String url) {
        GetMethod met = new GetMethod(url);
        try {
            client.executeMethod(met);
        } catch (HttpException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return met.getResponseBodyAsString();
    }

    public String post(String url, NameValuePair[] nvp) {
        PostMethod met = new PostMethod(url);
        if(nvp != null) {
            met.setRequestBody(nvp);
        }
        try {
            client.executeMethod(met);
        } catch (HttpException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return met.getResponseBodyAsString();
    }

    public static void main(String[] args) {
        Login lgi = new Login();
        lgi.login("http://arne:8080/useradmin/Login",
                  "username", args[0],
                  "password", args[1]);
        System.out.println(lgi.get("http://arne:8080/useradmin/UserAdmin.jsp"));
    }
}

rimelig simpel kode. Kan du prøv dem op mod www.hattrick.org ?
Avatar billede daniboy Nybegynder
30. marts 2003 - 17:47 #7
Det virker ikke... heller ikke hvis jeg laver nogle små justeringer...

Når man kigger i html source fra explore er den anderledes og den menu url der er i kilden er anderledes efter et login... og det login retunere i framen et forskelligt link til menu.asp alt efter om login f.eks er succesfuldt... jeg får intet sådan respons i frame kilden

Prøv at gå til www.hattrick.org og login med et eller andet ikke eksisterende user/pass så vil du i HTML source kunne se at det er forskellige... jeg kan se når jeg laver et korrekt login fra siden kommer følgende URL til menu.asp i frame:
menu.asp?timeOut=&loginError=&showMenu=login
Hvis jeg laver et forkert login:
menu.asp?timeOut=&loginError=Yes&showMenu=about

Intet af ovenstående bliver refereret til i den html source som jeg henter igennem den kode du har lavet eller min egen hvilket burde ske?

Med din kode får jeg som med min egen:
menu.asp?timeOut=&loginError=&showMenu=about

Det virker som om jeg slet ikke poste til siden men blot kalder siden og får deres login site tilbage i ansigtet...
jeg har ændret til følgende:

    public static void main(String[] args) {
        Login lgi = new Login();
        System.out.println(lgi.get("http://www.hattrick.org/common/default.asp"));
        System.out.println(lgi.login("http://195.149.159.155/Common/default.asp",
                  "loginname", "dfsdjflksdfsdfsdfsdf",
                  "password", "dfsdfsfsdfsdfsgasfhg"));
        System.out.println(lgi.get("http://195.149.159.155/Common/menu.asp"));
    }

Og lavet return statement i login method

// Daniboy
Avatar billede daniboy Nybegynder
31. marts 2003 - 11:22 #8
(Giver gerne flere points)
Avatar billede daniboy Nybegynder
02. april 2003 - 23:06 #9
k jeg har selv løst problemet med en packet sniffer... der var ikke noget galt med min kode, men med den post body jeg sendte med... har nu rettet min post body efter hvad IExplore sender som body... hvilket er følgende:
loginname=xXx&password=xXx&action=login&submit.x=32&submit.y=5

Hvad jeg så ikke helt forstår er hvad denne linie betyder:
&action=login&submit.x=32&submit.y=5
specielt disse submit.x og y... og hvor får explore evt. disse informationer fra?

Men det vigtigste er at det funker :)

// Daniboy
Avatar billede arne_v Ekspert
02. april 2003 - 23:08 #10
Det lyder som koordinater for klik.
Avatar billede daniboy Nybegynder
02. april 2003 - 23:39 #11
right alle points til dig :)

Nu er det værste forhåbenligt overstået :)

// Daniboy
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester