Avatar billede vitaminen Nybegynder
02. april 2006 - 13:26 Der er 31 kommentarer

Java og informationer fra webside.

Hej eksperten brugere

Er det muligt at hente informationer fra en webside til en java applikation? Jeg forestiller mig f.eks. at hente mine bruger oplysninger her fra eksperten. Jeg skal så kunne behandle disse data i min java applikation.

Er det måske noget RSS jeg skal have fat i? Eller hvordan skal jeg gribe det an?

På forhånd tak :)
Avatar billede arne_v Ekspert
02. april 2006 - 16:08 #1
sagtens

klassen (Http)URLConnection
Avatar billede arne_v Ekspert
02. april 2006 - 16:09 #2
simpelt eksempel:

import java.net.*;
import java.io.*;

public class HttpGet {
  public static void main(String[] args) {
      try {
        URL url = new URL("http://www.eksperten.dk/");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.connect();
        if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
            InputStream is = con.getInputStream();
            OutputStream os = new FileOutputStream("e.html");
            byte[] b = new byte[1000];
            int n;
            while((n = is.read(b)) >= 0) {
              os.write(b,0,n);
            }
            os.close();
            is.close();
        }
        con.disconnect();
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
  }
}
Avatar billede arne_v Ekspert
02. april 2006 - 16:09 #3
du behøver naturligvis ikke gemme til fil men kan gøre alt muligt andet med data
Avatar billede vitaminen Nybegynder
02. april 2006 - 17:14 #4
Det jo helt perfekt... Men kan man sætte noget login ind? Skal nemlig også bruge det på et site hvor det kræver login... Kunne være super :)
Avatar billede arne_v Ekspert
02. april 2006 - 17:18 #5
ja

men så kan det godt blive lidt tricky, fordi så skal dit program maintaine
session mellem forskellige kald

jeg plejer at bruge http://jakarta.apache.org/commons/httpclient/ til det

eksempel:

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"));
  }
}
Avatar billede vitaminen Nybegynder
02. april 2006 - 17:54 #6
Har jeg forstået det korrekt hvis jeg skal hente en pakke fra Apache, der indeholder det du importerer i starten af Login klassen?

Derefter har jeg 2 klasser, hvor jeg først kører Login klassen med user og password indtastet, og derefter HttpGet klassen, der "ripper" den indtastede URL.

Eller er jeg helt galt? :P

Lækkert med de hurtige svar.
Avatar billede arne_v Ekspert
02. april 2006 - 18:13 #7
du henter den pakke fra Apache Jarkarta Commons

den har en klasse HttpClient som nemt kan bruges f.eks. via de 3 hjælpe
metoder login, get og post jeg har vist ovenfor
Avatar billede vitaminen Nybegynder
03. april 2006 - 12:35 #8
Jeg bruger Eclipse. Jeg importerer .jar filen commons-httpclient-3.0.
Så har jeg de plugins i min package, som du importerer i koden. Problemet er at den ikke kan finde klassen HttpClient. Jeg kan ikke compile da jeg får fejlmeddelsen: "HttpClient cannot be resolved to a type." Ligeledes for de plugins der importeres i koden: "The import org.apache.commons.httpclient.Cookie cannot be resolved" osv.

Hvad gør jeg galt?
Avatar billede vitaminen Nybegynder
03. april 2006 - 12:45 #9
Jeg kan bare ikke initialisere klassen HttpClient? :S
Avatar billede arne_v Ekspert
03. april 2006 - 13:05 #10
bruger du:

project
properties
build path
libraries
add external jar

?
Avatar billede vitaminen Nybegynder
03. april 2006 - 13:13 #11
Nej.. Det var løsningen :) Var ellers igang med at opdatere mit Java.

Nu får jeg kun en fejl i:
return met.getResponseBodyAsString();
og i
System.out.println(lgi.get("http://arne:8080/useradmin/UserAdmin.jsp"));
men smed en trows Exception ind på de 3 metoder. Ved ikke om det er helt i skoven?
Avatar billede vitaminen Nybegynder
03. april 2006 - 13:15 #12
kører applikationen præcis med det du har skrevet, dog tilføjet throws exception. Så får jeg fejlen:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at org.apache.commons.httpclient.HttpClient.<clinit>(HttpClient.java:65)
    at Login.<init>(Login.java:15)
    at Login.main(Login.java:52)
Avatar billede arne_v Ekspert
03. april 2006 - 13:16 #13
har du rettet URL ?
Avatar billede arne_v Ekspert
03. april 2006 - 13:18 #14
den kræver tilsyneladende http://jakarta.apache.org/commons/logging/
Avatar billede vitaminen Nybegynder
03. april 2006 - 13:24 #15
Logging er importeret som external jar.

URL har jeg ikke rørt.

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) throws Exception{
        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) throws Exception{
        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) throws Exception{
        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) throws Exception{
        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"));
  }
}

--->
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at Login.main(Login.java:53)
Avatar billede arne_v Ekspert
03. april 2006 - 13:27 #16
du skal jo rette URL'erne til så de passer til dine URL'er
Avatar billede vitaminen Nybegynder
03. april 2006 - 13:37 #17
Ahh ja det klart :) Min fejl.

Men kan det godt lade sig gøre på fx. eksperten.dk?
URL: http://www.eksperten.dk/logind.phtml

Jeg ved ikke lige hvordan jeg skal håndterer det :P

Håber vi kan klare det... Så får du velfortjente points :)
Avatar billede arne_v Ekspert
03. april 2006 - 13:59 #18
det bør kunne lade sig gøre

gå ind på siden og check hvad username og password felterne hedder
Avatar billede vitaminen Nybegynder
03. april 2006 - 14:05 #19
<form name="logind" action="/logind.phtml" method="post"><input type="hidden" name="goto" value="http://www.eksperten.dk/spm/700015"><div align="center"><table id="tablebox"><tr><td><table><tr><td>Brugernavn</td><td><input type="text" name="login_username" value="" size="20" maxlength="20" style="width:150px;" /></td></tr><tr><td>Adgangskode</td><td><input type="password" name="login_password" value="" size="20" maxlength="32" style="width:150px;" /></td></tr><tr><td>&nbsp;</td><td><br><input type="submit" value="Log ind" /></td>

User: name="login_username"
Password: name="login_password"
Avatar billede vitaminen Nybegynder
03. april 2006 - 14:32 #20
Jeg forestiller mig jeg skal lave en url hvor både user og pass er indtastet?
Eller måske skal man lave noget form.input(variable); ?

Måske har du allerede en løsning?
Avatar billede arne_v Ekspert
07. april 2006 - 04:03 #21
du skal post'e en form med login_username og login_password til /logind.phtml
Avatar billede arne_v Ekspert
21. april 2006 - 04:14 #22
OK ?
Avatar billede vitaminen Nybegynder
21. april 2006 - 13:03 #23
Jeg kan ikke finde ud af det :( Kan du hjælpe mig med at poste en form med login til html siden?
Avatar billede vitaminen Nybegynder
21. april 2006 - 13:04 #24
Det første virkede fint... Kan bare ikke finde ud af det, når sitet kræver login!
Avatar billede vitaminen Nybegynder
03. maj 2006 - 20:07 #25
Det er måske ikke noget du kan klare?
Avatar billede arne_v Ekspert
03. maj 2006 - 20:15 #26
sorry - jeg havde helt glemt dette spoergsmaal

jeg kan prove at bixe noget senere idag

ingen garantier for noget !
Avatar billede vitaminen Nybegynder
03. maj 2006 - 22:38 #27
Kunne være helt perfekt. Jeg venter med spænding :)
Avatar billede arne_v Ekspert
04. maj 2006 - 04:38 #28
det var lige ud af landevejen:

package may;

import java.io.IOException;

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) throws Exception {
        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) throws Exception {
        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) throws Exception {
        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) throws Exception {
        Login lgi = new Login();
        lgi.login("http://www.eksperten.dk/logind.phtml", "login_username", args[0], "login_password", args[1]);
        System.out.println(lgi.get("http://www.eksperten.dk/spm/700015"));
    }
}
Avatar billede vitaminen Nybegynder
04. maj 2006 - 12:24 #29
Jeg går ud fra jeg skal parameter overføre mit brugernavn og adgangskode fra mainmetoden til lgi.login?

<<Line 50>> lgi.login("http://www.eksperten.dk/logind.phtml", "vitaminen", args[0], "******", args[1]);

Men jeg får fejlen: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at Login.main(Login.java:50)

Men jeg forstår heller ikke args[0] og args[1] i den linie? Det er nok der fejlen ligger?
Avatar billede arne_v Ekspert
04. maj 2006 - 13:09 #30
nej

"login_username" og "login_password" er navnen på felterne i HTML formen

args[0] og args[1] er første og andet argument til programmet, som indeholder
dit brugernavn og passwword

enten kan du køre som

java Login vitaminen *******

eller du kan erstatte args[0] og args[1] med "vitaminen" og "*********"
Avatar billede arne_v Ekspert
19. juni 2006 - 01:54 #31
OK ?
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