Biblioteka cURL a autoryzacja

0

Witam,
Ostatnio rozpoczynałem zabawę z biblioteką cURL i napotkałem na problem. Opisze na czym polega mój problem napisałem o to taki kodzik:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'adres do strony logowania ');
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'KatID=0&login_attempt=1&id=info&swww_user=1234&swww_method=4&swww_pass=passwd');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$wynik = curl_exec($ch);
curl_close($ch);

I teraz tak wszystko fajnie mnie loguje na stronę którą chcę ale po zalogowaniu chcę żeby nastąpiło "przekierowanie" na podstronę http://domena.pl/index.php?KatID=0&typ=acc&id=wypozyczenia i z tej strony pobrało mi dane. Pobierać dane potrafię wiec wiem jak dalej zrobić. Proszę o pomoc

0

Ciasteczka: http://icfun.blogspot.com/2009/04/php-how-to-use-cookie-jar-with-curl.html

A potem po prostu sobie zrób drugiego CURLa pod zadany przez Ciebie adres.

0
dzek69 napisał(a):

Ciasteczka: http://icfun.blogspot.com/2009/04/php-how-to-use-cookie-jar-with-curl.html

A potem po prostu sobie zrób drugiego CURLa pod zadany przez Ciebie adres.

na podanej stronie mam takie coś:

$cookie_file = "/tmp/cookie/cookie1.txt";

ale skąd wziąć mam te źródło do pliku txt ?? łączę się przez localhost.

0

To jest dowolna ścieżka, która będzie przechowywać plik z ciasteczkami, które wyśle do Twojego skryptu strona adres do strony logowania, a które są potrzebne, żeby pomiędzy dwoma żądaniami wysyłanymi przez cURL zapamiętać Twoje logowanie.

0
dzek69 napisał(a):

To jest dowolna ścieżka, która będzie przechowywać plik z ciasteczkami, które wyśle do Twojego skryptu strona adres do strony logowania, a które są potrzebne, żeby pomiędzy dwoma żądaniami wysyłanymi przez cURL zapamiętać Twoje logowanie.

Ok to teraz mój kod wygląda tak:

$cookie = "_tmp/cookie/cookie.txt";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://domena.pl/index.php?typ=acc');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'KatID=0&login_attempt=1&id=info&swww_user=1234&swww_method=4&swww_pass=passwd');
curl_setopt($ch, CURLOPT_REFERER, 'http://domena.pl/index.php?typ=acc');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

// Na podstronę mnie interesującą //
curl_exec($ch);
curl_setopt($ch, CURLOPT_URL, 'http://domena.pl/index.php?KatID=0&typ=acc&id=wypozyczenia'');
$wynik = curl_exec($ch);
curl_close($ch);

Tak to powinno wyglądać czy jakoś inaczej ??

1

Ja zwykłem tworzyć każdorazowo nowy uchyt do cURL, czyli będziesz musiał np. powtórzyć COOKIEJAR itd, ale POST-a już chyba nie potrzebujesz?

cookie = "_tmp/cookie/cookie.txt"; // jesteś pewien, że to poprawna ścieżka do zapisu? jak tak to w porządku
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://domena.pl/index.php?typ=acc');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'KatID=0&login_attempt=1&id=info&swww_user=1234&swww_method=4&swww_pass=passwd');
curl_setopt($ch, CURLOPT_REFERER, 'http://domena.pl/index.php?typ=acc');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);

// Na podstronę mnie interesującą //
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://domena.pl/index.php?KatID=0&typ=acc&id=wypozyczenia');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_REFERER, 'http://domena.pl/index.php?typ=acc');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);

$wynik = curl_exec($ch);
curl_close($ch);
0

coś nie działa: 1 plik cookie.txt jest pusty i wyświetla się strona logowania

0

Co oznacza ta jedynka?
Pierwszy/jeden? Plik cookie ma być ten sam dla wszystkich wywołań.

0
dzek69 napisał(a):

Co oznacza ta jedynka?
Pierwszy/jeden? Plik cookie ma być ten sam dla wszystkich wywołań.

Sorry miało być tak:
coś nie działa:

  • plik cookie.txt jest pusty
  • wyświetla się strona logowania

Nawet jak dam bez drugiego źródła to normalnie loguje ale nadal jest cookie.txt jest pusty adres do pliku wydaje mi się dobry.

0
$cookie = "_tmp/cookie/cookie.txt";
file_put_contents($cookie, 'test');
die('to tylko test');

wrzuć coś takiego (w tym samym pliku gdzie masz ten kod teraz) i sprawdź czy zawartość się zmieniła.

Zawsze też jak nie ogarniasz jak wygląda current working directory przy wywoływaniu php (jest to zawsze folder pliku który wywołujesz w przeglądarce, w includowanych plikach także!), to po prostu zrób $cookie='./cookie.txt' - zadziała na pewno.

0

Tak zawartość się zmieniła się ale nadal dalsza część kodu nie działa :(

0

I na pewno jesteś poprawnie zalogowany po pierwszym wywołaniu?

0
dzek69 napisał(a):

I na pewno jesteś poprawnie zalogowany po pierwszym wywołaniu?

tak dałem na końcu echo widzę stronę główną co się pojawia zawsze po zalogowaniu natomiast jak klikam na inne pozycje menu to pokazuje mi się strona do logowania.

wgrałem sobie dodatek Live header i tam w nagłówkach podczas logowania normalnie do serwisu jest miedzy innymi :
Cookie: SOWWWA_SID=xxxxxxxxxxxxxxxxxxxxxxx...
to może dlatego coś nie zapisuje nie ma standardowo PHPSESSID

OK działa zapisywanie :) musiałem dać takie coś :

$cookie_file = dirname(__FILE__) . '/cookie.txt';

I już wszystko działa :) uzyskuję to co chcę :) Mam jeszcze jedno pytanie odnośnie użyteczności otóż na stronę będą się logowali różni użytkownicy będzie ich sporo to chyba nie za bardzo wrzucać wszystko do jednego cookie.txt tylko najlepiej dla każdego użytkownika dać inny plik np. nick_cookie.txt co byś proponował ??

0

Co ty poprzez swoją stronę chcesz udostępniać na stałe innym jakieś działania na innej stronie (nawet podgląd)? Jeżeli strona, z której dane pobierasz nie jest Twoja, to za takie działania możesz zarobić bana (zależy czy monitorują takie rzeczy).
Jeżeli hasło na stałe masz wpisane w swój skrypt - to nie ma sensu, żeby kazdy miał inny plik cookie - bo do tych plików cookie nikt z Twoich użytkowników nie ma wglądu (TEORETYCZNIE, w praktyce z takim kodem wystarczy wpisać "cookie.txt" w pasku przeglądarki - powinieneś to zmienić i pliki cookie trzymać w folderze zablokowanym przed dostępem z przeglądarek (poprzez wpisanie deny from all w .htaccess)

0

Ok wielkie dzięki za pomoc. Zrobię to tylko dla siebie żeby bana czasem nie dostać. A teraz mam takie jedno pytanko. Czy istnieje jakaś obsługa błędu czyli np. podam złe dane do logowania i chciałbym że wyszło echo 'Podałeś złe dane do logowania'; i rzecz jasna nie wykonywała dalszej części skryptu to jest pobierania danych z tamtej strony czy coś takiego wiem że musi być jakiś if ale co mam sprawdzić w tym warunku ?? jakaś funkcja w curl zwraca true albo fals przy połączeniu ??

0

pobierasz dane z curl_exec i przez preg_match albo strpos szukasz jakiejś frazy, to tyczy się danych z statusem 200 do 404 itd istnieje obsługa błędów

0
proqix napisał(a):

pobierasz dane z curl_exec i przez preg_match albo strpos szukasz jakiejś frazy, to tyczy się danych z statusem 200 do 404 itd istnieje obsługa błędów

Ok ale jakiej frazy mam szukać?? myślałem że coś typu:

if(curl_exec($ch) == false)
{
     echo 'Podano złe hasło';
}

wystarczy. rozumiem ze to trzeba sprawdzić jeszcze przed curl_close($ch); czy juz po zakończeniu połączenia ??

0

człowieku ty podstaw PHP nie znasz nie wspominając o obiektach i bibliotekach

$ch = curl_init(); <- tworzy obiekt i przypisuje do zmiennej $ch
$data = curl_exec($ch); <- pobiera dane ze strony i kopiuje do stringa o nazwie $data
curl_close($ch); <- zwalnia pamięć dla obiektu $ch (w woli ścisłości $ch to handle do obiektu który stworzył curl_init)
i teraz możesz manipulować na danych w $data

if(strpos($data,'dupa cycki'){
echo 'zdarzenie dupa cycki';
}else{
//kolejne kroki
}
powiedzmy że podałeś złe dane na stronie logowania to w $data masz komunikat dupa cycki, przepuszcza to przez ten kod powyżej jak znalazł frazę to wywala komunikat jak podałeś poprawne dane to tej frazy nie ma i kod leci dalej.

<?php

$dumping=true;
$ch_count=0;
$ch = curl_init();
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.log');
curl_setopt($ch,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.log');
if(isset($_SERVER['HTTP_USER_AGENT'])) curl_setopt($ch,CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); else curl_setopt($ch,CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0');

function HTTPGet($url){
 global $ch, $dumping, $ch_count;
 curl_setopt($ch,CURLOPT_POST, 0);
 curl_setopt($ch, CURLOPT_URL, $url);  
 if($dumping){
  $f=fopen('dump_'.$ch_count.'.txt',"w");
  fputs($f,$res);
  fclose($f);
  $ch_count++;
 } 
 return $res;
}

function HTTPPost($url,$data){
 global $ch, $dumping, $ch_count;
 curl_setopt($ch,CURLOPT_POST, 1); 
 curl_setopt($ch,CURLOPT_POSTFIELDS, $data);
 curl_setopt($ch, CURLOPT_URL, $url);
 $res=curl_exec($ch);
 if($dumping){
  $f=fopen('dump_'.$ch_count.'.txt',"w");
  fputs($f,$res);
  fclose($f);
  $ch_count++;
 } 
 return $res; 
}




curl_close($ch);
?>

To kod z mojego bota więc 100% działa, jak $dumping ustawisz na true to robi zżuty pobranych danych, jak chcesz pobrać coś getem do dajesz

HTTPGet('http://domena.pl/');
do POST masz HTTPPost('url','dane');
więc miałbyś coś takiego
$data1=HTTPPost('http://domena.pl/index.php?typ=acc','KatID=0&login_attempt=1&id=info&swww_user=1234&swww_method=4&swww_pass=passwd');//pobiera dane i przypisuje do zmiennej $data1
i sprawdzasz czy się zalogował poprawnie
$data2=HTTPGet('http://domena.pl/index.php?KatID=0&typ=acc&id=wypozyczenia'); //pobiera dane i przypisuje do zmiennej $data2
echo $data2; // wyświetla dane z zmiennej $data2

1 użytkowników online, w tym zalogowanych: 0, gości: 1