我无法使用Jsoup登录Android网站

时间:2018-03-07 13:52:16

标签: android forms post login jsoup

我正在使用Jsoup尝试登录this网站。我使用以下代码:

Connection.Response res = Jsoup.connect("https://www.interpals.net/")
                                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36")
                                    .method(Connection.Method.GET)
                                    .followRedirects(true)
                                    .execute();


                            Document doc = res.parse();

                            Map<String, String> cookies = res.cookies();
                            System.out.println("cookies: "+cookies.size());
                            for (String key : cookies.keySet())
                                System.out.println(key);


                            Elements metaTags = doc.getElementsByTag("meta");

                            String csrf_token = "";
                            for (Element metaTag : metaTags) {

                                String content = metaTag.attr("content");
                                String name = metaTag.attr("name");

                                if("csrf-token".equals(name)) {
                                    csrf_token = content;
                                }

                            }


                            System.out.println("csrf_cookieV2 = "+cookies.get("csrf_cookieV2"));



                                res = Jsoup.connect("https://www.interpals.net/")
                                        .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36")
                                        .data("username", mEmailView.getText().toString())
                                        .data("password", mPasswordView.getText().toString())
                                        .data("csrf_token", csrf_token)
                                        .followRedirects(true)
                                        .cookies(cookies)
                                        .method(Connection.Method.POST)
                                        .execute();

                                doc = res.parse();

                            }

我注意到登录表单中有一个名为csrf_token的隐藏元素。此值写在头HTML中,但它使用JavaScript添加到表单中。 Jsoup不支持JavaScript所以我自己从头部提取了这个值,并将它放在POST方法参数中。发生的事情是我无法登录,每次重定向到登录页面。我尝试从禁用JavaScript的浏览器登录,如果我添加csrf_token输入字段,那么我就能成功登录。我还尝试更改一些cookie,看看我是否可以在我的PC上复制Android行为。当我更改csrf_cookieV2 cookie的值时,我能够复制它。问题是,当我执行POST请求时,我发送此cookie,因此问题应该在其他地方。我究竟做错了什么?任何的想法? 目前,只有在Android中使用WebView,我才能登录网站。

1 个答案:

答案 0 :(得分:0)

首先,您的帖子网址应为https://www.interpals.net/app/auth/login,因为它位于表单标记的操作属性中。

此页面需要推荐人(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer

所以你的第二个请求应该是这样的:

    Connection.Response res = Jsoup.connect("https://www.interpals.net/app/auth/login")
            .userAgent( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36")
            .referrer("https://www.interpals.net")
            .data("csrf_token", token)
            .data("username", "your-login")
            .data("password", "your-password")
            .cookies(cookies)
            .method(Method.POST).execute();

您将获得授权。