【问题标题】:Jsoup runs incorrectly on Google App EngineJsoup 在 Google App Engine 上运行不正确
【发布时间】:2016-09-02 17:20:00
【问题描述】:

我尝试使用 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 应用程序时,它无法登录,但会显示带有“您必须先登录”消息的页面(我猜该请求尝试访问其他一些 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 是的,我试过了,还是登陆不上

标签: java google-app-engine jsoup


【解决方案1】:

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

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

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

希望这会有所帮助!

【讨论】:

  • 我不想使用 GAE Flex,因为它需要付款。
【解决方案2】:

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

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

另一方面,当在 GAE 中运行时,GAE 的 URLFetch 库 follows up to 5 redirects only(或者没有,如果这样配置的话)。

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-10-20
      • 2013-03-31
      • 1970-01-01
      • 2020-01-07
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      相关资源
      最近更新 更多