Jsoup在Google App Engine上运行不正常。

18

我试着使用JSoup登录Facebook,当在控制台应用程序或Tomcat服务器Web应用程序中测试时,它可以正常运行:

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 应用时,它无法登录,只显示带有“您必须先登录”的消息的页面(我猜请求会尝试访问其他 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 之间没有任何不同,使得请求不同!


我想问一下你想做什么。看起来你正在尝试连接到Facebook并登录。不过,在尝试登录后,你是否尝试过重新连接到主页呢? - Gann14
@Gann14 是的,我尝试了,仍然无法登录。 - yelliver
2个回答

1

在从服务器创建出站HTTP请求时,App Engine有时会做一些奇怪的事情。根据JSoup实现底层请求的方式,可能会出现混淆的情况。在幕后,它很可能需要使用urlfetch

你可以尝试使用App Engine Flexible。由于最终你的应用程序只是在Google Compute Engine上运行,因此出站请求不会通过UrlFetch或Sockets API进行传输。

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

希望这可以帮助到你!


我不想使用GAE Flex因为它需要付费。 - yelliver

1

我建议在成功登录后,Facebook会返回一些重定向(多个连续的重定向?)作为响应。

当您在GAE之外运行应用程序时,Java会自动跟随这些重定向,并最终返回https://m.facebook.com/home.php?_rdr作为结果。

另一方面,在GAE内运行时,GAE的URLFetch库仅跟随最多5个重定向(如果配置为不跟随,则不跟随)。

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

您能否打印response1.statusCode()以检查此假设?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接