2016-05-07 26 views
13

provo ad entrare facebook con JSoup, quando la prova con console app o webapp server Tomcat, funziona bene:Jsoups eseguiti in modo non corretto su Google App Engine

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

ma quando cerco con Google App Engine applicazione, non può accedere, ma mostra la pagina con il messaggio "si deve prima effettuare il login" (immagino che la richiesta tenta di accedere qualche altro 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

posso cambiare la password per renderlo errata, mostra la pagina corretta-password. Quindi penso che con la password corretta, la richiesta vada alla pagina corretta. Ma perché con la password corretta, si reindirizza ad un'altra pagina? Non penso che ci sia qualcosa di diverso tra l'app della console e GAE che rende la richiesta diversa!

+0

Vorrei chiederti cosa stai cercando di fare. Sembra che tu stia cercando di connettersi a Facebook e accedere. Tuttavia, hai provato a riconnetterti a casa dopo aver provato ad accedere? – Gann14

+0

@ Gann14 sì, ho provato, e ancora non login – yelliver

risposta

0

App Engine può eseguire occasionalmente alcune strane operazioni quando si creano richieste HTTP in uscita dal server. A seconda di come JSoup implementa la richiesta sottostante, è possibile che qualcosa si confonda. Sotto il cofano, probabilmente dovrebbe usare urlfetch.

Una cosa che puoi provare qui è utilizzare App Engine Flexible. Le richieste in uscita non verranno sottoposte a piping tramite UrlFetch o l'API Sockets, poiché in definitiva l'app è in esecuzione su Google Compute Engine.

Se la tua app non utilizza una tonnellata di API di App Engine, questo potrebbe essere un modo semplice per aggirare il problema.

Spero che questo aiuti!

+0

Non voglio usare GAE Flex perché richiede il pagamento. – yelliver

0

Suggerirei che dopo aver effettuato correttamente l'accesso, Facebook restituisca alcuni reindirizzamento (diversi reindirizzamenti sequenziali?) Come risposta.

Quando si esegue l'app all'esterno di GAE, java segue semplicemente tali reindirizzamenti automaticamente e alla fine restituisce https://m.facebook.com/home.php?_rdr come risultato.

D'altra parte, quando si esegue all'interno di GAE, la libreria URLFetch di GAE follows up to 5 redirects only (o nessuna, se configurata in questo modo).

In questo caso, è possibile seguire tali reindirizzamenti nel codice.

È possibile stampare anche response1.statusCode() per verificare questa ipotesi?

0

Poiché si tratta di un qualche tipo di autenticazione, mi chiedo se è necessario conservare i cookie dalla prima risposta e utilizzarli nelle richieste successive per fornire tale autenticazione.