2012-04-23 14 views
12

Sto provando a generare un PDF usando WKHTMLTOPDF che richiede che effettui il primo accesso. Ce ne sono già su Internet, ma non riesco a far funzionare il mio. Sono al Terminal - niente di speciale.Genera PDF dietro il muro di autenticazione

Ho provato (tra un sacco di altre cose):

/usr/bin/wkhtmltopdf --post username=myusername --post password=mypassword "URL to Generate" test.pdf 

/usr/bin/wkhtmltopdf --username myusername --password mypassword "URL to Generate" test.pdf 

/usr/bin/wkhtmltopdf --cookie-jar my.jar --post username=myusername --post password=mypassword "URL to Generate Cookie For" 

username e password sono entrambi il id e name dei campi di immissione sul modulo. Sto visualizzando il file my.jar, ma non viene scritto nulla.

Domande specifiche:

  1. Dovrei specificando la pagina di login e/o azione sotto forma da qualche parte?
  2. il parametro --cookie-jar è stato menzionato in vari punti (sia come necessario che in altro modo). Se necessario, come funziona? Ho creato il file my.jar ma come lo uso di nuovo? Riferimento:

http://code.google.com/p/wkhtmltopdf/issues/detail?id=356


EDIT:

Sicuramente qualcuno ha fatto questo successo? Un buon modo per mostrare un esempio potrebbe essere se qualcuno è disposto a farlo funzionare su un sito Web popolare che richiede credenziali di accesso per eliminare una variabile potenziale.

risposta

8

Credo che la forma che sto cercando di accedere al è troppo complessa. È sicuro, imposta tre cookie, reindirizza due volte e pubblica un numero di altre variabili al di fuori del nome utente e della password, uno dei quali richiede un valore di cookie (ho persino provato a concatenare il valore nella variabile post, ma senza fortuna). Questo è probabilmente un problema piuttosto raro: non è affatto colpa di WKHTMLTOPDF.

Mi sono avviato utilizzando CURL per accedere e scrivere la pagina in un file locale, quindi eseguire WKHTMLTOPDF contro quello.Sicuramente una soluzione solida per chiunque abbia un problema simile.


Edit: CURL, se interessati:

curl_setopt($ch, CURLOPT_HEADER, 1); # Change to 1 to see WTF 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
curl_setopt($ch, CURLOPT_URL, $loginUrl); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); 
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
+0

Sarebbe stato molto più utile delineare questa sintassi cURL che ha fatto il trucco per te. –

+0

Hi Ifedi, non sono sicuro che la mia specifica implementazione sarà utile per il tuo caso d'uso (è la stringa di post specifica per le mie esigenze e implementata tramite PHP) ma l'ho aggiunta, quindi spero che sia d'aiuto. – Chords

12

Ogni modulo di accesso sarà diverso per ogni sito. Quello che vorrete fare è determinare che cosa avete bisogno di passare alla destinazione del modulo di login leggendo l'HTML sulla pagina (di cui probabilmente siete a conoscenza). Potrebbe essere necessario un campo nascosto aggiuntivo sopra i campi nome utente/password per evitare falsi di richieste cross-site.

Il parametro jar cookie è un file in cui vengono archiviati i cookie restituiti dal server Web. È necessario specificarlo nella prima richiesta al modulo di accesso e nelle richieste successive di continuare a utilizzare il cookie/sessione . informazioni che il server web avrà dato indietro dopo il login

Quindi, per riassumere:

  1. guardare e vedere se ci sono ulteriori parametri sulla pagina desiderata.
  2. Assicurarsi che l'URL a cui ci si sta inviando sia uguale all'attributo ACTION dell'elemento del modulo in quella pagina.
  3. Utilizzare il parametro --cookie-jar sia nella richiesta di accesso che nella seconda richiesta di contenuto.
  4. La sintassi per i parametri --post sono --post user_name_value nome utente la password --post password_value
+0

Grazie, hsanders. Anche se ho finito per prendere un'altra strada, la tua risposta sembra solida. Grazie per aver trovato il tempo di rispondere! – Chords

+0

@Chords Nessun problema. Ho usato wkhtmltopdf un paio di volte prima. Penso che per un caso più complicato, come quello che hai descritto, è un po 'un dolore da usare ... Non sono sicuro di come si tratterebbe dei reindirizzamenti che hai menzionato nel tuo follow-up, non ho mai dovuto occuparmene. – hsanders

3

Potreste essere interessati a provare a rendere in PDF con phantomjs.

phantomjs rasterize.js http://blah.com/ webgl.pdf 

È possibile trovare rasterize.js here. Fondamentalmente, si scrive qualche javascript per accedere alla pagina di accesso, quindi si crea il PDF.

Tuttavia, l'output non è lo stesso di wkhtmltopdf. Si può semplicemente salvare l'HTML in un file e quindi eseguire il rendering con wkhtmltopdf se l'output PDF di phantomjs è troppo orribile.

Problemi correlati