2014-02-27 56 views
2

我想要拿出一個Android應用程序,需要一些關於大學內部網站的信息。我一直在嘗試使用Jsoup以編程方式登錄網站。下面是代碼我現在有:如何使用Jsoup登錄我的大學網站?

import org.jsoup.Connection; 
import org.jsoup.Connection.Method; 
import org.jsoup.Jsoup; 
//import org.jsoup.helper.Validate; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
//import org.jsoup.select.Elements; 


import java.io.IOException; 
import java.util.Map; 

public class Test { 
    public static void main(String[] args) { 
     Document doc; 
     try { 
      Connection.Response res = Jsoup 
        .connect(
          "https://sso.bris.ac.uk/sso/login?service=https%3A%2F%2Fwww.cs.bris.ac.uk%2FTeaching%2Fsecure%2Funit-list.jsp%3Flist%3Dmine") 
        .execute(); 
      Map<String, String> cookies = res.cookies(); 
      System.out.println(cookies.keySet()); 
      Document fakepage = res.parse(); 
      Element fakelt = fakepage.select("input[name=lt]").get(0); 
      Element fakeexecution = fakepage.select("input[name=execution]") 
        .get(0); 
      Element fake_eventID = fakepage.select("input[name=_eventId]").get(
        0); 
      System.out.println("Hello World!"); 
      System.out.println(fakelt.attr("value")); 
      System.out.println(fakeexecution.toString()); 
      System.out.println(fake_eventID.toString()); 
//   System.out.println(cookies.get("JSESSIONID")); 
      String url="https://sso.bris.ac.uk/sso/login?service=https%3A%2F%2Fwww.cs.bris.ac.uk%2FTeaching%2Fsecure%2Funit-list.jsp%3Flist%3Dmine"; 
      System.out.println(url); 
      Connection newreq = Jsoup 
        .connect(url) 
        .cookies(cookies).data("lt", fakelt.attr("value")).followRedirects(true).header("Connection", "keep-alive") 
        .header("Refer", " https://sso.bris.ac.uk/sso/login?service=https%3A%2F%2Fwww.cs.bris.ac.uk%2FTeaching%2Fsecure%2Funit-list.jsp%3Flist%3Dmine") 
        .header("Content-Type","application/x-www-form-urlencoded;charset=UTF-8") 
        .userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:27.0) Gecko/20100101 Firefox/27.0") 
        .data("lt",fakelt.attr("value")) 
        .data("execution", fakeexecution.attr("value")) 
        .data("_eventID", fake_eventID.attr("value")) 
        .data("username", "aabbcc").data("password", "ddeeff") 
        .data("submit", "").method(Method.POST); 
      Connection.Response newres = newreq.execute(); 
      doc = newres.parse(); 
      System.out.println(doc.toString()); 
      System.out.println(newres.statusCode()); 


     Map<String,String> newcookies = newres.cookies(); 
     doc = Jsoup.connect("https://www.cs.bris.ac.uk/Teaching/secure/unit-list.jsp?list=mine").cookies(newcookies).get(); 
     System.out.println(doc.toString()); 
//   System.out.println(doc.toString()); 
     } catch (IOException e) { 
      System.out.println("Excepiton:"); 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

我完全僞造一個表單提交使用Jsoup,並繞過安全餅乾我首先請求的網站一次,然後用它把我送到請求網站餅乾再次。表單中有一些隱藏的字段,所以我使用我第一次請求時得到的那些字段,以便在我再次請求時僞造它。但是這不起作用。是否有可能做到這一點,或者服務器有一些先進的防範措施來阻止我這樣做?

+0

我不這樣看,因爲首先我有訪問網站所需的憑據,只有我想在不使用瀏覽器的情況下訪問它。其次,我這樣做的目的是幫助創建一個應用程序,使網站更容易訪問,而不是使其損壞或竊取信息。第三,這不是黑客入侵,這僅僅是一個工作。我可以提出一張票並等待IT人員爲我們創建一個API,但這需要更長的時間。這不是爲了惡意目的。 – dorafmon

+0

我道歉並收回我的-1票。 –

+0

我只想說謝謝你的理解:) – dorafmon

回答

0

不要使用Jsoup來做到這一點,它需要你自己處理所有的cookie,而是使用Httpclient,如果你使用4.0以後的版本,它會自動處理cookie。很多eaiser與合作。