Jsoups работает неправильно в Google App Engine
Я пытаюсь войти в facebook с помощью JSoup, при тестировании с консольным приложением или сервером Tomcat serverapp, он работает хорошо:
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
Но когда я пытаюсь использовать приложение 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 есть что-то другое, что делает запрос другим!
Ответы
Ответ 1
App Engine может время от времени делать несколько странных вещей, когда вы создаете исходящие HTTP-запросы с сервера. В зависимости от того, как JSoup реализует базовый запрос, возможно, что что-то смешивается. Под капотом, вероятно, потребуется использовать urlfetch.
Одна вещь, которую вы можете попробовать здесь, - использовать App Engine Flexible. Исходящие запросы не будут передаваться через UrlFetch или Sockets API там, поскольку в конечном итоге ваше приложение работает только в Google Compute Engine.
Если ваше приложение не использует тонну API-интерфейсов App Engine, это может быть простой способ обойти эту проблему.
Надеюсь, это поможет!
Ответ 2
Я бы предположил, что после успешного входа в систему facebook вернет некоторую переадресацию (несколько последовательных перенаправлений?) в качестве ответа.
Когда вы запускаете приложение вне GAE, java просто следует за этими переадресациями автоматически и в итоге возвращает https://m.facebook.com/home.php?_rdr
.
С другой стороны, при работе внутри GAE, библиотека GAE URLFetch следует только до 5 переадресаций (или ничего, если она настроена так).
Если это произойдет, вы можете следовать этим переадресациям в своем коде.
Можете ли вы также напечатать response1.statusCode()
, чтобы проверить эту гипотезу?
Ответ 3
Поскольку это связано с какой-то аутентификацией, мне интересно, нужно ли сохранять файлы cookie из первого ответа и использовать их в последующих запросах для обеспечения этой аутентификации.