Подтвердить что ты не робот

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 есть что-то другое, что делает запрос другим!

4b9b3361

Ответ 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 из первого ответа и использовать их в последующих запросах для обеспечения этой аутентификации.