Spesso si è nella necessità di prelevare il contenuto di una pagina web, per estrapolare dati o per effettuare qualche conversione. Con la seguente funzione è possibile catturare il contenuto di una pagina web , passando i parametri tramite POST.
La funzione accetta l’indirizzo della pagina web e l’elenco dei parametri (gia codificati tramite urlencode) e restutisce la pagina catturata.
I parametri quindi devono essere della forma : ‘var1=xxx&var2=yyy’:
Dove i valori di xxx e yyy devono essere codificati tramite urlencode()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function postURL( $url ,$params) { $buffer=''; $url_parsed = parse_url($url); $host = $url_parsed["host"]; $port = $url_parsed["port"]; if ($port==0) $port = 80; $path = $url_parsed["path"]; $ContentLength = strlen($params); $out = "POST $path HTTP/1.0\r\n". "Host: $host\r\n". "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5\r\n". "Content-Type: application/x-www-form-urlencoded\r\n". "Content-Length: $ContentLength\n\n". "$params\n"; $fp = fsockopen($host, $port, $errno, $errstr, 30); fwrite($fp, $out); while (!feof($fp)) { $buffer.= fgets($fp, 128); } fclose($fp); return $buffer; } |
La funzione prima estrapola dall’ url (tramite parse_url) il nome dell’host, il numero della porta, ed il percorso (path). Quindi calcola la lunghezza delle variabili da inviare ($contentLength). A questo punto prepara l’header della richiesta HTTP da effettuare utilizzando questi dati.
Una volta preparato l’header apre una connessione socket con l’host (tramite fsockopen), invia la richiesta e preleva la risposta del server (il contenuto della pagina web) inserendola nella variabile buffer che verra poi restituita alla funzione.
La parte fondamentale di questa funzione è la costruzione dell’Header (contenuta nella variabile $out).
Si chiede al server HTTP di prelevare una pagina situata nel percorso $path, specificando di accettare i parametri tramite POST, quindi imposta il tipo di contenuto a application/x-www-form-urlencoded (necessario per passare i parametri tramite post, come se fossero inviati da una form). A questo punto si accodano i parametri codificati tramite urlencode, dopo averne specificato la lunghezza.
E’ possibile migliorare la funzione in modo da passare i parametri tramite un array ed effettuare l’urlencoding al suo interno.
Per esempio, passando un array in $params di questo tipo : array( ‘var1’=>’xxx’,’var2’=>’yyy’)
Per far ciò bisogna aggiungere le seguenti righe all’inizio della funzione.
1 2 3 4 |
foreach ($params as $k=>$v){ $query[]=$k."=".urlencode($v); } $params=implode ('&',$query); |
Nell’articolo “Funzione php per tradurre testi utilizzando Google Translator” mostro come utilizzare questa funzione per tradurre testi tramite google.
Successivamente mostrerò come creare un plugin per wordrpess per tradurre i post in automatico.
@Pitbull: non ho più quel file. Segnalami il tipo di errore, magari ti posso essere d’aiuto. Stai attento a copiare bene il testo e controlla gli apici che non sono molto eviedenti nel post (es $buffer=”; )
potrei avere il file php precedentemente citato… purtroppo non riesco a risolvere …credo di non essere troppo simpatico al server …da sempre errore interno :)
grande gennaro
@Marco: forse problemi di connessione. Prova a mettere degli echo, prima del ciclo o durante, per vedere meglio il problema.
Ho usato la funzione post_url, ma sembra non non finisca mai l’elaborare lo stato del browser è: In attesa di….
da cosa potrebbe dipendere?
Grazie molte
ciao
Salve, ho utilizzato anche io la funzione di traduzione. Ottima funzione soprattutto in abbinamento con postURL. Purtroppo anche a me non traduce la prima e l’ultima parola. Potrei gentilmente avere qualche info in più? Grazie.
Ciao,
$buffer=”; //svuota il buffer.
Per quanto rigarda il primo problema ti ho inviato via email, un file php funzionante, fammi sapere se ci sono problemi.
Salve, ho utilizzato lo script della funzione postURL , in abbinamento alla funzione traduci per google traslation, ho riscontrato pero’ un problema che non riesco a risolvere, nella traduzione vengono ignorati ( quindi riportati senza traduzione) la prima e l’ultima parola, quasi se stesse ad indicare che non vengono riconosciuti i tag.
P.s. ho una piccola domanda sulla funzione postURL, nella seconda riga
$buffer=”;
la variabile buffer viene inizializzata come stringa vuota ? quindi sono 2 apici singolo , perche’ se si tratta di un doppio apice manca quello che chiu de la stringa ed il parse php restituisce errore.
aspetto qualche indicazione, grazie a tutti
Vero Chris. Inoltre con un paio di righe è possibile inserire sia referer che cookie. Quindi ancora più interessante ;)
Nei blog senza captcha per i commenti spam, con una funzione del genere potresti fare un po’ di danni eheh :-D