1

私は mod として minecraft.net のユーザー名マイグレーターを作成しようとしています。これにより、人々はゲーム内で自分のアカウントを移行して、アカウントのクラッキングを思いとどまらせることができます。そのためには、フォームを Web サイトに投稿する必要があります。authenticationToken が同じままになるように Cookie を正常に取得できましたが、データをサイトに戻そうとすると、「java.io.IOException: URL https://account. mojang.com/migrate '

なぜこれが起こっているのかはよくわかりませんが、ウェブサイトに関係している可能性があります. authenticationToken は確実に一致します。サイトに投稿せず、同じ Cookie を提供するときにこれを確認しました。ここに私が現在使用しているコードがあります

try {
        Response response = Jsoup.connect("https://account.mojang.com/migrate").execute(); //downloads site to get the cookies
        String auth = response.body();
        String auth2 = auth.split("name=\"authenticityToken\" value=\"")[1];
        auth = auth2.split("\">")[0];
        Map<String, String> cookies = response.cookies();
        Connection connection = Jsoup.connect("https://account.mojang.com/migrate").data("action", "/migrate/check")
                .data("authenticityToken", auth)
                .data("mcusername", "username")
                .data("password", "password")
                .method(Method.POST)
                .followRedirects(true);
        for (Entry<String, String> cookie : cookies.entrySet()) {
            connection.cookie(cookie.getKey(), cookie.getValue());
        }
        connection.execute(); //exception thrown here
        Document document = connection.get();
        String docHtml = document.html();
        System.out.println(docHtml);
    } catch (Exception e) {
        e.printStackTrace();
    }

どんな助けでも大歓迎です

4

2 に答える 2

1
final Response response = 
    Jsoup.connect("https://account.mojang.com/migrate").execute();
// parse the response as a document, so that we can extract stuff
final Document doc = response.parse();
// correct way to extract parsed html
final Element authToken = doc.select("input[name^=authenticityToken]").get(0);
final Map<String, String> cookies = response.cookies();
// action isn't part of the querystring. The form POST URL is our target.
final Connection connection = 
        Jsoup.connect("https://account.mojang.com/migrate/check")
            .data("authenticityToken", authToken.val()) // correct way to extract val
            .data("mcusername", "username")
            .data("password", "password")
            .method(Method.POST)
            .followRedirects(true);
for (final Entry<String, String> cookie : cookies.entrySet()) {
    connection.cookie(cookie.getKey(), cookie.getValue());
}
final Response postResponse = connection.execute(); // consume response
System.out.println(postResponse.body());

応答の JSON:

{"error":"Invalid username or password."}

あなたの間違い:

  1. フォーム アクションはクエリ文字列パラメーターではありません。したがって.data("action", "/migrate/check")、正しくありません。上記のコードに示すように、フォーム アクションは POST URL の一部です。

  2. Document document = connection.get();URLでGETリクエストを行っています。これは正しくありません。connection.execute()はすでに POST を作成しています。応答を読んでくださいfinal Response postResponse = connection.execute()

  3. そのような非表示の入力、authenticityToken を解析する必要はありません。私が実証したように、Jsoup はあなたのためにそれを行うことができます。

于 2012-04-30T18:12:17.477 に答える
0

HttpConnection.Responce20に MAX_REDIRECTS等しい定数があります。実行がこの制限を超えたため、IOException がスローされました。

リダイレクトの無限ループで接続がスタックしているようです。データの投稿方法を変更してみてください。

編集 はい、リダイレクト後のすべての新しいページには 302 ステータスコードがあります。したがって、問題はおそらくあなたのリクエストにあります。

于 2012-04-30T17:59:04.790 に答える