Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP/CURL] Problem z przesyłaniem POST
Forum PHP.pl > Forum > PHP
linx
Witam,
jestem w trakcie pisania mechanizmu dodawania ogłoszeń do portalu ogłoszeniowego.
Mechanizm dobrze działa o ile przy przesyłaniu danych metodą POST nie da się za dużo znaków.
Do jakieś ilości znaków skrypt działa prawidłowo, powyżej jakieś liczny znaków (nie wiem jakiej) skrypt w ogóle się nie wykonuje.

  1. <?php
  2.  
  3. $strona = curl_init();
  4. curl_setopt($strona, CURLOPT_HEADER, false);
  5. curl_setopt($strona, CURLOPT_FRESH_CONNECT, true);
  6. curl_setopt($strona, CURLOPT_RETURNTRANSFER, true);
  7. curl_setopt($strona, CURLOPT_FOLLOWLOCATION, true);
  8. curl_setopt($strona, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10');
  9. curl_setopt($strona, CURLOPT_COOKIESESSION, TRUE);
  10. curl_setopt($strona, CURLOPT_COOKIEFILE, 'cookies.txt');
  11. curl_setopt($strona, CURLOPT_COOKIEJAR, 'cookies.txt');
  12. curl_setopt($strona, CURLOPT_COOKIE, session_name() . '=' . session_id());
  13. curl_setopt($strona, CURLOPT_TIMEOUT, 50);
  14. //logowanie do strony
  15. curl_setopt($strona, CURLOPT_POST, true);
  16. curl_setopt($strona, CURLOPT_POSTFIELDS, 'dane_do_logowania_przesylane_met_post');
  17. curl_setopt($strona, CURLOPT_URL, 'http://link_do_strony_z_logowaniem');
  18. curl_exec($strona);
  19. //logowanie do strony eof
  20.  
  21. //dodawanie ogloszenia
  22. curl_setopt($strona, CURLOPT_POST, true);
  23. //przy wysyłaniu POST w tym miejscu przydużej ilości znaków skrypt wogóle się nie wykonuje
  24. curl_setopt($strona, CURLOPT_POSTFIELDS, 'dane_przesylane_post_dane_do_ogloszen');
  25. curl_setopt($strona, CURLOPT_URL, 'http://link_do_strony_z_dodawaniem_ogloszenia');
  26. echo curl_exec($strona);
  27. //dodawanie ogloszenia eof
  28. curl_close($strona);
  29.  
  30. ?>


Moja wiedza z tego zakresu nie jest duża więc wszelkie uwagi mile widziane.
carbolymer
Przedstaw dokładniej problem jeśli możesz. Przy jakich danych przestaje Ci działać wysyłanie POST? Wysyłasz dane w formacie ciągu (tj. http_build_query" title="Zobacz w manualu PHP" target="_manual) czy tablicy asocjacyjnej?
linx
a więc, przy takiej postaci działa (wycinek kodu)

  1. <?php
  2. $ogloszenie[kategoria] = '0010';
  3. $ogloszenie[tytul] = 'ogloszenie ogloszenie ogloszenie ogloszenie';
  4. $ogloszenie[opis] = 'ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie';
  5. $ogloszenie[mail] = 'rysio@xxx.pl';
  6. $ogloszenie[gal] = 'http://img1.classistatic.com/cps/l/kj/09/5/31/889/r4/2852a6a_18.jpeg?set_id=1C4000';
  7. $ogloszenie[gal_min] = 'http://img1.classistatic.com/cps/l/kj/09/5/31/889/r4/2852a6a_14.jpeg';
  8.  
  9. curl_setopt($strona, CURLOPT_POSTFIELDS, 'SubArea=3200008&Thumbnail='.$ogloszenie[gal_min].'&Photo='.$ogloszenie[gal].'&featuredAdDuration=0&CatId='.$ogloszenie[kategoria].'&Email=rysio@dknet.com.pl&Title='.$ogloszenie[tytul].'&Description='.$ogloszenie[opis].'&ReformattedDesc=1&PreviewToPost=false');
  10. ?>


a przy takiej już nie (wycinek kodu), kod w ogóle się nie wykonuje, może to jakieś ograniczenia php lub biblioteki curl
  1. <?php
  2. $ogloszenie[kategoria] = '0010';
  3. $ogloszenie[tytul] = 'ogloszenie ogloszenie ogloszenie ogloszenie';
  4. $ogloszenie[opis] = 'ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ogloszenie ';
  5. $ogloszenie[mail] = 'rysio@xxx.pl';
  6. $ogloszenie[gal] = 'http://img1.classistatic.com/cps/l/kj/09/5/31/889/r4/2852a6a_18.jpeg?set_id=1C4000';
  7. $ogloszenie[gal_min] = 'http://img1.classistatic.com/cps/l/kj/09/5/31/889/r4/2852a6a_14.jpeg';
  8.  
  9. curl_setopt($strona, CURLOPT_POSTFIELDS, 'SubArea=3200008&Thumbnail='.$ogloszenie[gal_min].'&Photo='.$ogloszenie[gal].'&featuredAdDuration=0&CatId='.$ogloszenie[kategoria].'&Email=rysio@dknet.com.pl&Title='.$ogloszenie[tytul].'&Description='.$ogloszenie[opis].'&ReformattedDesc=1&PreviewToPost=false');
  10. ?>


ale z tego co zauważyłem są to jakieś ograniczenia CURLOPT_POSTFIELDS, ponieważ niema to znaczenia czy $ogloszenie[opis] czy $ogloszenie[gal] ma ja dużą ilość danych.
erix
Spróbuj tym: http://scripts.incutio.com/httpclient/
linx
Nie mogę za bardzo poradzić sobie z tą biblioteką.
Nie wiem czy to wina mojego skryptu, czy czegoś brakuje mi na serwerze(raczej czegoś mi na nim brakuje).

A może ktoś wie jak rozwiązać mój problem przy użyciu CURL??
golaod
Komentarz z php.net

Cytat
If you are doing a POST, and the content length is 1,025 or greater, then curl exploits a feature of http 1.1: 100 (Continue) Status.

See http://www.w3.org/Protocols/rfc2616/rfc261...8.html#sec8.2.3

* it adds a header, "Expect: 100-continue".
* it then sends the request head, waits for a 100 response code, then sends the content

Not all web servers support this though. Various errors are returned depending on the server. If this happens to you, suppress the "Expect" header with this command:

<?php
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
?>

See http://www.gnegg.ch/2007/02/the-return-of-...t-100-continue/
erix
Cytat
Nie mogę za bardzo poradzić sobie z tą biblioteką.

Z czym sobie nie radzisz? Masz przecież dokumentację. A z tego, co widzę, to cURL-em nie pójdzie, trzeba ręcznie konstruować pakiet HTTP i wysyłać przez fsockopen" title="Zobacz w manualu PHP" target="_manual, co ta biblioteka właśnie realizuje.
golaod
No niby znalazłem
Cytat
$curl->setopt( CURLOPT_POSTFIELDS, "$string" );
$curl->setopt( CURLOPT_POSTFIELDSIZE, $length );
$curl->setopt( CURLOPT_POST, 1 );
$curl->setopt( CURLOPT_CONNECTTIMEOUT,8);

Jednak ja osobiście nie widzę takiej flagi w dokumentacji. Tzn. do C/C++ znalazłem jednak do php brak.

Może definiując samemu w nagłówku POST/ by zadziałało ?

Osobiście jednak przyłączam się do erix'a. Biblioteka ma dokumentacje więc można skorzystać.
golaod
A mam takie pytanie. Jesteś pewien, że tam gdzie powinna trafić tablica post to strona www.//twoja_podana_strona.pl/logowanie.php ?
A może ma być logowanie.php?login=1 albo check_login.php albo może jest jakiś <input type="hidden" /> który też musi być przesłany ?
Poza tym z tego, co widzę to skrypt sam zapamiętuje cookie więc nie trzeba mu podawać go za pomocą setCookie chyba, że chcesz odzyskać sesje lub uruchomić jakieś autologowanie.
linx
A więc tak, skrypt przy użyciu CURL działa prawidłowo. Tylko tak jak pisałem wyżej nie nadaje się przy przesyłaniu dużej ilości danych POST`em.
  1. <?php
  2.  
  3. $ogloszenie = array();
  4. $ogloszenie[kategoria] = 'kat1';
  5. $ogloszenie[tytul] = 'tytul_opisu';
  6. $ogloszenie[opis] = 'opis';
  7. $ogloszenie[gal] = 'link_do_img';
  8. $ogloszenie[gal_min] = 'link_do_img_mini';
  9. $strona = curl_init();
  10.  
  11. curl_setopt($strona, CURLOPT_HEADER, false);
  12. curl_setopt($strona, CURLOPT_FRESH_CONNECT, true);
  13. curl_setopt($strona, CURLOPT_RETURNTRANSFER, true);
  14. curl_setopt($strona, CURLOPT_FOLLOWLOCATION, true);
  15. curl_setopt($strona, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10');
  16. curl_setopt($strona, CURLOPT_COOKIESESSION, TRUE);
  17. curl_setopt($strona, CURLOPT_COOKIEFILE, 'cookies.txt');
  18. curl_setopt($strona, CURLOPT_COOKIEJAR, 'cookies.txt');
  19. curl_setopt($strona, CURLOPT_COOKIE, session_name() . '=' . session_id());
  20. curl_setopt($strona, CURLOPT_TIMEOUT, 50);
  21. curl_setopt($strona, CURLOPT_POST, true);
  22. curl_setopt($strona, CURLOPT_POSTFIELDS, 'login=rysiopysio&haslo=jakieshaselko&Submit=zaloguj się');
  23.  
  24. curl_setopt($strona, CURLOPT_URL, 'http://strona_www.pl/logowanie.php');
  25.  
  26. curl_setopt($strona, CURLOPT_POST, true);
  27. curl_setopt($strona, CURLOPT_POSTFIELDS, 'SubArea=3200008&Thumbnail='.$ogloszenie[gal_min].'&Photo='.$ogloszenie[gal].'&featuredAdDuration=0&CatId='.$ogloszenie[kategoria].'&Title='.$ogloszenie[tytul].'&Description='.$ogloszenie[opis].'&ReformattedDesc=1&PreviewToPost=false&submit=dodaj ogłoszenie >');
  28. curl_setopt($strona, CURLOPT_URL, 'http://strona_www.pl/panel.php');
  29. curl_close($strona);
  30.  
  31. ?>


W nowym skrypcie próbowałem dodawać "Submit=zaloguj się"
  1. <?php
  2. $client->post('/logowanie.php', array(
  3.   'login' => 'rysio',
  4.   'haslo' => 'cosik',
  5.   'Submit' => 'zaloguj się'
  6. ));
  7. ?>


W takiej konfiguracji dostaje odpowiedź od strony
Twoja przeglądarka nie akceptuje plików cookie. Włącz pliki cookie, jeśli chcesz się zalogować.

Jakiś pomysłquestionmark.gif

Sorry że nie podaje adresu strony ale wolałbym nie rozpisywać się o jej nazwie na lewo i prawo.
aart3k
Próbowałeś tego:

Kod
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
linx
Próbowałem,
niestety ten wpis nie załatwia do końca problemu. Fakt skrypt się wykonuje ale przy dużej ilości danych nie wszystko jest przesyłane.
erix
Poszukaj jakichś klas a'la HTTP Client, które otwierają żądanie surowo przez fsockopen" title="Zobacz w manualu PHP" target="_manual. Są skuteczne tam, gdzie cURL nie daje rady. [;
linx
  1. <?php
  2.  
  3. require_once('HttpClient.class.php');
  4. $plik_cookie = 'ciastko.txt';
  5.  
  6. $client = new HttpClient('strona_www.pl');
  7. $client->setMaxRedirects(10);
  8. $client->setDebug(true);
  9.  
  10. $client->setUserAgent('Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3a) Gecko/20021207');
  11. $client->post('/logowanie.php', array(
  12.   'login' => 'rysio',
  13.   'haslo' => 'cosik'
  14. ));
  15. // pobieranie danych cookie i zapisywanie ich do pliku
  16. foreach($client -> getHeaders() as $typ1 => $wartosc1){
  17.   if ($typ1 == 'set-cookie'){
  18.           $i=0;
  19.       foreach($wartosc1 as $typ2 => $wartosc2){
  20.           if(!$i == 0){ $zapis_cookie .= "r\n";}
  21.           $zapis_cookie .= "$wartosc2";
  22.           $i++;
  23.       }
  24.   }
  25. }
  26. //czytanie danych z pliku i przekształcanie do tablicy
  27. file_put_contents($plik_cookie, $zapis_cookie);
  28. $czytanie_z_cookie = file_get_contents($plik_cookie);
  29. $dzielenie_linie = explode("r\n", $czytanie_z_cookie);
  30.  
  31. $client->setCookies($dzielenie_linie);
  32.  
  33. $client->get('/panel.php');
  34.  
  35. echo $client->getContent();
  36.  
  37. ?>



Po wykonaniu skryptu, mieli ale dalej nie dostaje się tam gdzie chcę.
Coś robię nie tak z cookie tylko za bardzo nie wiem gdzie jest i na czym polega błąd.

Debud wyś:

-----------------------------------------------------------------------------------------------------------------
HttpClient Debug: Request
POST /logowanie.php HTTP/1.0
Host: strona_www.pl
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3a) Gecko/20021207
Accept: text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*
Accept-encoding: gzip
Accept-language: en-us
Content-Type: application/x-www-form-urlencoded
Content-Length: 42

login=rysio&haslo=cosik
-----------------------------------------------------------------------------------------------------------------
HttpClient Debug: HTTP/1.0 200 OK
-----------------------------------------------------------------------------------------------------------------
HttpClient Debug: Received Headers
Array
(
[server] => Apache-Coyote/1.1
[p3p] => CP="CAO PSA OUR"
[content-type] => text/html;charset=utf-8
[content-length] => 27042
[date] => Sun, 05 Jul 2009 19:01:21 GMT
[connection] => close
[set-cookie] => Array
(
[0] => area_preference=Vguid=2AQAAASIH1koAAM4AMGFkZWU2ZjUxLWEzYzYtNDJkNC05ZTRjLWRjOTIwM
gxNWU0ZS0xMjI0YzRhYjk5ZQzxGgHPtxjg5omMDaiN/zG7AUUt^random_marker=31; Domain=.strona_www.p; Expires=Mon, 05-Jul-2010 19:01:21 GMT; Path=/
[1] => cls-last-visit=1246820481450; Domain=strona_www.pl; Expires=Mon, 05-Jul-2010 19:01:21 GMT; Path=
)

[cache-control] => private
)
-----------------------------------------------------------------------------------------------------------------
HttpClient Debug: Persisting referer: http://strona_www.pl/logowanie.php
-----------------------------------------------------------------------------------------------------------------
HttpClient Debug: Request
GET /panel.php HTTP/1.0
Host: strona_www.p
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3a) Gecko/20021207
Accept: text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*
Accept-encoding: gzip
Accept-language: en-us
Referer: http://strona_www.pl/logowanie.php
Cookie: 0=area_preference=Vguid=2AQAAASIH1koAAM4AMGFkZWU2ZjUxLWEzYzYtNDJkNC05ZTRjLWRjOTI
MzgxNWU0ZS0xMjI0YzRhYjk5ZQzxGgHPtxjg5omMDaiN/zG7AUUt^random_marker=31; Domain=.strona_www.pl; Expires=Mon, 05-Jul-2010 19:01:21 GMT; Path=/; 1=cls-last-visit=1246820481450; Domain=strona_www.pl; Expires=Mon, 05-Jul-2010 19:01:21 GMT; Path=;
Content-Type: application/x-www-form-urlencoded
Content-Length: 42

login=rysio&haslo=cosik
-----------------------------------------------------------------------------------------------------------------
HttpClient Debug: HTTP/1.0 302 Moved Temporarily
-----------------------------------------------------------------------------------------------------------------
HttpClient Debug: Received Headers
Array
(
[server] => Apache-Coyote/1.1
[location] => http://strona_www.pl/logowanie.php?gdzie=panel
[content-length] => 0
[date] => Sun, 05 Jul 2009 19:01:23 GMT
[connection] => close
)
-----------------------------------------------------------------------------------------------------------------
HttpClient Debug: Persisting referer: http://strona_www.pl/panel.php
-----------------------------------------------------------------------------------------------------------------
HttpClient Debug: Request
GET /logowanie.php HTTP/1.0
Host: strona_www.p
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3a) Gecko/20021207
Accept: text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*
Accept-encoding: gzip
Accept-language: en-us
Referer: http://strona_www.p/panel.php
Cookie: 0=area_preference=Vguid=2AQAAASIH1koAAM4AMGFkZWU2ZjUxLWEzYzYtNDJkNC05ZTRjLWRjOTI
MzgxNWU0ZS0xMjI0YzRhYjk5ZQzxGgHPtxjg5omMDaiN/zG7AUUt^random_marker=31; Domain=.strona_www.pl; Expires=Mon, 05-Jul-2010 19:01:21 GMT; Path=/; 1=cls-last-visit=1246820481450; Domain=strona_www.pl; Expires=Mon, 05-Jul-2010 19:01:21 GMT; Path=;
Content-Type: application/x-www-form-urlencoded
Content-Length: 42

login=rysio&haslo=cosik
-----------------------------------------------------------------------------------------------------------------
HttpClient Debug: HTTP/1.0 200 OK
-----------------------------------------------------------------------------------------------------------------
HttpClient Debug: Received Headers
Array
(
[server] => Apache-Coyote/1.1
[p3p] => CP="CAO PSA OUR"
[content-type] => text/html;charset=utf-8
[content-length] => 27023
[date] => Sun, 05 Jul 2009 19:01:23 GMT
[connection] => close
[set-cookie] => Array
(
[0] => area_preference=Vguid=2AQAAASIH1koAAM4AMDQ1ZTQ3ZjYyLWY0MDYtNDAxYy04MTJiLWM0ZmRhN
FhYjllMS0xMjI0YzRhYzI4MI+oJw31yQqkF513I5fm4JX4tTYR^random_marker=23; Domain=.strona_www.pl; Expires=Mon, 05-Jul-2010 19:01:23 GMT; Path=/
[1] => cls-last-visit=1246820483718; Domain=strona_www.pl; Expires=Mon, 05-Jul-2010 19:01:23 GMT; Path=
)

)
-----------------------------------------------------------------------------------------------------------------
HttpClient Debug: Persisting referer: http://strona_www.pl/logowanie.php
-----------------------------------------------------------------------------------------------------------------

Ma ktoś jakiś pomysłquestionmark.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.