2013-06-28 15 views
8

Io uso file_get_contents in PHP. Nel codice qui sotto nel primo URL funziona bene ma il secondo non funziona.file_get_contents non funziona per qualche url


$URL = "http://test6473.blogspot.com"; 
$domain = file_get_contents($URL); 
print_r($domain); 


$add_url= "http://adfoc.us/1575051"; 
$add_domain = file_get_contents($add_url); 
echo $add_domain; 

Qualche suggerimento sul perché il secondo non funziona?

+1

Quindi qual è il secondo URL che effettivamente riecheggia? O ricevi qualche messaggio di errore? –

+1

Cosa intendi per "non funziona"? –

+0

si prega di aprire entrambi gli URL nel browser. Entrambe le pagine HTML di ritorno. – Parixit

risposta

8

URL che non è recuperato da file_get_contents, perché i loro server controlla se la richiesta provengono da browser o qualsiasi script. Se hanno trovato la richiesta dallo script, disabilitano semplicemente il contenuto della pagina.

In modo che io debba effettuare una richiesta simile alla richiesta del browser. Quindi ho usato il seguente codice per ottenere il secondo contenuto dell'URL. Potrebbe essere diverso per diversi server web. Perché potrebbero mantenere controlli diversi.

Anche se non provi ad usare il seguente codice! Se sei fortunato questo potrebbe funzionare per te !!

function getUrlContent($url) { 
    fopen("cookies.txt", "w"); 
    $parts = parse_url($url); 
    $host = $parts['host']; 
    $ch = curl_init(); 
    $header = array('GET /1575051 HTTP/1.1', 
     "Host: {$host}", 
     'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
     'Accept-Language:en-US,en;q=0.8', 
     'Cache-Control:max-age=0', 
     'Connection:keep-alive', 
     'Host:adfoc.us', 
     'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36', 
    ); 

    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); 
    curl_setopt($ch, CURLOPT_COOKIESESSION, true); 

    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt'); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
    $result = curl_exec($ch); 
    curl_close($ch); 
    return $result; 
} 

$url = "http://adfoc.us/1575051"; 
$html = getUrlContent($url); 

Grazie a tutti per la guida.

+0

E voglio anche menzionare che il file get_contents non avvia alcuna sessione o imposta i cookie che generalmente vengono eseguiti da curl/browser. – Parixit

+0

è necessario che il file 'cookies.txt' sia lì? –

+0

@hnn È necessario solo quando l'URL che si desidera chiamare mantiene qualsiasi cookie nel browser. – Parixit

1

sembra che il secondo URL risponda a volte troppo lento, forse ha reindirizzamenti. prova ad usare l'arricciatura e imposta un timeout più grande. anche, girare gli errori sul

error_reporting(-1); 
ini_set('display_errors','On'); 
2

Purtroppo sembra che il secondo blocca sito di accesso dai browser non riconosciuti. Anche usando ricciolo dalla riga di comando non funziona:

curl -I http://adfoc.us/1575051 

dà:

HTTP/1.1 200 OK 
Server: cloudflare-nginx 
Date: Fri, 28 Jun 2013 12:15:40 GMT 
Content-Type: text/html 
Connection: keep-alive 
X-Powered-By: PHP/5.5.0 
Set-Cookie: __cfduid=d7cd1bf18c136a288cc2b36065a3b31f01372421740; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.adfoc.us 
CF-RAY: 85a4dc6829e06d0 

ma nessun contenuto. Nota che restituisce lo stato 200, quindi se si controlla la stringa restituita per booleano === false per vedere se non è riuscita, apparirà effettivamente come se avesse funzionato.

Se hai bisogno di spoofare l'useragent (e possibilmente altre cose) per cercare di ottenere l'url per accettare la tua richiesta, dovrai fare il grande passo con le librerie di riccioli e provare diverse combinazioni per cercare di farlo funzionare . Sperimentare per vedere cosa funziona con la linea di comando del ricciolo in primo luogo sarebbe anche un buon modo per ridurre i tempi di sviluppo nell'indagare ciò.

Ecco qualcuno che è stato attraverso questo prima:

php curl: how can i emulate a get request exactly like a web browser?

+0

Grazie per la risposta. Ho provato l'url di una risposta all'altra. Ma ancora non funziona. :( – Parixit

+1

Sfortunatamente ogni sito web è diverso - potresti aver bisogno di sperimentare una varietà di diversi header http prima di averne uno che il sito accetta ... o potrebbe non funzionare mai ... o potresti anche aver bisogno dello spoofing del supporto dei cookie Sfortunatamente prova ed errore è tutto quello che puoi fare qui - questo genere di cose sta diventando sempre più difficile da fare :( – fquinner

Problemi correlati