adi-a2
(Adi Aj)
21 Maj 2011 16:42
#1
Witam. Mam do was takie pytanie na które sam nie mogę odpowiedzieć
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?
177
(Copycona)
21 Maj 2011 17:39
#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-a2
(Adi Aj)
21 Maj 2011 22:40
#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ć?
177
(Copycona)
21 Maj 2011 23:32
#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 :
CURLOPT_AUTOREFERER - TRUE to automatically set the Referer: field in requests where it follows a Location: redirect. CURLOPT_FOLLOWLOCATION - TRUE to follow any "Location: " header that the server sends as part of the HTTP header (note this is recursive, PHP will follow as many "Location: " headers that it is sent, unless CURLOPT_MAXREDIRS is set).
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-a2
(Adi Aj)
22 Maj 2011 07:09
#5
Widzę, że się troszkę zamieszaliśmy 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
drobok
(Drobok)
22 Maj 2011 07:19
#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-a2
(Adi Aj)
22 Maj 2011 07:37
#7
drobok , to już wiem jednak dalej szukam rozwiązania dla swojego problemu
drobok
(Drobok)
22 Maj 2011 07:40
#8
A ten twój kod zapisany jest gdzieś na stronie ? Jeśli tak to wyrażenia regularne.
adi-a2
(Adi Aj)
22 Maj 2011 08:07
#9
Ten skrypt chce podpiąć pod Crona. Obecnie jest on u mnie na Localhost.
177
(Copycona)
22 Maj 2011 08:24
#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-a2
(Adi Aj)
22 Maj 2011 12:30
#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
Dziwna sprawa jednak co zrobić
177
(Copycona)
23 Maj 2011 19:04
#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-a2
(Adi Aj)
23 Maj 2011 19:21
#13
Na przyszłość będę już wiedzieć Dziękuje 177 za pomoc i wytrwałość przy takim uczniu jak ja