2015-09-25 40 views
0

最近我试图让应用程序关注特定的网站。我需要访问登录后具有可见内容的页面。如果我明白,下面的代码显示,首先我需要连接到url1以避免默认主页,所以在这里我无法发送数据(登录名,密码)。我需要看到来自url3的内容,但在这里我也无法发送数据,因为没有登录名和密码字段。他们在url2中。我尝试了本网站的其他解决方案,但我只收到每个人都可以看到的内容。任何人都可以帮忙吗?发送数据需要查看来自网站的隐藏内容

private class Parser extends AsyncTask<Void, Void, Void> { 
    String h; 
    String url1 = "http://www.klt.net.pl/"; 
    String url2 = "http://www.klt.net.pl/index.php?a=logowanie"; 
    String url3 = "http://www.klt.net.pl/index.php?a=przedmecz1&b=2&d=2038"; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pd = new ProgressDialog(MainActivity.this); 
     pd.setTitle("Parser"); 
     pd.setMessage("Loading..."); 
     pd.setIndeterminate(false); 
     pd.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      Connection.Response response = Jsoup.connect(url1) 
      .method(Connection.Method.GET) 
      .timeout(50000) 
      .followRedirects(true) 
      .execute(); 
     Document document = Jsoup.connect(url2) 
      .cookies(response.cookies()) 
      .get(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     pd.dismiss(); 
    } 
} 

编辑:

@Override 
protected Void doInBackground(Void... params) { 
    try { 
     Connection.Response response = Jsoup.connect(url1) 
     .method(Connection.Method.GET) 
     .timeout(50000) 
     .followRedirects(true) 
     .execute(); 

     Connection.Response loginRes = Jsoup.connect(url2) 
     .userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36") 
     .data("login", getlog2, 
     "haslo", getpass2) 
     .cookies(response.cookies()) 
     .method(Method.POST) 
     .execute(); 

     Map<String, String> cookies = new Map<String, String>(); 
     cookies.addAll(loginRes.cookies()); 

     Connection.Response otherRes = Jsoup.connect(url3) 
     .cookies(cookies) 
     .method(Method.POST) 
     .execute(); 

     d3 = Jsoup.connect(url3) 
     .cookies(otherRes.cookies()) 
     .get(); 

我更新的代码。这可以吗?我在Map中有错误(无法安装类型并且无法解析类型)。

+0

你的问题还不是很清楚 –

+0

这可以帮助更好地理解:http://stackoverflow.com/questions/32734928/jsoup-parsing-from-direct-link-doesnt-work/32737661?noredirect = 1#comment53330262_32737661但现在我需要从url3获取内容。 – zdc

+0

嘿:)这里可以帮助你解决第二个问题!所以你想通过url2登录来访问url3中的内容,这是正确的吗? –

回答

0

登陆,你需要知道什么数据POST(ID,密码,会话cookie等..),以及URL地址需要POST来。

此信息一般都包含在登录表单,我会解释这个下面做所需的步骤:你需要输入的ID密码

步骤1登录应该是表单的输入。因此,只需右键单击您在ID中输入的区域,然后选择Inspect Element(假设您使用的是Chrome)。在那里你将能够检查输入和表单的属性。

步骤2:密切调查的形式,并保持的纪录所有输入栏中(包括隐藏字段)。你需要知道所有领域的namevalue。您还需要知道表单请求是否在GETPOST以及表单的action值中进行。

第3步:现在让我们来看看有趣的部分。使用以下代码片段向服务器发出请求并检索所需的内容。

Connection.Response loginRes = Jsoup.connect(loginUrl) 
           .userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36" 
           .data("login", yourID 
            "haslo", yourPassword) 
           .cookies(response.cookies()) //this is the same cookie you used for url2! 
           .method(Method.POST) 
           .execute(); 
  • loginUrl是请求的地址,而你的情况是"http://www.klt.net.pl/index.php?a=logowanie"
  • userAgent告诉服务器您的浏览器的详细信息。
  • data是你把你的名字&值对的所有输入字段的形式。
  • cookies是你放置你的cookies的地方,你需要检查你的请求是否需要cookies被服务器接受,这可以在“cookies”部分的网络选项卡中检查。在你的情况下,它是用于url2的同一个cookie。
  • method指定您的请求方法。

检索到的loginRes对象将包含您需要的所有信息,html,cookie和所有内容。

你已经成功登录后,请确保您在Map对象存储cookie的值象下面这样:

Map<String, String> cookies; 
cookies.putAll(loginRes.cookies()); 

并确保通过这一cookies到饼干参数今后所有申请,如下所示:

Connection.Response otherRes = Jsoup.connect(otherUrl).cookies(cookies).... 

这将确保您的登录会话得到维护,并且服务器知道您是经过身份验证的用户。

----------------更新------------从doInBackground任务开始

申报地图的cookie。然后在您提出每个请求后,将所有COOKIES存储。所以:

cookies = response.cookies(); 
cookies.putAll(loginRes.cookies(); 
cookies.putAll(otherRes.cookies(); 
+0

谢谢你的解释,但我还有一点问题。请检查我更新的问题。 – zdc

+0

嗨,看到我更新的答案请 –

+0

我已经尝试过它,但它给了我错误,我必须初始化变量,所以我将它设置为空,然后它告诉我,变量只能在这个位置为null。问题比我想象的要困难:/ – zdc