Kamil Walas

Kamil Walas Starszy Programista
PHP, Zend Certified
Engineer

Temat: POST przez CURL

Witam,

mam problem z wysłaniem danych za pomocą CURL'a. Klikając przez przeglądarkę LiveHTTPHeaders zwraca mi coś takiego:


http://s35.ogame.onet.pl/game/index.php?ajax=1&page=flottenversand&session=408df501c62c

POST /game/index.php?ajax=1&page=flottenversand&session=408df501c62c HTTP/1.1
Host: s35.ogame.onet.pl
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://s35.ogame.onet.pl/game/index.php?page=galaxy&session=408df501c62c&no_header=1
Content-Length: 125
Cookie: vc1=1245662806; prsess_171487=6d74a86a1d8d77c02087fa323ba4fbe1; login_171487=U_pl35%3AXaar%3Aaedef9083cb8ad4375c79efb0ab9f22c; PHPSESSID=15cc03d184cdfed281f4b857405cff5c
Pragma: no-cache
Cache-Control: no-cache
session=408df501c62c&order=6&galaxy=1&system=229&planet=15&planettype=1&shipcount=1&speed=10&reply=short&rndval=1245660493432
HTTP/1.x 200 OK
Date: Mon, 22 Jun 2009 08:48:09 GMT
Server: Apache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 28
Connection: close
Content-Type: text/html; charset=utf-8
----------------------------------------------------------


Moja cześć w CURL wygląda następująco:

$c = curl_init();
curl_setopt($c, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($c, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($c, CURLOPT_URL, 'http://s35.ogame.onet.pl/game/index.php?ajax=1&page=flottenversand&session='.$konfiguracja['SESJA']);
curl_setopt($c, CURLOPT_HEADER, 0);
curl_setopt($c, CURLOPT_COOKIE, $cookie);
curl_setopt($c, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12;MEGAUPLOAD 1.0");
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_POST, 1);
curl_setopt($c, CURLOPT_POSTFIELDS,
'session='.$konfiguracja['SESJA'].'&order=6&galaxy=1&system=229&planet=15&planettype=1&shipcount=1&speed=10&reply=short&rndval='.substr(str_pad(str_replace('.', '',microtime(true)), 13,'0'), 0 , 13));
curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($c, CURLOPT_REFERER, 'http://s35.ogame.onet.pl/game/index.php?page=galaxy&session='.$konfiguracja['SESJA'].'&no_header=1');
$s = curl_exec($c);


Jednak to nie działa. Dodam, że rndval to wynik new Date().getTime() a cześć substr(str_pad(str_replace('.', '',microtime(true)), 13,'0'), 0 , 13) daje w zasadzie ten sam wynik w PHP. Zwykle otwieranie linków mi działa, natomiast nie chce mi zadziałać wysłanie danych za pomocą POST.

Jakby miał ktoś pomysł co robię źle to bedę wdzięczny.Kamil Walas edytował(a) ten post dnia 22.06.09 o godzinie 13:59
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: POST przez CURL

Taki gotowiec, który od kogoś dostałem i od tego czasu używam:


function getPage ($url, $ref='', $post='')
{
$ch = curl_init();

if( !empty($post) )
{
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
else
{
curl_setopt($ch, CURLOPT_POST, 0);
}

if( empty($ref) or $ref == '' ) $ref = $url;

curl_setopt($ch, CURLOPT_REFERER, $ref);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_MAXREDIRS, 2);
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__).'/cookiefile');
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/cookiefile');
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $url);

$r = curl_exec($ch);

return $r;
}


Pod $post wstawiasz tablicę parametr=>wartość
Kamil Walas

Kamil Walas Starszy Programista
PHP, Zend Certified
Engineer

Temat: POST przez CURL

No fajnie. Tylko, ze to bez różnicy. Po prostu błąd mam gdzieś w kodzie. A konkretniej w przekładzie tego co wysyła przeglądarka na to co wysyłam CURLem. A to czy zamknę kod w jednej funkcji nie ma wpływu na działanie.

Powtórzę: chodzenie po stronach mi działa i analogiczny skrypt do logowania gdzie dane idą POSTem też mi działa. Nie działa konkretnie ten i nie wiem dlaczego.

Dzięki za odzew :)

konto usunięte

Temat: POST przez CURL

Kamil Walas:
No fajnie. Tylko, ze to bez różnicy. Po prostu błąd mam gdzieś w kodzie. A konkretniej w przekładzie tego co wysyła przeglądarka na to co wysyłam CURLem. A to czy zamknę kod w jednej funkcji nie ma wpływu na działanie.

Powtórzę: chodzenie po stronach mi działa i analogiczny skrypt do logowania gdzie dane idą POSTem też mi działa. Nie działa konkretnie ten i nie wiem dlaczego.

Dzięki za odzew :)

A gdzie obsługa cache, gzip?

Jest 1000 sposobów na zablokowanie amatorszczyzny w curl'u. Sprawdź jeszcze raz live response i emuluj DOKŁADNIE WSZYSTKO.

pozdrawiam
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: POST przez CURL

Spoko, nie zrozumiałem z czym masz problem ;)

konto usunięte

Temat: POST przez CURL

Maciej B.:
A gdzie obsługa cache, gzip?

Obstawiam, że po gzip nie blokują ;)

Skoro jest sesja, to pewnie coś w niej ląduje przy otwieraniu strony GETem, a POST idzie dopiero potem. Mogą też być identyfikatory jednorazowe w URLu, albo adres jest aktualny tylko przez X sekund.
Wyczyść ciacha, pobierz headersy jeszcze raz i zobacz co się zmieniło :)
Analizę by trzeba było zacząć od momentu kiedy pojawia się sesja, a nie na pobieraniu konkretnego pliku.



Wyślij zaproszenie do