[PHP] Curlopt_header


(Adi Aj) #1

Witam. Mam do was takie pytanie na które sam nie mogę odpowiedzieć :frowning:

Napisałem skrypt który chodzi po stronie www i wykonuje swoje zadanie. Aby zakończyć wykonywanie skryptu potrzebuję potwierdzenie poprawnego wykonania, czyli potrzebuje wartość jednej zmiennej, ale...

<?php

$c = curl_init();

curl_setopt($c, CURLOPT_URL, "http://www.cos.pl/login.php");

curl_setopt($c, CURL_POST, 1);

curl_setopt($c, CURLOPT_POSTFIELDS, "login=xxx&password=xxx");

curl_setopt($c, CURLOPT_HEADER, true);

curl_setopt($c, CURLOPT_COOKIEJAR, "cookie.txt");

curl_setopt($c, CURLOPT_COOKIEFILE, "cookie.txt");

curl_exec($c);

curl_close($c);

?>

To jest przykładowy kod. Część kodu opisana "CURLOPT_HEADER" zawiera to co potrzebuje.

Tutaj jest moje pytanie: jak zapisać nagłówek/tekst znajdujący się w CURLOPT_HEADER do zwykłej zmiennej?


(Copycona) #2

Interesuje Cię to:

http://www.php.net/manual/pl/function.curl-setopt.php

Tylko kod odpowiedzi HTTP:

http://www.php.net/manual/pl/function.curl-getinfo.php

<?php= curl_init();curl_setopt($ch, CURLOPT_URL, "http://www.dobreprogramy.pl");curl_setopt($ch, CURLOPT_HEADER, true);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_NOBODY, true);$output = curl_exec($ch);$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);curl_close($ch);var_dump($output);var_dump($http_code);[/code]


[quote]
string(297) "HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 179827
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.0
Set-Cookie: ASP.NET_SessionId=zxcvbnm; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sat, 21 May 2011 17:38:20 GMT

"
[/quote]
 [quote]
int(200)
[/quote]

(Adi Aj) #3

Hmm faktycznie mam dostęp do danych ale tylko małego skrawka. Więc tak, gdy wyświetlę na stronie "curl_setopt($ch, CURLOPT_HEADER, true);" dostanę podobny wynik do tego:

HTTP/1.1 302 Moved Temporarily Server: Apache-Coyote/1.1 Location: http://mojewww.pl/c-ConfirmAd?AdId=284323206&Guid=13014ae9-fbe0-a20b-2787-6ecefffd918e&mpname=LocClass-PreAuthAd&mpuid=63183624%3B284323206%3B63183624%3B3200006%3B8%3B%3B%3B%3B%3B1306017046526 Content-Type: text/html;charset=utf-8 Content-Length: 0 Date: Sat, 21 May 2011 22:30:46 GMT Connection: keep-alive Set-Cookie: session_preference=Vaddr=version%3D2%0Acity%3DPozna%C5%84%0Acountry%3DPL%0Amapaddress%3DPozna%C5%84%0Aaccuracylevel%3D3%0Aconfidencelevel%3D2%0Alatitude%3D52.406374%0Alongitude%3D16.9251681; Domain=.mojewww.pl; Path=/ Set-Cookie: area_preference=Vrandom_marker=84^guid=2AQAAAS0LYAwAAM4AMDc0NDcwODA3LTQyNTctNDZlNS1iZjdhLWEwYmU4ODRjMDNhMC0xMzAwYTA5YzU3Ynyt8dPm+HilESLX0+jNp8j0WMGN; Domain=.mojewww.pl; Expires=Sun, 20-May-2012 22:30:46 GMT; Path=/ Set-Cookie: cls-last-visit=1306017046526; Domain=mojewww.pl; Expires=Sun, 20-May-2012 22:30:46 GMT; Path=/ Cache-Control: private

Natomiast chcę wyciągnąć tylko te dwie wartości: AdId i Guid.

Więc 177 , twój sposób działa tylko nie zwraca mi ciągu znaków w których były by moje niezbędne informacje. Czy masz jakichś pomysł jak temu zaradzić?


(Copycona) #4

Zaraz, zaraz, jaki skrawek?!

CURLOPT_HEADER - ustawia, by w wyniku zawarte były także nagłówki zwrócone przez serwer.

CURLOPT_NOBODY - zmienia metodę http z GET na HEAD - zamiast pobrać cały zasób (stronę), pobierze tylko nagłówki.

CURLOPT_RETURNTRANSFER - zwraca (przypisuje) wynik, wykonanej sesji, do zmiennej, zamiast ją wyświetlać bezpośrednio na wyjściu.

Jeżeli te niezbędne informacje są w tym nagłówku (a w podanym przykładzie właśnie tam one się znajdują), to używając tej kombinacji masz w zmiennej ten ciąg znaków (cały nagłówek) - a więc, także poszukiwane przez Ciebie wartości. Inna sprawa je teraz z tego ciągu znaków wydzielić.

Pytanie co chcesz z tymi AdId i Guid zrobić? Może Ty chcesz po prostu przejść na tą stronę wskazaną przez "Location"? Jeżeli tak to przydadzą Ci się te opcje:

Jeżeli jednak koniecznie chcesz je stamtąd odczytać trzeba użyć wyrażeń regularnych.

<?php= "    HTTP/1.1 302 Moved Temporarily Server: Apache-Coyote/1.1 Location: http://mojewww.pl/c-ConfirmAd?AdId=284323206Guid=13014ae9-fbe0-a20b-2787-6ecefffd918empname=LocClass-PreAuthAdmpuid=63183624%3B284323206%3B63183624%3B3200006%3B8%3B%3B%3B%3B%3B1306017046526 Content-Type: text/html;charset=utf-8 Content-Length: 0 Date: Sat, 21 May 2011 22:30:46 GMT Connection: keep-alive Set-Cookie: session_preference=Vaddr=version%3D2%0Acity%3DPozna%C5%84%0Acountry%3DPL%0Amapaddress%3DPozna%C5%84%0Aaccuracylevel%3D3%0Aconfidencelevel%3D2%0Alatitude%3D52.406374%0Alongitude%3D16.9251681; Domain=.mojewww.pl; Path=/ Set-Cookie: area_preference=Vrandom_marker=84^guid=2AQAAAS0LYAwAAM4AMDc0NDcwODA3LTQyNTctNDZlNS1iZjdhLWEwYmU4ODRjMDNhMC0xMzAwYTA5YzU3Ynyt8dPm+HilESLX0+jNp8j0WMGN; Domain=.mojewww.pl; Expires=Sun, 20-May-2012 22:30:46 GMT; Path=/ Set-Cookie: cls-last-visit=1306017046526; Domain=mojewww.pl; Expires=Sun, 20-May-2012 22:30:46 GMT; Path=/ Cache-Control: private ";$AdId = '';$Guid = '';

(Adi Aj) #5

Widzę, że się troszkę zamieszaliśmy :slight_smile: Zrobiłem wszystko według twoich wskazówek i dostaję do zmiennej ten ciąg znków:

string(126) "HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Length: 0 Date: Sun, 22 May 2011 07:00:26 GMT Connection: keep-alive " int(200)

a, chciałbym mieć w zmiennej ten właśnie ciąg znaków:

HTTP/1.1 302 Moved Temporarily Server: Apache-Coyote/1.1 Location: http://mojewww.pl/c-ConfirmAd?AdId=284323206&Guid=13014ae9-fbe0-a20b-2787-6ecefffd918e&mpname=LocClass-PreAuthAd&mpuid=63183624%3B284323206%3B63183624%3B3200006%3B8%3B%3B%3B%3B%3B1306017046526 Content-Type: text/html;charset=utf-8 Content-Length: 0 Date: Sat, 21 May 2011 22:30:46 GMT Connection: keep-alive Set-Cookie: session_preference=Vaddr=version%3D2%0Acity%3DPozna%C5%84%0Acountry%3DPL%0Amapaddress%3DPozna%C5%84%0Aaccuracylevel%3D3%0Aconfidencelevel%3D2%0Alatitude%3D52.406374%0Alongitude%3D16.9251681; Domain=.mojewww.pl; Path=/ Set-Cookie: area_preference=Vrandom_marker=84^guid=2AQAAAS0LYAwAAM4AMDc0NDcwODA3LTQyNTctNDZlNS1iZjdhLWEwYmU4ODRjMDNhMC0xMzAwYTA5YzU3Ynyt8dPm+HilESLX0+jNp8j0WMGN; Domain=.mojewww.pl; Expires=Sun, 20-May-2012 22:30:46 GMT; Path=/ Set-Cookie: cls-last-visit=1306017046526; Domain=mojewww.pl; Expires=Sun, 20-May-2012 22:30:46 GMT; Path=/ Cache-Control: private

Wyciągnięcie zmiennej AdId i Guid to nie problem. Tylko muszę mieć ten ciąg znaków aby to wyciągnąć. Myślałem, że gdy zrobię, np. tak:

$head = curl_setopt($ch, CURLOPT_HEADER, TRUE);

echo $head;

to wtedy dostanę ten dłuuugi ciąg znaków ale nic z tego. Dostaję tylko wartość: 1.

Jak zapisać ten cały ciąg znaków wygenerowany przez serwer do jednej zmiennej?

Sprawdziłem wszystkie funkcje curl-getinfo i żadna nie zwraca tamtych wartości na których mi zależy.

Ps. mam nadzieje, że dobrze wytłumaczyłem wszystkie swoje problemy i wątpliwości :slight_smile:


(Drobok) #6

Bo coś z czegoś jest nie możliwe, ta zmienna jest typu bool(1albo0). Więc nie masz nawet co z nią kombinować.


(Adi Aj) #7

drobok , to już wiem :slight_smile: jednak dalej szukam rozwiązania dla swojego problemu :frowning:


(Drobok) #8

A ten twój kod zapisany jest gdzieś na stronie ? Jeśli tak to wyrażenia regularne.


(Adi Aj) #9

Ten skrypt chce podpiąć pod Crona. Obecnie jest on u mnie na Localhost.


(Copycona) #10

Po pierwsze przy takich pomysłach "a może to tak zadziała", warto na php.net sprawdzić co dana funkcja zrobi, i co zwróci. W ten sposób się wyjaśni, czy to w ogóle ma sens. Tym razem, w Twoim ostatnim przykładzie: nie ma.

Teraz uwaga, moja teoria na rozwiązanie/źródło/analizuję problemu.

Najpierw pomyślałem, że być może curl domyślnie ma opcję CURLOPT_AUTOREFERER na true, i Ci podąża za tym nagłówkiem Location, co skutkuje ostatecznie kodem http 200 OK. Niestety muszę obalić tą teorię. Wykonałem szybki test na połączeniu z googlem (gdyż: jak się wejdzie na google.pl bez www, to zwraca nagłówek Location z brakującą częścią i kod http 301 Moved Permanently), i się okazało, że dostałem kod 301 zarówno z wymuszeniem opcji na false, jak i jej nie ustawianiem. Co więcej, gdy zmieni się to na true, w zwracanym ciągu są obydwa nagłówki - pierwszego 301 moved z Location, i drugiego 200 OK. W żaden sposób to nie pasuje do Twojej sytuacji. Prezentuję:

<?php= curl_init();curl_setopt($ch, CURLOPT_URL, "http://google.pl");curl_setopt($ch, CURLOPT_HEADER, true);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_NOBODY, true);$output1 = curl_exec($ch);curl_close($ch);

(Adi Aj) #11

Mam rozwiązanie! Bardzo dziwna sprawa ale cel osiągnięty. Oto kod:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://mojewww.pl");

curl_setopt($ch, CURLOPT_HEADER, TRUE);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

$output = curl_exec($ch);

curl_close($ch);

var_dump(split("\n", $output));

Cały czas dostawiałem do kodu

curl_setopt($ch, CURLOPT_NOBODY, true);

jednak po wstawieniu tego kawałka skrypt całkowicie nie działał i nie zwracał wartości. Rozwiązaniem jest tylko brak tego kawałka :slight_smile:

Dziwna sprawa jednak co zrobić :smiley:


(Copycona) #12

Szukając przyczyny:

Ah, faktycznie, z tego co wklejałeś wcześniej, Ty tam coś metodą POST przesyłasz.

Przy użyciu CURLOPT_NOBODY zmienia się ona na HEAD, skutkiem czego dane formularza wyparowują.

Test:

<?php= curl_init();curl_setopt($ch, CURLOPT_URL, "http://www.google.pl");curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, "testuje=postfields");curl_setopt($ch, CURLOPT_HEADER, true);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLINFO_HEADER_OUT, true);curl_setopt($ch, CURLOPT_NOBODY, true);curl_exec($ch);$header1 = curl_getinfo($ch, CURLINFO_HEADER_OUT);curl_close($ch);

(Adi Aj) #13

Na przyszłość będę już wiedzieć :slight_smile: Dziękuje 177 za pomoc i wytrwałość przy takim uczniu jak ja :smiley: