dj.drezyna Napisano Wrzesień 29, 2012 Zgłoś Share Napisano Wrzesień 29, 2012 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 More sharing options...
Stelma Napisano Październik 2, 2012 Zgłoś Share Napisano Październik 2, 2012 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 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 More sharing options...
dj.drezyna Napisano Październik 2, 2012 Autor Zgłoś Share Napisano Październik 2, 2012 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 More sharing options...
Stelma Napisano Październik 2, 2012 Zgłoś Share Napisano Październik 2, 2012 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 More sharing options...
dj.drezyna Napisano Październik 7, 2012 Autor Zgłoś Share Napisano Październik 7, 2012 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 More sharing options...
dj.drezyna Napisano Październik 7, 2012 Autor Zgłoś Share Napisano Październik 7, 2012 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 More sharing options...
Stelma Napisano Październik 8, 2012 Zgłoś Share Napisano Październik 8, 2012 Daj link do formularza który próbujesz wypełniać. Zobaczymy co da się zrobić. Te {FNAMEL} to nie wiedzieć czemu nasze forum dodało. A ja napisałem 8 linijek kodu bo klase już wcześniej miałem ;p Link do komentarza Udostępnij na innych stronach More sharing options...
dj.drezyna Napisano Październik 8, 2012 Autor Zgłoś Share Napisano Październik 8, 2012 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 More sharing options...
xevil21 Napisano Październik 8, 2012 Zgłoś Share Napisano Październik 8, 2012 Witam, ja również zastanawiałem się, co to jest "{FNAMEL}" Pozdrawiam! Link do komentarza Udostępnij na innych stronach More sharing options...
dj.drezyna Napisano Październik 10, 2012 Autor Zgłoś Share Napisano Październik 10, 2012 Podejrzewam, że to skrót od Functions Names List służącej zapewne do wyróżniania funkcji w kodzie. Ale czemu się pojawia ten skrót to chyba tylko do tego, żeby przekopiowanego tekstu nie można było skorzystać od razu :-P Galeria przyrodnicza http://fotokrajobrazy.warmia.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.