Jsoups在Google App Engine上运行不正常

时间:2016-05-07 19:09:12

标签: java google-app-engine jsoup

我尝试使用JSoup登录facebook,在使用控制台应用程序或Tomcat服务器webapp进行测试时,它运行良好:

    String userAgent = BrowserVersion.FIREFOX_38.getUserAgent();
    Connection conn1 = Jsoup.connect("https://m.facebook.com");
    Document document = conn1.userAgent(userAgent).execute().parse();
    Element form = document.select("form").get(0);
    Elements inputs = form.select("input");


    Connection conn2 = Jsoup.connect(form.absUrl("action")).userAgent(userAgent);
    for (Element input : inputs) {
        conn2.data(input.attr("name"), input.val());
    }
    conn2.data("email", "mail@gmail.com").data("pass", "mypass");
    Connection.Response response1 = conn2.method(Connection.Method.POST).execute();
    System.out.println(response1.url());
    Document doc1 = response1.parse();
    Elements h3 = doc1.select("h3");
    for (Element element : h3) {
        System.out.println(element.text());
    }
  

response1.url()是https://m.facebook.com/home.php?_rdr

但是当我尝试使用Google App Engine应用时,它无法登录,但会显示包含“您必须先登录”的消息的页面(我猜这个请求会尝试访问其他网址)

  

response1.url()是https://m.facebook.com/login.php?next=https%3A%2F%2Fm.facebook.com%2Fhome.php%3Frefsrc%3Dhttps%253A%252F%252Fm.facebook.com%252F%26refid%3D8&refsrc=https%3A%2F%2Fm.facebook.com%2F&refid=8&_rdr

我更改密码使其不正确,它显示错误的密码页面。所以我认为使用正确的密码,请求会转到正确的页面。但为什么使用正确的密码,它会重定向到其他页面? 我不认为控制台应用程序和GAE之间有任何不同的东西使请求不同!

3 个答案:

答案 0 :(得分:0)

当您从服务器创建出站HTTP请求时,App Engine会不时地做一些奇怪的事情。根据JSoup如何实现底层请求,可能会出现混乱的情况。在幕后,它可能需要使用urlfetch

您可以尝试使用App Engine Flexible。出站请求不会通过UrlFetch或套接字API进行管道传输,因为最终您的应用只是在Google Compute Engine上运行。

如果您的应用没有使用大量的App Engine API,这可能是解决问题的简单方法。

希望这有帮助!

答案 1 :(得分:0)

我建议在成功登录后,facebook会返回一些重定向(几个连续重定向?)作为回复。

当你在GAE之外运行你的应用程序时,java会自动跟踪这些重定向,最终会返回https://m.facebook.com/home.php?_rdr

另一方面,当在GAE内部运行时,GAE的URLFetch库follows up to 5 redirects only(如果配置的话,则为无)。

如果是这种情况,那么您可以在代码中遵循这些重定向。

你还可以打印response1.statusCode()来检查这个假设吗?

答案 2 :(得分:0)

因为这涉及某种身份验证,我想知道您是否需要保留第一个响应中的cookie并在后续请求中使用它们来提供身份验证。