From 41c5d21ff614abede5252fd31ec61259e3589f6c Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Mon, 25 Jun 2012 18:17:04 +0000
Subject: [PATCH] Aktualizacja skryptu pobierającego wyniki gier lotto.

---
 data/lotto/pobierz.php |  325 +++++++++++++++++++++++------------------------------
 1 files changed, 141 insertions(+), 184 deletions(-)

diff --git a/data/lotto/pobierz.php b/data/lotto/pobierz.php
index 2260d8b..cf8aa83 100644
--- a/data/lotto/pobierz.php
+++ b/data/lotto/pobierz.php
@@ -2,190 +2,147 @@
 echo STAR.'Pobieranie danych...';
 
 class lotto {
-	protected $strona = NULL;
-	
-	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')
-	);
-	
-	function __construct() {
-		$cache = 'lotto_cache.txt';
-		
-		if( ( !file_exists($cache) AND !is_writable(dirname($cache)) )
-			OR ( file_exists($cache) AND !(is_writable($cache)) ) ) {
-			$cache = '';
-		}
-		else
-		{
-			if(@filemtime($cache)<strtotime('yesterday 22:45') && time()<=strtotime('14:30')) {
-				$recent = FALSE;
-			}
-			elseif( ( time()>=strtotime('14:30') && @filemtime($cache)<strtotime('14:30') )
-				OR ( time()>=strtotime('22:45') && @filemtime($cache)<strtotime('22:45') ) ) {
-				$recent = FALSE;
-			}
-			else
-			{
-				$recent = TRUE;
-			}
-		}
-		
-		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.');
-			}
-			
-			if($cache != '') {
-				file_put_contents($cache, $this->strona);
-			}
-		}
-		else
-		{
-			$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);
-		}
-		
-		return $pozycja;
-	}
-	
-	function wynik($gra = 'lotto') {
-		$wyniki = $this->wyniki($gra, 1);
-		return $wyniki[0];
-	}
-	
-	function wyniki($gra = 'lotto', $liczba = 100) {
-		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.');
-		}
-		
-		for($l = 0; $l < $liczba; $l++) {
-			$poczatek = $this->szukaj_konca('<div class="wyniki_data">', $poczatek);
-			if($poczatek === FALSE) {
-				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;
-			}
-			
-			$wynik['liczby'] = array();
-			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);
-			}
-			
-			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);
-			}
-			
-			$wyniki[] = $wynik;
-		}
-		
-		return $wyniki;
-	}
-	
-	function pobierz() {
-		foreach($this->gry as $gra => $data) {
-			echo STAR.'Wyniki gry '.$gra.'...';
-			if($gra == 'multi-multi') {
-				$wyniki = $this->wyniki($gra, 2);
-				$wynik = $wyniki[0];
-				$skrot = $data[2].substr($wynik['godzina'], 0, 2);
-				$last_data = @file_get_contents('./last_'.$skrot.'.txt');
-				if($last_data != $wynik['data']) {
-					$output = array();
-					$output['data'] = $wynik['data'];
-					for($i = 0; $i < $data[0]; $i++) {
-						$output[$i+1] = $wynik['liczby'][$i];
-					}
-					if($data[1]) {
-						$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));
-				}
-				
-				$wynik = $wyniki[1];
-				$skrot = $data[2].substr($wynik['godzina'], 0, 2);
-				$last_data = @file_get_contents('./last_'.$skrot.'.txt');
-				if($last_data != $wynik['data']) {
-					$output = array();
-					$output['data'] = $wynik['data'];
-					for($i = 0; $i < $data[0]; $i++) {
-						$output[$i+1] = $wynik['liczby'][$i];
-					}
-					if($data[1]) {
-						$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));
-				}
-			}
-			else
-			{
-				$wynik = $this->wynik($gra);
-				$skrot = $data[2];
-				$last_data = @file_get_contents('./last_'.$skrot.'.txt');
-				if($last_data != $wynik['data']) {
-					$output = array();
-					$output['data'] = $wynik['data'];
-					for($i = 0; $i < $data[0]; $i++) {
-						$output[$i+1] = $wynik['liczby'][$i];
-					}
-					if($data[1]) {
-						$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));
-				}
-			}
-			echo OK;
-		}
-	}
+    // Zawartość strony http://lotto.pl/wyniki-gier
+    protected $strona = NULL;
+    
+    // Lista gier.
+    protected $gry = array(
+        // nazwa => array(ilość liczb, plus?)
+        'lotto' => array(6, FALSE),
+        'mini-lotto' => array(5, FALSE),
+        'kaskada' => array(12, FALSE),
+        'multi-multi' => array(20, TRUE),
+        'joker' => array(5, FALSE)
+    );
+    
+    // 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;
+            }
+            elseif( ( time()>=strtotime('14:30') && @filemtime($cache)<strtotime('14:30') )
+                OR ( time()>=strtotime('22:45') && @filemtime($cache)<strtotime('22:45') ) ) {
+                $recent = FALSE;
+            }
+            else
+            {
+                $recent = TRUE;
+            }
+        }
+        
+        // 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);
+        }
+    }
+    
+    // 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';
+        }
+        
+        $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];
+    }
+    
+    // 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();
+        $dane = $this->wytnij($this->strona, '<div class="start-wyniki_'.$gra.'">',
+            '<div class="start-wyniki_', 'Nie znaleziono na stronie wyników dla gry '.$gra);
+        
+        $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;
+            }
+            
+            // 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++) {
+                $wynik['liczby'][] = $this->wytnij($liczby, '<div class="wynik_'.$gra.'">',
+                    '</div>', NULL, $pozycja);
+            }
+            
+            // Szukamy plusa
+            if($this->gry[$gra][1]) {
+                $wynik['plus'] = $this->wytnij($dane, '<div class="wynik_'.$gra.'_plus">',
+                    '</div>', NULL, $poz_dane);
+            }
+            
+            $wyniki[] = $wynik;
+        }
+        
+        return $wyniki;
+    }
 }
 
 $lotto = new lotto();

--
Gitblit v1.9.1