Skocz do zawartości

[php] cURL Przerywanie i wznawianie skryptu


dj.drezyna

Polecane posty

Niedawno na mojej ulubionej stronie zamontowano to co i ja u siebie stosuję. Otóż chodzi o obrazki typu Captacha. Chciałbym się zatem spytać czy jest możliwe przy użyciu cURL przerwanie skryptu na podanie jednej danej i dalej kontynuowanie? Chodzi po prostu o to by skrypt pobrał obrazek, ja go odczytał wpisując kod i później przekazał ten kod formularzowi, który powinien już nie krzyczeć że kod jest błędny. Czy to jest w ogóle możliwe? A jeśli nie to czy mój tok działania, czyli pobranie obrazka wpisanie co na nim jest i pobranie danych nim zabezpieczonym są w ogóle możliwe bez wchodzenia przez przeglądarkę? Bo czy to przypadkiem nie jest tak z typ, że w chwili skryptu php zachowuje się jak przeglądarka. Jak zatem sprawić by w następnym wykonaniu skrypt pamiętał co było wprowadzone wcześniej? Może do tego celu być użyta zmienna sesyjna. A jeżeli tak to w jaki sposób ją używać? Trzeba nie używać polecenia curl_close();?

 

Mam nadzieję że ktoś zrozumiał o co mi chodzi i pozwoli mi albo dalej się z tym męczyć albo po prostu odpuścić bo jest to nie wykonalne.

Bardzo dziękuję za pomoc, pozdrawiam,

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

Jeżeli to captcha google podobna. To przy każdym wejściu na stronę zapamiętywany jest kod w zmiennej sesyjnej po stronie serwera i stworzony obrazek. Drugorazowe wejście na tę stronę nadpisuje tą zmienną itd.

 

Powinno wystarczyć coś takiego.

 

1. Wchodzisz na strone gdzie jest captcha

2. Odnajdujesz link do captchy odwiedzasz ją ponownie w celu pobrania obrazka

3. Zapisujesz gdzieś obrazek

4. Gdzieś w bazie danych zapisujesz informacje że taki, a taki url ma w chwili obecnej taki, a taki obrazek i serwujesz go sobie na jakiejś stronie do zarządzania.

5. Wysyłasz dane na to co wskazuje formularz.

6. Idziesz na pifo z kumplami :)

 

Oczywiście nie muszę mówić że musisz używać ciasteczek w celu identyfikacji się z serwerem. Poniżej taki pseudo kod :P

 

Plik pobierający

$source = $browser->getPage( $url );
$catpchaLink = $browser->getCaptchaLink( $source );
$captchaImage = $browser->saveImage( $captchaLink );
$browser->saveToDatabase( $url, $captchaImage );

 

Plik który sobie serwujesz w celu odczytania captch'y

$data = $db->getFromUserCode( $url );
showData( $data );

 

Gdzieś w cronie w celu wysłania wszystkie

$browser->sendData( $url, $options );

Link do komentarza
Udostępnij na innych stronach

No tak ale ten obrazek zawsze ma taki sam adres. Ponieważ jak mówisz na początku wnętrze obrazka jest zapisywane w sesji to url jego jest ciągle taki sam ('www.serwer.pl/wer.png'). No i ciekawi mnie jak korzystać z ciasteczek przez cURL, bo jak mniemam chodzi tu o to by serwer z tym obrazkiem wiedział że jest sesja. Czy tak? Więc bardzo prosiłbym o jakiś kod ilustrujący jak w kilku oddzielnie wykonywanych skryptach korzystać jak by z tej samej sesji w cURL.

 

Dzięki z odpowiedź ale jak widać jeszcze dużo muszę się nauczyć przy tym cURL. Więc nie zrażajcie się tym że jeszcze nie wszystko ogarniam.

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

Napisałem nie dawno kawałek kodu który umożliwia to co chcesz zrobić. Do demonstacji wykorzystam metode generowania obrazków o których mówiłem w #2 poście.

 

Link:

http://joserodriguez.cl/cool-php-captcha/

 

Plik który pobiera obrazek

<?php

#Załadowanie pliku z klasą imitującą przeglądarke
include('./class/Browser.php');

#Utworzenie instancji klasy Browser i podanie scieżki do pliku z ciasteczkami
$browser = new Browser( 'C:\xampp\htdocs\cookie.txt' );

#Pobieranie obrazka i zapisywanie na dysk
$browser->download('http://joserodriguez.cl/cool-php-captcha/captcha.php', time().'.jpg');

 

Plik który wysyła treść obrazka (tutaj była to metoda get więc doklejam tylko w url)

<?php

#Załadowanie pliku z klasą imitującą przeglądarke
include('./class/Browser.php');

#Utworzenie instancji klasy Browser i podanie scieżki do pliku z ciasteczkami
$browser = new Browser( 'C:\xampp\htdocs\cookie.txt', false );

#Za tą zmienną wpisz kod z obrazka
$code = 'aphides';

#Pobranie strony w celu wysłania treści obrazka
$source = $browser->getPage('http://joserodriguez.cl/cool-php-captcha/?captcha='.$code);

#Wyświetlenie tego co zwróci nam serwis
echo $source;

 

 

Właściwa klasa na której wszystko się opiera

<?php

class BrowserException extends Exception{}
class CookieBrowserException extends BrowserException{}
class TimeOutException extends BrowserException{}
class WriteFileException extends BrowserException{}

class Browser
{
   /**
    *    Domyślny agent pod którym klasa będzie się identyfikowała
    */
   protected $_userAgent = 'Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3';

   protected $_cookie = null;

   protected $_curl = null;

   public function __construct( $cookie = true, $newCookie = true )
   {
  	 $this -> _curl = curl_init();

  	 if( $cookie )
  	 {
  		 #Jeżeli ustawiono przeglądarke z ciasteczkami jednak nie podano scieżki to wywal wyjątek
  		 $this->setCookieFile($cookie, $newCookie);

  		 #Ustawienie ciasteczek
  		 curl_setopt($this->_curl, CURLOPT_COOKIEJAR, $this->_cookie);
  		 curl_setopt($this->_curl, CURLOPT_COOKIEFILE, $this->_cookie);
  	 }
   }

   /**
    *    Zwraca kod html strony
    * @params string $url Adres strony do pobrania
    * @params string $callBackHeader Funkcja do której będą trafiać nagłówki strony, domyślnie brak
    * @params int $timeout Czas po którym zostanie zawieszone łączenie
    * @params boolean $force Wskazuje czy funkcja będzie próbowała pobrać stronę aż do skutku
    * @return string
    */
   public function getPage( $url, $callBackHeader = null, $timeout = 10, $force = false )
   {
  	 $this -> setStandardOption($url);

  	 curl_setopt($this->_curl, CURLOPT_CONNECTTIMEOUT, $timeout);
  	 curl_setopt($this->_curl, CURLOPT_TIMEOUT, $timeout);

  	 if( !is_null($callBackHeader) )
  		 curl_setopt($this->_curl, CURLOPT_HEADERFUNCTION, @$callBackHeader);

  	 $result = false;
  	 while( $result === FALSE )
  	 {
  		 $result = curl_exec($this -> _curl);
  		 if( $result === FALSE && !$force )
  			 throw new TimeOutException( 'Adress "'.$url.'" is timeout' );

  	 }

  	 return $result;
   }

   /**
    *    Wysyła do strony żądanie postem z parametrami z parametrów funkcji i zwraca zwróconą zawartość
    */
   public function post( $url, $params, $callBackHeader = null, $timeout = 10, $force = false )
   {   	 
  	 curl_setopt($this->_curl, CURLOPT_POSTFIELDS, http_build_query($params));
  	 curl_setopt($this->_curl, CURLOPT_POST, 1);

  	 return $this->getPage($url, $callBackHeader, $timeout, $force);
   }

   /**
    *     Pobiera i zapisuje plik na dysku twardym
    * @param unknown_type $url
    */
   public function download( $url, $filename, $callBackHeader = null, $timeout = 10, $force = false )
   {
  	 if( file_exists($filename) )
  		 throw new WriteFileException('File "'.$filename.'" is exists');

  	 curl_setopt($this->_curl, CURLOPT_BINARYTRANSFER,1);
  	 $source = $this->getPage( $url, $callBackHeader, $timeout, $force );

  	 if( $source !== FALSE )
  	 {
  		 $fp = fopen($filename, 'x');
  		 fwrite($fp, $source);
  		 fclose($fp);
  	 }

  	 return true;
   }

   /**
    *    Ustawia standardowe opcje które były by ustawiane przy każdym pobieraniu
    */
   protected function setStandardOption( $url )
   {
  	 curl_setopt($this->_curl, CURLOPT_URL, $url);
  	 curl_setopt($this->_curl, CURLOPT_FOLLOWLOCATION, 1);  
  	 curl_setopt($this->_curl, CURLOPT_RETURNTRANSFER, 1);
  	 curl_setopt($this->_curl, CURLOPT_USERAGENT, $this->_userAgent);
   }

   /**
    *    Ustawia nowego agenta dla przeglądarki
    */
   public function setUserAgent( $options )
   {
  	 $this->userAgent = $options;
   }

   /**
    *    Ustawienie scieżki do pliku z ciasteczkami
    */
   public function setCookieFile( $file, $newCookie = true )
   {
  	 if( file_exists($file) && $newCookie )
  		 unlink($file);

  	 $this->_cookie = $file;
   }

}

 

 

W razie problemów to pisz

Link do komentarza
Udostępnij na innych stronach

Normalnie mowę mi odjęło. Dokładnie tak sobie to wyobrażałem (sposób jak trzeba pokazać rozwiązanie) Dziękuję za trud, który włożyłeś w napisanie powyższego posta. A ja niestety muszę się źle zachować, bo niestety tak bywa, że nie mam czasu tego sprawdzić. Ale BARDZO DZIĘKUJĘ Czas się kiedyś znajdzie, a to co napisałeś to na pewno działa i za to dziękuję bardzo, bardzo. A nawet jak nie to za poświęcenie serdecznie dziękuję.

 

pozdrawiam,

dj.drezyna

 

P.S. Co to jest {FNAMEL} ???

 

P.S. II Jak zobaczyłem tyle kodu to rzuciłem wszystko i zacząłem sprawdzać i...No nie! Dzięks ogromy! Działa i to zajedwabiście! Nie wiem co powiedzieć, szok, a jednak można. Słowa nie opiszą mojej radości! Dziękuję z całego serca!

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

A co zrobić dalej?

Bo jest tak że biorę obrazek rozpoznaję i ok. wpisuję i wyświetla tą stronę. Ale mój problem polega na tym że ta strona co się wyświetla po zapisaniu obrazka i weryfikacji kodu coś jeszcze porabia bo kontynuacja, czyli kolejna podstrona korzystająca ze zweryfikowanego obrazka na kształt:

$browser2 = new Browser('index/cookie.txt',false);
 $tekst = $browser2->getPage('http://a.pl/poweryfikacji.php');

// lub inaczej bez używania nowego egzemplarza
$tekst = $browser->getPage('http://a.pl/poweryfikacji.php');

...dalej twierdzi, że nic się nie stało, czyli nie było weryfikacji i tak jak by kod był błedny.

=================================

Co zatem muszę zrobić by kolejne strony korzystały z pomyślnej weryfikacji (tej po odczytaniu obrazka), czyli żeby była kontynuacja jakby tu powiedzieć sesji?

=================================

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

Sprawa całkowicie rozwiązana. Pełne podziękowania dla Stelmy! Dziękuję bardzo.

 

=======================

Pod koniec wątku miałem pewne problemy jednak nie wynikały one z błędu klasy Browser lecz, tu wstyd się przyznać, błędnych względnych ścieżek do... pliku z ciastkami.

 

Szacun Stelma!

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...