Jacek Kowalski
2014-07-06 6d8764c5366e0b1baf66da50230dac623edb2450
data/lotto/pobierz.php
@@ -2,25 +2,34 @@
echo STAR.'Pobieranie danych...';
class lotto {
   // Zawartość strony http://lotto.pl/wyniki-gier
   protected $strona = NULL;
   
   // Lista gier.
   protected $gry = array(
      'lotto' => array(6, FALSE, 'dl'),
      'mini-lotto' => array(5, FALSE, 'el'),
      'kaskada' => array(12, FALSE, 'ka'),
      'multi-multi' => array(20, TRUE, 'mm'),
      'joker' => array(5, FALSE, 'jk')
      // nazwa => array(ilość liczb, plus?, lottoplus?, skrót)
      'lotto' => array(6, FALSE, 6, 'dl'),
      'mini-lotto' => array(5, FALSE, 0, 'el'),
      'kaskada' => array(12, FALSE, 0, 'ka'),
      'multi-multi' => array(20, TRUE, 0, 'mm'),
      'joker' => array(5, FALSE, 0, 'jk')
   );
   
   // Spróbuj pobrać stronę http://lotto.pl/wyniki-gier
   // do zmiennej $this->strona z użyciem pliku cache.
   function __construct() {
      $cache = 'lotto_cache.txt';
      
      // Sprawdź, czy da się skorzystać z pliku cache.
      if( ( !file_exists($cache) AND !is_writable(dirname($cache)) )
         OR ( file_exists($cache) AND !(is_writable($cache)) ) ) {
         // Nie, nie da się.
         $cache = '';
      }
      else
      {
         // Tak, da się.
         // Sprawdź, czy dane są aktualne.
         if(@filemtime($cache)<strtotime('yesterday 22:45') && time()<=strtotime('14:30')) {
            $recent = FALSE;
         }
@@ -34,89 +43,117 @@
         }
      }
      
      // Dane są nieaktualne, więc pobieramy je ponownie
      if($cache == '' OR !$recent) {
         $this->strona = @file_get_contents('http://lotto.pl/wyniki-gier');
         if(!$this->strona) {
            throw new Exception('Nie udało się pobrać wyników.');
         }
         
         // Można zapisać do cache'a...
         if($cache != '') {
            // ...więc zapamiętujemy arkusz.
            file_put_contents($cache, $this->strona);
         }
      }
      else
      {
         // Dane w cache są aktualne, więc załaduj je.
         $this->strona = file_get_contents($cache);
      }
   }
   
   protected function szukaj_poczatku($tresc, $poczatek = 0) {
      return strpos($this->strona, $tresc, $poczatek);
   }
   protected function szukaj_konca($tresc, $poczatek = 0) {
      $pozycja = strpos($this->strona, $tresc, $poczatek);
      if($pozycja !== FALSE) {
         $pozycja += strlen($tresc);
   // Znajduje w $gdzie ciągi $od i $do, po czym zwraca
   // treść znajdującą się pomiędzy tymi wartościami.
   protected function wytnij(&$gdzie, $od, $do, $blad = NULL, &$pozycja = NULL) {
      if($blad === NULL) {
         $blad = 'Nie znaleziono wymaganego elementu';
      }
      
      return $pozycja;
      $start = strpos($gdzie, $od, $pozycja);
      if($start === FALSE) {
         throw new Exception($blad);
      }
      $start += strlen($od);
      $stop = strpos($gdzie, $do, $start);
      if($stop === FALSE) {
         throw new Exception($blad);
      }
      if($pozycja !== NULL) {
         $pozycja = $stop + strlen($do);
      }
      return trim(substr($gdzie, $start, $stop-$start));
   }
   
   // Zwraca wynik gry (domyślnie lotto).
   function wynik($gra = 'lotto') {
      $wyniki = $this->wyniki($gra, 1);
      return $wyniki[0];
   }
   
   function wyniki($gra = 'lotto', $liczba = 100) {
   // Zwraca $liczba ostatnich wyników gry (domyślnie lotto),
   // jednak nie więcej niż 5 (tyle jest na stronie Totalizatora).
   function wyniki($gra = 'lotto', $liczba = 1000) {
      if(!isset($this->gry[$gra])) {
         throw new Exception('Podana gra liczbowa nie jest obsługiwana.');
      }
      
      $wyniki = array();
      $poczatek = $this->szukaj_konca('<div class="start-wyniki_'.$gra.'">');
      if($poczatek === FALSE) {
         throw new Exception('Nie znaleziono wyników dla gry '.$gra.' na stronie.');
      }
      $dane = $this->wytnij($this->strona, '<div class="start-wyniki_'.$gra,
         '<div class="start-wyniki_', 'Nie znaleziono na stronie wyników dla gry '.$gra);
      
      for($l = 0; $l < $liczba; $l++) {
         $poczatek = $this->szukaj_konca('<div class="wyniki_data">', $poczatek);
         if($poczatek === FALSE) {
      $poz_dane = 0;
      for($l = 1; $l <= $liczba; $l++) {
         $data = $this->wytnij($dane, '<div class="wyniki_data', '</div>',
            'Nie znaleziono '.$l.'-ej informacji o losowanu gry '.$gra, $poz_dane);
         $pozycja = 0;
         $wynik['data'] = $this->wytnij($data, '<strong>', '</strong>',
            'Nie znaleziono '.$l.'-ej daty losowania gry '.$gra, $pozycja);
         $wynik['godzina'] = $this->wytnij($data, '<strong>', '</strong>',
            'Nie znaleziono '.$l.'-ej godziny losowania gry '.$gra, $pozycja);
         try {
            $liczby = $this->wytnij($dane, '<div class="glowna_wyniki_'.$gra, "\t".'</div>',
               'Nie znaleziono na stronie '.$l.'-ch wyników dla gry '.$gra, $poz_dane);
         }
         catch(Exception $e) {
            break;
         }
         
         $wynik = array();
         $poczatek = $this->szukaj_konca('<strong>', $poczatek);
         if($poczatek === FALSE) {
            break;
         }
         $koniec = $this->szukaj_poczatku('</strong>', $poczatek);
         $wynik['data'] = substr($this->strona, $poczatek, $koniec-$poczatek);
         if($poczatek === FALSE) {
            break;
         }
         $poczatek = $this->szukaj_konca('<strong>', $poczatek);
         $koniec = $this->szukaj_poczatku('</strong>', $poczatek);
         $wynik['godzina'] = substr($this->strona, $poczatek, $koniec-$poczatek);
         $poczatek = $this->szukaj_konca('<div class="glowna_wyniki_'.$gra.'">', $poczatek);
         if($poczatek === FALSE) {
            break;
         }
         // Pobierz kolejne liczy zawarte pomiędzy <div class="wynik_NAZWAGRY"> a </div>
         $wynik['liczby'] = array();
         $pozycja = 0;
         for($i = 0; $i < $this->gry[$gra][0]; $i++) {
            $poczatek = $this->szukaj_konca('<div class="wynik_'.$gra.'">', $poczatek);
            $koniec = $this->szukaj_poczatku('</div>', $poczatek);
            $wynik['liczby'][] = substr($this->strona, $poczatek, $koniec-$poczatek);
            $wynik['liczby'][] = $this->wytnij($liczby, '<div class="wynik_'.$gra.'">',
               '</div>', NULL, $pozycja);
         }
         
         // Szukamy plusa
         if($this->gry[$gra][1]) {
            $poczatek = $this->szukaj_konca('<div class="wynik_'.$gra.'_plus">', $poczatek);
            $koniec = $this->szukaj_poczatku('</div>', $poczatek);
            $wynik['plus'] = substr($this->strona, $poczatek, $koniec-$poczatek);
            $wynik['plus'] = $this->wytnij($dane, '<div class="wynik_'.$gra.'_plus">',
               '</div>', NULL, $poz_dane);
         }
         // Szukamy lottoplusa
         if($this->gry[$gra][2] > 0) {
            try {
               $liczby = $this->wytnij($dane, '<div class="glowna_wyniki_'.$gra.'plus">', "\t".'</div>',
                  'Nie znaleziono na stronie '.$l.'-ch wyników dla gry '.$gra.'plus', $poz_dane);
            }
            catch(Exception $e) {
               continue;
            }
            $pozycja = 0;
            $wynik['plus'] = array();
            for($i = 0; $i < $this->gry[$gra][2]; $i++) {
               $wynik['plus'][] = $this->wytnij($liczby, '<div class="wynik_'.$gra.'plus">',
                  '</div>', 'Nie znaleziono wyników losowania '.$gra.'plus', $pozycja);
            }
         }
         
         $wyniki[] = $wynik;
@@ -131,7 +168,13 @@
         if($gra == 'multi-multi') {
            $wyniki = $this->wyniki($gra, 2);
            $wynik = $wyniki[0];
            $skrot = $data[2].substr($wynik['godzina'], 0, 2);
            $godzina = substr($wynik['godzina'], 0, 2);
            if($godzina == '21') {
               $godzina = '22';
            }
            $skrot = $data[3].$godzina;
            $last_data = @file_get_contents('./last_'.$skrot.'.txt');
            if($last_data != $wynik['data']) {
               $output = array();
@@ -148,7 +191,13 @@
            }
            
            $wynik = $wyniki[1];
            $skrot = $data[2].substr($wynik['godzina'], 0, 2);
            $godzina = substr($wynik['godzina'], 0, 2);
            if($godzina == '21') {
               $godzina = '22';
            }
            $skrot = $data[3].$godzina;
            $last_data = @file_get_contents('./last_'.$skrot.'.txt');
            if($last_data != $wynik['data']) {
               $output = array();
@@ -167,7 +216,8 @@
         else
         {
            $wynik = $this->wynik($gra);
            $skrot = $data[2];
            $skrot = $data[3];
            $last_data = @file_get_contents('./last_'.$skrot.'.txt');
            if($last_data != $wynik['data']) {
               $output = array();
@@ -178,6 +228,9 @@
               if($data[1]) {
                  $output['plus'] = $wynik['plus'];
               }
               if(($data[2] > 0) && isset($wynik['plus'])) {
                  $output['plus'] = $wynik['plus'];
               }
               file_put_contents('./last_'.$skrot.'.txt', $output['data']);
               file_put_contents('./'.$skrot.'.txt', serialize($output));
               file_put_contents('./archiwum/'.$skrot.'_'.date('j.m.Y', strtotime($output['data'])).'.txt', serialize($output));