Więc jakiś facet z innej firmy pomyślał, że byłoby wspaniale, gdyby zamiast używać mydła, xml-rpc, reszty lub innego rozsądnego protokołu komunikacyjnego, po prostu umieścił całą swoją odpowiedź w nagłówku jako ciasteczka.
Muszę wyciągnąć te ciasteczka jako, mam nadzieję, tablicę z tej odpowiedzi curl. Jeśli będę musiał marnować trochę życia na pisanie do tego parsera, będę bardzo nieszczęśliwy.
Czy ktoś wie, jak można to po prostu zrobić, najlepiej bez zapisywania czegokolwiek do pliku?
Będę bardzo wdzięczny, jeśli ktoś może mi w tym pomóc.
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'callback_SaveHeaders');
parse_str($m[1], $cookies)
, co spowoduje umieszczenie plików cookie w tablicy asocjacyjnej w$cookies
zmiennej ....preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); $cookies = array(); foreach($matches[1] as $item) { parse_str($item, $cookie); $cookies = array_merge($cookies, $cookie); }
Chociaż to pytanie jest dość stare, a zaakceptowana odpowiedź jest prawidłowa, uważam to za trochę niewygodne, ponieważ treść odpowiedzi HTTP (HTML, XML, JSON, binarne lub cokolwiek innego) jest mieszana z nagłówkami.
Znalazłem inną alternatywę. CURL udostępnia opcję (
CURLOPT_HEADERFUNCTION
) do ustawienia wywołania zwrotnego, które będzie wywoływane dla każdego wiersza nagłówka odpowiedzi. Funkcja otrzyma obiekt curl i ciąg z wierszem nagłówka.Możesz użyć takiego kodu (dostosowanego z odpowiedzi TML):
To rozwiązanie ma tę wadę, że używa zmiennej globalnej, ale myślę, że nie jest to problem w przypadku krótkich skryptów. I zawsze możesz użyć statycznych metod i atrybutów, jeśli curl jest pakowany do klasy.
źródło
$cookies
.$curlResponseHeaderCallback = function ($ch, $headerLine) use (&$cookies) {
wtedycurl_setopt($ch, CURLOPT_HEADERFUNCTION, $curlResponseHeaderCallback);
.$class->curlResponseHeaderCallback()
? Czy po prostu wychodziszcurlResponseHeaderCallback
poza zajęcia?Odbywa się to bez wyrażeń regularnych, ale wymaga rozszerzenia PECL HTTP .
źródło
pecl install
faktycznie zadziałało. Grrr.Jeśli używasz CURLOPT_COOKIE_FILE i CURLOPT_COOKIE_JAR, curl odczyta / zapisze ciasteczka z / do pliku. Po zakończeniu curl możesz go przeczytać i / lub zmodyfikować, jak chcesz.
źródło
libcurl udostępnia również CURLOPT_COOKIELIST, który wyodrębnia wszystkie znane pliki cookie. Wszystko, czego potrzebujesz, to upewnić się, że powiązanie PHP / CURL może go używać.
źródło
ktoś tutaj może uznać to za przydatne. hhb_curl_exec2 działa podobnie jak curl_exec, ale arg3 to tablica, która będzie wypełniona zwróconymi nagłówkami http (indeksem liczbowym), a arg4 to tablica, która będzie wypełniona zwróconymi ciasteczkami ($ cookies ["expires"] => " Fri, 06-May-2016 05:58:51 GMT ”), a argument arg5 zostanie wypełniony… informacjami o nieprzetworzonym żądaniu wysłanym przez curl.
Wadą jest to, że wymaga włączenia CURLOPT_RETURNTRANSFER, w przeciwnym razie wystąpi błąd i nadpisze CURLOPT_STDERR i CURLOPT_RETURNTRANSFER, w przeciwnym razie wystąpi CURLOPT_VERBOSE, jeśli już ich używałeś do czegoś innego ... (mogę to naprawić później)
przykład użycia:
i samą funkcję.
źródło
Zaakceptowana odpowiedź wydaje się przeszukiwać całą wiadomość z odpowiedzią. Może to dać fałszywe dopasowania dla nagłówków plików cookie, jeśli słowo „Set-Cookie” znajduje się na początku wiersza. Chociaż w większości przypadków powinno być dobrze. Bezpieczniejszym sposobem może być przeczytanie wiadomości od początku do pierwszej pustej linii, która wskazuje koniec nagłówków wiadomości. Jest to tylko alternatywne rozwiązanie, które powinno szukać pierwszej pustej linii, a następnie używać preg_grep w tych wierszach tylko w celu znalezienia „Set-Cookie”.
źródło
Rozumiem, że pliki cookie z domeny
curl
muszą być zapisywane do pliku (curl -c cookie_file
). Jeślicurl
korzystasz z PHPexec
lubsystem
funkcji (lub czegokolwiek z tej rodziny), powinieneś być w stanie zapisać pliki cookie do pliku, a następnie otworzyć plik i wczytać je.źródło