1

我正在尝试为 minecraft.net 制作一个用户名迁移器作为一个 mod,这样人们就可以迁移他们的游戏帐户以阻止破解帐户。为此,我需要在网站上发布表格。我设法成功获取了 cookie,因此authenticityToken 将保持不变,但是每当我尝试将数据发布回站点时,它都会抛出'java.io.IOException:尝试加载 URL https://account时发生了太多重定向。 mojang.com/migrate '

我真的不确定为什么会发生这种情况,但可能与网站有关。authentityToken 绝对匹配。我在不发布到网站并提供相同的 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()已经发了一个帖子。只需阅读回复,final Response postResponse = connection.execute().

  3. 不需要像这样解析隐藏的输入,authenticityToken。正如我所展示的,Jsoup 可以为您做到这一点。

于 2012-04-30T18:12:17.477 回答
0

HttpConnection.Responce具有 MAX_REDIRECTS等于​​ 20 的常量。您的执行超出了此限制,因此引发了 IOException。

似乎连接陷入了无限循环的重定向。尝试改变发布数据的方法。

编辑 是的,重定向后的每个新页面都有 302 状态码。所以问题可能出在您的要求上。

于 2012-04-30T17:59:04.790 回答