2016-05-07 68 views
13

我尝试登录FACEBOOK与JSoup,当控制台应用程序或Tomcat服务器web应用测试,运行状况良好:Jsoups在谷歌应用程序引擎运行不正确

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", "[email protected]").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

但是当我尝试与谷歌App Engine应用程序,它无法登录,但显示的页面与消息“你必须先登录”(我猜测,请求尝试访问其他一些URL)

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之间有任何不同的事情,使请求不同!

+0

我会问你想做什么。它看起来像你试图连接到Facebook和登录。但是,您是否尝试过在尝试登录后重新连接到家中? – Gann14

+0

@ Gann14是的,我试过了,仍然没有登录 – yelliver

回答

0

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

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

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

希望这会有所帮助!

+0

我不想使用GAE Flex,因为它需要付款。 – yelliver

0

我建议成功登录后,facebook会返回一些重定向(几个顺序重定向?)作为响应。

当您在GAE之外运行应用程序时,java会自动跟随这些重定向,并最终返回https://m.facebook.com/home.php?_rdr。另一方面,当在GAE内部运行时,GAE的URLFetch库follows up to 5 redirects only(或者没有,如果这样配置的话)。

如果是这样的话,那么你可以在你的代码中遵循这些重定向。

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

0

因为这是处理某种认证,所以我想知道是否需要保留第一个响应中的cookie,并在随后的请求中使用它们来提供认证。