web-dev-qa-db-ja.com

HTTPSスクレイピング用のJsoupCookie

私はこのサイトを実験して、ウェルカムページでユーザー名を収集し、JsoupとAndroidを学習しています。次のコードを使用する

Connection.Response res = Jsoup.connect("http://www.mikeportnoy.com/forum/login.aspx")
    .data("ctl00$ContentPlaceHolder1$ctl00$Login1$UserName", "username", "ctl00$ContentPlaceHolder1$ctl00$Login1$Password", "password")
    .method(Method.POST)
    .execute();
String sessionId = res.cookie(".ASPXAUTH");

Document doc2 = Jsoup.connect("http://www.mikeportnoy.com/forum/default.aspx")
.cookie(".ASPXAUTH", sessionId)
.get();

私のCookie(.ASPXAUTH)は常にNULLになります。ウェブブラウザでこのCookieを削除すると、接続が失われます。だから私はそれが正しいクッキーであると確信しています。また、コードを変更すると

.cookie(".ASPXAUTH", "jkaldfjjfasldjf")  Using the correct values of course

このページからログイン名を取得できます。これはまた私が正しいクッキーを持っていると私に思わせます。では、どうして私のクッキーがNullになるのですか?ユーザー名とパスワード名のフィールドが正しくありませんか?他に何かありますか?

ありがとう。

15
Brian

私はここで10ヶ月遅れていることを知っています。しかし、Jsoupを使用する良いオプションは、この簡単で簡単なコードを使用することです。

//This will get you the response.
Response res = Jsoup
    .connect("url")
    .data("loginField", "[email protected]", "passField", "pass1234")
    .method(Method.POST)
    .execute();

//This will get you cookies
Map<String, String> cookies = res.cookies();

//And this is the easieste way I've found to remain in session
Documente doc = Jsoup.connect("url").cookies(cookies).get();

一部のWebサイトへの接続にまだ問題がありますが、同じ基本的なコードで多くのWebサイトに接続しています。ああ、そして忘れる前に..私が問題だと思ったのは、SSL証明書です。あなたは私がまだ完全に理解していない方法でそれらを適切に管理しなければなりません。

私はいつもこれを2つのステップで行います(通常の人間のように)、

  1. ログインページを読む(GET、Cookieを読む)
  2. フォームとCookieを送信する(POSTによる、Cookieの操作なし)

例:

Connection.Response response = Jsoup.connect("http://www.mikeportnoy.com/forum/login.aspx")
        .method(Connection.Method.GET)
        .execute();

response = Jsoup.connect("http://www.mikeportnoy.com/forum/login.aspx")
        .data("ctl00$ContentPlaceHolder1$ctl00$Login1$UserName", "username")
        .data("ctl00$ContentPlaceHolder1$ctl00$Login1$Password", "password")
        .cookies(response.cookies())
        .method(Connection.Method.POST)
        .execute();

Document homePage = Jsoup.connect("http://www.mikeportnoy.com/forum/default.aspx")
        .cookies(response.cookies())
        .get();

そして、常に前のリクエストから次の使用までクッキーを設定します

         .cookies(response.cookies())

ここではSSLは重要ではありません。証明書に問題がある場合は、SSLを無視するためにこのメソッドを実行してください。

public static void trustEveryone() {
    try {
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });

        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, new X509TrustManager[]{new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { }

            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { }

            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        }}, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
    } catch (Exception e) { // should never happen
        e.printStackTrace();
    }
}
12
MariuszS

次のようなことを想定せずにすべてのCookieをフェッチして渡すとどうなりますか? 送信POSTユーザー名とパスワードを使用したリクエストとセッションCookieの保存

それでも問題が解決しない場合は、これを調べてみてください: CookieをGETリクエストに渡す際の問題(POST後)

0
ankrooth