Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Curl a przesyłanie ciasteczek
Forum PHP.pl > Forum > PHP
Mayka
Mam takie pytanie czy da się jakoś zrobić żeby pobierane ciastko przez curl'a zostało pobrane i zapisane u użytkownika ?
Bo mam strone która coś tam wyswietla i wysyła ciastko, ale potrzebuje ją pobrać przez skrypt i wyświetlić z moim kodem w przeglądarce.. da sie jakoś ?
Generalnie chodzi mi o to żeby to było całkowicie przeźroczyste dla użytkownika..
!*!
http://php.pl/Wortal/Artykuly/PHP/Bibliote...ol-HTTP/Ciastka
Cytat
Generalnie chodzi mi o to żeby to było całkowicie przeźroczyste dla użytkownika..

Co to znaczy?
Mayka
No dobra mam funkcje zapisującą do pliku :

curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookies.txt');

i funkcje wysyłającą do użytkownika dalej ciastko

curl_setopt($ch, CURLOPT_COOKIE, $cookie)

a jak zrobić zeby w $cookie znalazło się to co zostało przesłane ? Nie da się tego jakoś jednym czy dwoma zapytaniami ?
Bo teraz musze zapisać do pliku i zrobić odczyt z pliku i wygenerować takie samo ciastko jak jest na stronie z której pobieram tak ?

@ !*! Chodzi mi o to żeby user oglądajacy strone A nie wiedział ze treść jest pobrana ze strony B, bo tak w tej chwili jest tylko brakuje mi tych ciastek...
wNogachSpisz
Nic nie rozumiem.
!*!
Mayka - ogarnij się chłopie, bo to już któryś chaotyczny post z Twojej strony. Przejrzałeś plik cookies.txt? Operuj na nim.
Mayka
Ojejku..
Mam strone A która generuje sobie jakiś kod i wysyła ciastko.
I napisałem sobie strone B która pobiera to co generuje ta pierwsza i dodaje swój kod do niej przerabia co nieco i wyświetla użytkownikowi.
Tylko teraz mam problem jak przesłać ciastko ze strony A do użytkownika przez strone B

Może teraz bardziej obrazowo tongue.gif

Cytat(!*! @ 13.12.2012, 14:44:05 ) *
Mayka - ogarnij się chłopie, bo to już któryś chaotyczny post z Twojej strony. Przejrzałeś plik cookies.txt? Operuj na nim.


Hahaha dobra już sie ogarniam tongue.gif
No mam plik cookie.txt ale interesuje mnie czy nie można tego zrobić bez tego pliku ?
wNogachSpisz
Niestety, nadał tylko szum i trzask.
Mayka
Cytat(wNogachSpisz @ 13.12.2012, 14:48:13 ) *
Niestety, nadał tylko szum i trzask.


ehh..
To poprostu czy da się pobrać ciastko za pomocą curla i wysłać je do przeglądarki bez pliku ?
wNogachSpisz
Co to znaczy "bez pliku"?

Może chodziło Ci o "plik bezu".
To nie jest forum ogrodnicze.
Mayka
Cytat(wNogachSpisz @ 13.12.2012, 14:54:11 ) *
Co to znaczy "bez pliku"?

Może chodziło Ci o "plik bezu".
To nie jest forum ogrodnicze.


Jak co to znaczy ? Nie rozumiesz dwóch prostych wyrazów ? Nie wykożystując do tego pliku cookie.txt jeśli nic ciekawego nie masz do powiedzenia to po co piszesz ? I nie chodziło mi o forum ogrodnicze..
skoro jest funkcja do zapisu do pliku CURLOPT_COOKIEFILE i CURLOPT_COOKIEJAR to pytam czy jest możliwość zrobienia tego jakąś inna funkcją
która pobiera i wysyła, nie wykożystując przy tym pliku.
wNogachSpisz
Teraz już wiadomo co masz na myśli pisząc "bez pliku".
Wcześniej nie było.

Ja używam PEAR::HTTP_Request2, który korzysta z CURLa tyle że za pośrednictwem abstrakcyjnej klasy "adapter".

  1. $request = new HTTP_Request2;
  2. $request->setMethod( HTTP_Request2::METHOD_GET );
  3.  
  4. // pierwsze połączenie
  5. $request->setUrl( 'http://example.com' );
  6. $response = $request->send();
  7. retain_cookies( $request, $response ); // zachowujemy cookie
  8.  
  9. // drugie połączenie
  10. $request->setUrl( 'http://example.com/path' );
  11. $response = $request->send();
  12. retain_cookies( $request, $response ); // zachowujemy cookie
  13.  
  14. // trzecie połączenie...
  15.  
  16. function retain_cookies( HTTP_Request2 $request, HTTP_Request2_Response $response ) {
  17.  
  18. $response_cookies = $response->getCookies();
  19.  
  20. foreach ( $response_cookies as $cookie ) {
  21. $request->addCookie( $cookie['name'], $cookie['value'] );
  22. }
  23. }

http://pear.php.net/package/HTTP_Request2/redirected

P.S.
To nie moja wina że nie potrafisz się wysłowić.
Mayka
No i widzisz można było smile.gif Dzieki śliczne, tylko teraz jeśli za pomocą zewnętrznej biblioteki się da to nieda się za pomocą samego curla ?

Bo rozważałem to rozwiązanie z plikiem, tylko co w w momencie gdy 2 osoby otworzą strone jednocześnie ? Blokujemy plik na czas odczytu i do drugiego nie wysyłamy w ogóle ?
może ktoś ma koncepcje jak nie ładować do wysyłania ciastka całej biblioteki którą dał wNogachSpisz ?
wNogachSpisz
Dlaczego po prostu nie użyjesz HTTP_Request? Jakiś konkretny powód czy prymitywny strach przed nieznanym?
Mayka
Cytat(wNogachSpisz @ 14.12.2012, 11:08:36 ) *
Dlaczego po prostu nie użyjesz HTTP_Request? Jakiś konkretny powód czy prymitywny strach przed nieznanym?


Tak jak mowisz, prymitywny strach przed nieznanym tongue.gif
Kofel
To może już nie zagłębiając się w porady Pana Mądrego (który nota bene nie potrafi zrozumieć paru prostych zdań), mam tu dla Ciebie małą ciekawostkę:

  1. $ch = curl_init('http://php.pl/');
  2. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  3. curl_setopt($ch, CURLOPT_HEADER, 1);
  4.  
  5. $m = null;
  6. preg_match('/^Set-Cookie: (.*?);/m', curl_exec($ch), $m);
  7.  
  8. var_dump( $m[1] );

Mayka
Cytat(Kofel @ 14.12.2012, 15:12:46 ) *
To może już nie zagłębiając się w porady Pana Mądrego (który nota bene nie potrafi zrozumieć paru prostych zdań), mam tu dla Ciebie małą ciekawostkę:

  1. $ch = curl_init('http://php.pl/');
  2. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  3. curl_setopt($ch, CURLOPT_HEADER, 1);
  4.  
  5. $m = null;
  6. preg_match('/^Set-Cookie: (.*?);/m', curl_exec($ch), $m);
  7.  
  8. var_dump( $m[1] );


Oo jest i ciastko wink.gif No czyli jednak da się wink.gif czyli można je teraz w headerze do strony wynikowej wysłać ?
Kofel
Możesz wink.gif
wNogachSpisz
Gratulacje, kolejna proteza która pewnego razu nie zadziała
i cały dzień zajmie szukanie źródła problemu...
Dobrze że to nie mój problem. Dobrze że nikt z Was dla mnie nie pracuje smile.gif

Wiadomośc dla potomnych:
Przedstawione wyżej rozwiązanie jest nieprawidłowe, nie zadziała nigdy albo spiepszy się któregoś dnia bez ostrzeżenia. Proponuję HTTP_Request2 gdzie odpowiednia logika dba o utrzymanie ciastek w szyku.
Kofel
Kurde, kolego. Argumenty.
"która pewnego razu nie zadziała"
Tzn. kiedy?
pyro
Cytat(wNogachSpisz @ 14.12.2012, 18:11:30 ) *
Gratulacje, kolejna proteza która pewnego razu nie zadziała
i cały dzień zajmie szukanie źródła problemu...
Dobrze że to nie mój problem. Dobrze że nikt z Was dla mnie nie pracuje smile.gif

Wiadomośc dla potomnych:
Przedstawione wyżej rozwiązanie jest nieprawidłowe, nie zadziała nigdy albo spiepszy się któregoś dnia bez ostrzeżenia. Proponuję HTTP_Request2 gdzie odpowiednia logika dba o utrzymanie ciastek w szyku.


Zadziała zawsze. Chyba, że serwer nie wyśle żadnych nagłówków, ale wtedy nic takiego serwera nie obsłuży.

Też bym nie chciał, żebyś dla mnie pracował, skoro nie potrafisz zrozumieć 2 prostych zdań, nie znasz się, a drążysz dalej bez sensu i do tego nie znasz podstaw gramatyki ("spieprzy", a nie "spiepszy").
wNogachSpisz
Bo parsowanie nagłówków powinno wyglądać tak:

  1. public function parseHeaderLine($headerLine)
  2. {
  3. $headerLine = trim($headerLine, "\r\n");
  4.  
  5. if ('' == $headerLine) {
  6. // empty string signals the end of headers, process the received ones
  7. if (!empty($this->headers['set-cookie'])) {
  8. $cookies = is_array($this->headers['set-cookie'])?
  9. $this->headers['set-cookie']:
  10. array($this->headers['set-cookie']);
  11. foreach ($cookies as $cookieString) {
  12. $this->parseCookie($cookieString);
  13. }
  14. unset($this->headers['set-cookie']);
  15. }
  16. foreach (array_keys($this->headers) as $k) {
  17. if (is_array($this->headers[$k])) {
  18. $this->headers[$k] = implode(', ', $this->headers[$k]);
  19. }
  20. }
  21.  
  22. } elseif (preg_match('!^([^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+):(.+)$!', $headerLine, $m)) {
  23. // string of the form header-name: header value
  24. $name = strtolower($m[1]);
  25. $value = trim($m[2]);
  26. if (empty($this->headers[$name])) {
  27. $this->headers[$name] = $value;
  28. } else {
  29. if (!is_array($this->headers[$name])) {
  30. $this->headers[$name] = array($this->headers[$name]);
  31. }
  32. $this->headers[$name][] = $value;
  33. }
  34. $this->lastHeader = $name;
  35.  
  36. } elseif (preg_match('!^\s+(.+)$!', $headerLine, $m) && $this->lastHeader) {
  37. // continuation of a previous header
  38. if (!is_array($this->headers[$this->lastHeader])) {
  39. $this->headers[$this->lastHeader] .= ' ' . trim($m[1]);
  40. } else {
  41. $key = count($this->headers[$this->lastHeader]) - 1;
  42. $this->headers[$this->lastHeader][$key] .= ' ' . trim($m[1]);
  43. }
  44. }
  45. }


nastomiast parsowanie cookie tak:
  1. protected function parseCookie($cookieString)
  2. {
  3. $cookie = array(
  4. 'expires' => null,
  5. 'domain' => null,
  6. 'path' => null,
  7. 'secure' => false
  8. );
  9.  
  10. if (!strpos($cookieString, ';')) {
  11. // Only a name=value pair
  12. $pos = strpos($cookieString, '=');
  13. $cookie['name'] = trim(substr($cookieString, 0, $pos));
  14. $cookie['value'] = trim(substr($cookieString, $pos + 1));
  15.  
  16. } else {
  17. // Some optional parameters are supplied
  18. $elements = explode(';', $cookieString);
  19. $pos = strpos($elements[0], '=');
  20. $cookie['name'] = trim(substr($elements[0], 0, $pos));
  21. $cookie['value'] = trim(substr($elements[0], $pos + 1));
  22.  
  23. for ($i = 1; $i < count($elements); $i++) {
  24. if (false === strpos($elements[$i], '=')) {
  25. $elName = trim($elements[$i]);
  26. $elValue = null;
  27. } else {
  28. list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i]));
  29. }
  30. $elName = strtolower($elName);
  31. if ('secure' == $elName) {
  32. $cookie['secure'] = true;
  33. } elseif ('expires' == $elName) {
  34. $cookie['expires'] = str_replace('"', '', $elValue);
  35. } elseif ('path' == $elName || 'domain' == $elName) {
  36. $cookie[$elName] = urldecode($elValue);
  37. } else {
  38. $cookie[$elName] = $elValue;
  39. }
  40. }
  41. }
  42. $this->cookies[] = $cookie;
  43. }


Ten kod - w odróżnieniu od tego co podano wyżej - zadziała zawsze.
Jeśli ktoś ma wolne pół dnia na analizowanie linia po linii, co się w tym kodzie dzieje, to śmiało.
Ja mam ciekawsze zajęcia (na przykład tworzenie softu który dla odmiany DZIAŁA!).
Kofel
Tak, z tym że Ty podałeś kod KTÓRY już nam przeparsuje ciasteczka. Autor tematu chciał tylko PRZEKAZAĆ ciasteczka z REQUESTa do przeglądarki. Nic po za tym. wink.gif Może tylko co do parsowania nagłówka masz racje, ale niestety nie znam na tyle HTTP.
pyro
Cytat(Kofel @ 15.12.2012, 14:05:57 ) *
Tak, z tym że Ty podałeś kod KTÓRY już nam przeparsuje ciasteczka. Autor tematu chciał tylko PRZEKAZAĆ ciasteczka z REQUESTa do przeglądarki. Nic po za tym. wink.gif Może tylko co do parsowania nagłówka masz racje, ale niestety nie znam na tyle HTTP.


Użytkownik ten po prostu nie ma zielonego pojęcia o tym, co pisze. Skopiował sobie metodę z cudzej (bo to nie jego) klasy, która rzeczywiście jest dobrze zrobiona, ale nie ma zupełnie nic do rzeczy z tym, że dopisując parser do poprzedniego kodu też wszystko będzie działało w każdym przypadku. Po prostu znalazł sobie gotowca i myśli, że wszystkie inne rozwiązania są złe. I jeszcze do tego odebrał możliwość uzytkownikowi nauczenia się czegoś podsuwając tego gotowca.
wNogachSpisz
Cytat(pyro @ 15.12.2012, 14:13:31 ) *
Użytkownik ten po prostu nie ma zielonego pojęcia o tym, co pisze. Skopiował sobie metodę z cudzej (bo to nie jego) klasy, która rzeczywiście jest dobrze zrobiona, ale nie ma zupełnie nic do rzeczy z tym, że dopisując parser do poprzedniego kodu też wszystko będzie działało w każdym przypadku. Po prostu znalazł sobie gotowca i myśli, że wszystkie inne rozwiązania są złe. I jeszcze do tego odebrał możliwość uzytkownikowi nauczenia się czegoś podsuwając tego gotowca.

Głęboka psychodza widzę..
Pozwoliłem sobie odpowiedzieć na pytanie "dlaczego nie zadziała" wklejony kod jest odpowiedzią.
Ma on wszystko do rzeczy, te metody odpowiadają za parsowanei nagłówków i cookie.

Funkcje pochodzą oczywiście z PEAR::HTTP_Request2

Pozostawie bez komenatrza tezę, że wklejając kod (który nawiasem mówiąc w tej postaci nie zadziała) odbieram moożliwośc zdobywania wiedzy.
Kofel
Wcale nie jest odpowiedzią. Czekam na przykłady kiedy nie zadziała biggrin.gif
wNogachSpisz
Cytat(Kofel @ 15.12.2012, 15:16:51 ) *
Wcale nie jest odpowiedzią. Czekam na przykłady kiedy nie zadziała biggrin.gif


Nie zadziała w sytuacji, gdy serwer zachowa się w sposób dozwolony
ale inny niż wysłanie jednego ciastka z kluczem "Set-cookie",

Np:
- serwer wysłe kilka par set-cookie
- cookie wygaśnie.
Kofel
Jaki znasz jeszcze inny dozwolony sposób przesłania ciastka, niż nagłówek z kluczem "Set-Cookie"?
wNogachSpisz
To wynika z kodu który wrzuciłem wyżej
Kofel
Fakt, może być ich więcej niż jeden. Coś więcej? biggrin.gif
wNogachSpisz
Cytat(Kofel @ 15.12.2012, 15:48:33 ) *
Fakt, może być ich więcej niż jeden. Coś więcej? biggrin.gif

Tylko tyle, że zamiast siedzieć i zastanawiać się "co jeszcze", można po prostu użyć tej wyśmienitej bibliteki (PEAR::HTTP_Request2), zostawić jej obsługe cookie, a samemu zająć się czymś pożytecznym albo zyskownym.
Mayka
Cytat(Kofel @ 15.12.2012, 14:05:57 ) *
Tak, z tym że Ty podałeś kod KTÓRY już nam przeparsuje ciasteczka. Autor tematu chciał tylko PRZEKAZAĆ ciasteczka z REQUESTa do przeglądarki. Nic po za tym. wink.gif Może tylko co do parsowania nagłówka masz racje, ale niestety nie znam na tyle HTTP.

Tak dokładnie chciałem (nadal chce wink.gif ) to zrobic. I dlatego rozwiązanie które podałeś wydaje mi się wystarczające bo pakowanie jakiejś wielkiej biblioteki TYLKO do przesłania ciasteczka wydaje mi się conajmniej głupotą...

Cytat(wNogachSpisz @ 15.12.2012, 15:23:58 ) *
Nie zadziała w sytuacji, gdy serwer zachowa się w sposób dozwolony
ale inny niż wysłanie jednego ciastka z kluczem "Set-cookie",

Np:
- serwer wysłe kilka par set-cookie
- cookie wygaśnie.

Ja tu czegoś nie rozumiem, jak cookie może wygasnąć ? Przecież ciastka wygasają w przeglądarce a nie na serwerze ?

No i wypłodziłem sobie kodzik, wszystko fajnie tylko teraz można jakoś wysłać to dalej bez jakiej kolwiek modyfikacji ?
Bo mam np taki nagłówek:
Set-Cookie: 88fb5406286f5e1=a%3A1%3A%7Bi; expires=Fri, 30-Oct-2212 09:21:20 GMT i tak przy okzazji jak odszyfrować te dane ciastka " A%3a1% ... "?
Jedyny znany mi sposób przeysłania ciastka to setcookie('nazwa_zmiennej','wartosc', time() + 30 * 86400);
a żeby takie zapytanie skonstruować to musiał bym "wyciągnąć" zmienną, wartość a później jeszcze policzyć czas od Fri, 30-Oct-2212 09:21:20 GMT;
Kofel
Zamiast używać setcookie, ten string "Set-Cookie: 88fb5406286f5e1=a%3A1%3A%7Bi; expires=Fri, 30-Oct-2212 09:21:20 GMT" prześlij w nagłówku do przeglądarki.
Tzn:

header("Set-Cookie: 88fb5406286f5e1=a%3A1%3A%7Bi; expires=Fri, 30-Oct-2212 09:21:20 GMT");
Mayka
Własnie zastanawiałem się czy tak można, dzieki Kofel za pomoc browarek sie należy wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.