2013-06-28 16 views
8

Używam file_get_contents w PHP. W poniższym kodzie w pierwszym URL działa dobrze, ale drugi nie działa.file_get_contents nie działa dla jakiegoś adresu 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; 

Jakieś sugestie, dlaczego drugi nie działa?

+1

Więc co tak naprawdę brzmi drugi adres URL? Czy otrzymujesz jakieś komunikaty o błędach? –

+1

Co masz na myśli mówiąc "nie działa"? –

+0

proszę otworzyć oba adresy URL w przeglądarce. Obie powracające strony HTML. – Parixit

Odpowiedz

8

URL, które nie są pobierane przez file_get_contents, ponieważ ich serwer sprawdza, czy wniosek pochodzą z przeglądarki lub dowolnego skryptu. Jeśli znaleźli żądanie skryptu, po prostu wyłączają zawartość strony.

Tak, więc muszę złożyć wniosek podobny do żądania przeglądarki. Więc użyłem następującego kodu, aby uzyskać zawartość drugiego adresu URL. Może być inny dla różnych serwerów internetowych. Ponieważ mogą prowadzić różne kontrole.

Mimo to nie próbuj używać następującego kodu! Jeśli masz szczęście, to może ci pomóc!

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); 

Dziękuję wszystkim za wskazówki.

+0

A także chcę wspomnieć, że plik get_contents nie uruchamia żadnej sesji ani nie ustawia plików cookie, które zazwyczaj są wykonywane przez curl/przeglądarki. – Parixit

+0

czy jest konieczny plik 'cookies.txt' powinien tam być? –

+0

@hnn Jest to konieczne tylko wtedy, gdy 'URL', do którego chcesz zadzwonić, utrzymuje wszystkie pliki cookie w przeglądarce. – Parixit

1

wygląda na to, że drugi adres URL czasem odpowiada zbyt wolno, może ma przekierowania. spróbuj użyć curl i ustawić większy limit czasu. również skręcić błędy na

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

Niestety wygląda na to, że druga strona blokuje dostęp z nierozpoznanych przeglądarek. Nawet przy użyciu zwijania z linii poleceń nie działa:

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

daje:

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 

ale nie treści. Zwróć uwagę, że zwraca stan 200, więc jeśli zaznaczysz zwracany ciąg dla boolean === false, aby zobaczyć, czy się nie udało, będzie on wyglądał tak, jakby działał.

Jeśli chcesz sfałszować użytkownika (i ewentualnie inne rzeczy), aby spróbować uzyskać adres URL, aby zaakceptować swoją prośbę, musisz rzucić okiem na biblioteki curl i wypróbować różne kombinacje, aby spróbować je uruchomić. . Eksperymentowanie, aby zobaczyć, co działa z linią poleceń curl, byłoby również dobrym sposobem na skrócenie czasu projektowania.

Oto ktoś, kto został przez to wcześniej:

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

+0

Dzięki za odpowiedź. Próbowałem podać adres URL odpowiedzi. Ale wciąż nie działa. :( – Parixit

+1

Niestety, każda strona internetowa jest inna - być może trzeba będzie eksperymentować z różnymi nagłówkami HTTP, zanim pojawi się taki, który strona akceptuje ... lub może po prostu nigdy nie zadziała ... lub może nawet będzie potrzebne podszywanie się pod cookie Niestety próba i błąd to wszystko, co możesz zrobić tutaj - tego rodzaju rzeczy stają się coraz trudniejsze do wykonania :( – fquinner

Powiązane problemy