2011-08-22 4 views
5

Questo potrebbe sembrare un po 'indietro, ma voglio usare Perl (e Curl se possibile) per ottenere dati da un sito che sta usando Ajax per riempire una shell HTML con informazioni. Come faccio a fare queste chiamate Javascript per ottenere i dati che mi servono?Come posso raccogliere dati da un sito Web che utilizza AJAX, con Perl?

Il sito web è qui: http://www.jigsaw.com/showContactUpdateTab.xhtml?companyId=224230

+1

Da ToS del sito: Atti contro il sito Web/Servizi. L'utente non deve tentare di intraprendere azioni potenzialmente dannose dirette contro il sito Web o i servizi, tra cui, a titolo esemplificativo, quanto segue: ... Utilizzo di software manuali o automatici, dispositivi, robot di script, altri mezzi o processi per l'accesso, "raschiare". , "" Crawl "o" spider "qualsiasi pagina contenuta nel sito Web ... – Ashley

+1

@Ashley, grazie per avermi informato del loro ToS e informerò il mio capo. I suoi avvocati prenderanno una decisione appropriata in base a questo.Ma come sempre, questo post è strettamente per scopi educativi. –

+0

@Ashley Ho informato la polizia dei Termini di servizio del sito web, stanno arrivando per arrestare il poster. Sho: resta dove sei e togli le mani dalla tastiera. – mikemaccana

risposta

4

Ricordate che le chiamate AJAX sono normali richieste HTTP, in modo da sempre dovrebbe essere in grado di eseguire tali operazioni.

aprire Firebug o Web Inspector sul sito web di cui stai parlando, vedrete alcune XHR chiama:

XHR terminato il caricamento: "http://www.jigsaw.com/dwr/interface /UserActionAPI.js". "http://www.jigsaw.com/dwr/call/plaincall/UserActionAPI.getMostPurchasedContacts.dwr". "http://www.jigsaw.com/dwr/call/plaincall/UserActionAPI.getRecentlyGraveyardedContacts.dwr " http://www.jigsaw.com/dwr/call/plaincall/UserActionAPI.getRecentlyAddedContacts.dwr ". " http://www.jigsaw.com/dwr/call/plaincall/UserActionAPI.getRecentlyTitleChangedContacts.dwr"

Yay! Ora sapete dove trovare i dati. i loro script usano POST richiesta HTTP per gli URL di cui sopra, quindi se li apri nel tuo browser, vedrai vari errori del motore

Quando si annulla (tramite il debugger di Web Inspector, ad esempio) le richieste POST AJAX, verrà visualizzato il corpo successivo:

"callCount = 1 page =/showContactUpdateTab.xhtml? CompanyID = 224230 httpSessionId = F5E7EC4A45DFCE87B969A9F4FA06C361 scriptSessionId = D020EFF4333283B907402687182D03E034 C0-scriptName = UserActionAPI C0-nomeMetodo = getRecentlyGraveyardedContacts C0-id = 0 C0 param0 = numero: 224230 C0-param1 = booleano: true C0-param2 = booleano: true BatchID = 1 "

Sono sicuro che stanno generando un sacco di ID di sessione di sicurezza per evitare i minatori di dati. Potrebbe essere necessario immergersi nei loro codici JavaScript per saperne di più su questi generatori.

+0

Dolce! Trovato i parametri in Firebug e collegato a quelli in una chiamata POST in cURL. Grazie! –

+0

Non so ... Ho rimosso completamente lo script SessionID e httpSessionID ed ero ancora in grado di ottenere tutti i dati. È possibile che non riescano nemmeno a rintracciare quegli ID? –

+0

Esiste la possibilità che utilizzino tali valori internamente (in JavaScript) per confrontare gli ID inviati con quelli ricevuti, ovvero tenendo traccia delle risposte appropriate per le richieste archiviate. –

2

Alcune applicazioni dispongono di codice per verificare che il client sia un vero client AJAX. Semplicemente il controllo per la presenza dell'intestazione X-Requested-With: XMLHttpRequest. Quindi è facilmente aggirabile:

curl -H 'X-Requested-With: XMLHttpRequest' ... 

use HTTP::Request::Common; 
GET $url, 'X-Requested-With' => 'XMLHttpRequest', ... 

Naturalmente, si potrebbe avere a che fare con la solita roba, come i biscotti richiesti (per la sessione), parametri nonce, la complessità occasionale. Firebug o simili per altri browser ti aiuteranno a decodificare le intestazioni ei parametri richiesti.