发送查看网站隐藏内容所需的数据

时间:2015-09-25 20:48:26

标签: android login jsoup

最近我正在努力让应用关注特定网站。我需要访问记录后具有可见内容的页面。如果我明白,下面的代码显示,首先我需要连接到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中有错误(无法实例化类型,无法解析类型)。

1 个答案:

答案 0 :(得分:0)

要登录,您需要知道数据 POST (ID,密码,会话Cookie等等)以及网址 strong>你需要 POST 来。

此信息通常都包含在登录表单中,我将在下面解释执行此操作所需的步骤:

第1步:您需要输入登录的 ID 密码应该是表单的输入。只需右键点击您在 ID 中输入的区域,然后选择Inspect Element(假设您在Chrome上)。在那里,您将能够检查输入和表格的属性。

第2步:密切调查表单并记录所有输入字段(包括隐藏字段)。您需要知道所有字段的namevalue。您还需要知道表单请求是在GET还是POST以及表单的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是您放置cookie的地方,您需要检查您的请求是否需要服务器接受cookie,这可以在“cookies”部分的网络选项卡中查看。在您的情况下,它与用于url2的cookie相同。
  • method指定您的请求方式。

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

成功登录后,请确保将Cookie值存储在Map对象中,如下所示:

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

然后确保在以后的所有请求中将此cookies传递给cookies参数,如下所示:

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

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

----------------更新------------

从doInBackground任务的开头声明Map cookie。然后在您提出每个请求后存储所有COOKIES 。所以:

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