Jacek Kowalski
2014-11-01 86e3eb332bbc3f0d1d33fe87dd5e6015bc108bf3
commit | author | age
8bd4d9 1 <?php
JK 2 echo STAR.'Pobieranie danych...';
3
4 class lotto {
50d2eb 5     // Zawartość strony http://lotto.pl/wyniki-gier
86e3eb 6     // jako obiekt DOMDocument
50d2eb 7     protected $strona = NULL;
86e3eb 8     // Powiązany DOMXPath
JK 9     protected $xpath = NULL;
10     
11     // Specjalne zachowania dla gier
12     const NONE = 0;
13     const PLUS = 1;
14     const LOTTOPLUS = 2;
15     const EKSTRA = 3;
50d2eb 16     
JK 17     // Lista gier.
18     protected $gry = array(
86e3eb 19         // nazwa
JK 20         'lotto', 'mini-lotto',
21         'kaskada', 'multi-multi',
22         'joker', 'ekstra-pensja'
50d2eb 23     );
JK 24     
25     // Spróbuj pobrać stronę http://lotto.pl/wyniki-gier
26     // do zmiennej $this->strona z użyciem pliku cache.
27     function __construct() {
28         $cache = 'lotto_cache.txt';
29         
30         // Sprawdź, czy da się skorzystać z pliku cache.
31         if( ( !file_exists($cache) AND !is_writable(dirname($cache)) )
32             OR ( file_exists($cache) AND !(is_writable($cache)) ) ) {
33             // Nie, nie da się.
34             $cache = '';
35         }
36         else
37         {
38             // Tak, da się.
39             // Sprawdź, czy dane są aktualne.
40             if(@filemtime($cache)<strtotime('yesterday 22:45') && time()<=strtotime('14:30')) {
41                 $recent = FALSE;
42             }
43             elseif( ( time()>=strtotime('14:30') && @filemtime($cache)<strtotime('14:30') )
44                 OR ( time()>=strtotime('22:45') && @filemtime($cache)<strtotime('22:45') ) ) {
45                 $recent = FALSE;
46             }
47             else
48             {
49                 $recent = TRUE;
50             }
51         }
52         
86e3eb 53         $strona = '';
JK 54         $this->strona = new DOMDocument();
55         
50d2eb 56         if($cache == '' OR !$recent) {
86e3eb 57             // Dane są nieaktualne, więc pobieramy je ponownie
JK 58             $strona = @file_get_contents('http://lotto.pl/wyniki-gier');
59             if(!$strona) {
50d2eb 60                 throw new Exception('Nie udało się pobrać wyników.');
JK 61             }
62             
63             // Można zapisać do cache'a...
64             if($cache != '') {
65                 // ...więc zapamiętujemy arkusz.
86e3eb 66                 file_put_contents($cache, $strona);
50d2eb 67             }
86e3eb 68             
JK 69             @$this->strona->loadHtml($strona);
50d2eb 70         }
JK 71         else
72         {
73             // Dane w cache są aktualne, więc załaduj je.
86e3eb 74             @$this->strona->loadHtmlFile($cache);
50d2eb 75         }
86e3eb 76         
JK 77         $this->xpath = new DOMXPath($this->strona);
50d2eb 78     }
JK 79     
86e3eb 80     // Znajduje odpowiedni element w pliku HTML lub zwraca błąd.
JK 81     protected function wytnij($zapytanie, $gdzie = NULL, $blad = 'Brak danych') {
82         $rezultat = $this->xpath->query($zapytanie, $gdzie);
83         if(!$rezultat OR $rezultat->length <= 0) {
50d2eb 84             throw new Exception($blad);
JK 85         }
86e3eb 86         return $rezultat;
50d2eb 87     }
JK 88     
89     // Zwraca wynik gry (domyślnie lotto).
90     function wynik($gra = 'lotto') {
91         $wyniki = $this->wyniki($gra, 1);
86e3eb 92         if(!isset($wyniki[0])) {
JK 93             throw new Exception('Brak wyników dla gry.');
94         }
50d2eb 95         return $wyniki[0];
JK 96     }
97     
98     // Zwraca $liczba ostatnich wyników gry (domyślnie lotto),
99     // jednak nie więcej niż 5 (tyle jest na stronie Totalizatora).
86e3eb 100     function wyniki($gra = 'lotto', $zwroc = 1000) {
JK 101         if(!in_array($gra, $this->gry)) {
50d2eb 102             throw new Exception('Podana gra liczbowa nie jest obsługiwana.');
JK 103         }
104         
86e3eb 105         $rezultaty = array();
50d2eb 106         
86e3eb 107         $dane = $this->wytnij('//div[@class="start-wyniki_'.$gra.'"]', NULL,
JK 108             'Nie znaleziono na stronie wyników dla gry '.$gra);
109         $dane = $dane->item(0);
110         
111         
112         $daty = $this->wytnij('div[contains(concat(" ", @class, " "), " wyniki_data ")]', $dane,
113             'Nie znaleziono informacji o losowanu gry '.$gra);
114         $wyniki = $this->wytnij('div[contains(concat(" ", @class, " "), " glowna_wyniki_'.$gra.' ")]', $dane,
115             'Nie znaleziono wyników losowania gry '.$gra);
116         
117         $plusy = NULL;
118         try {
119             $plusy = $this->wytnij('div[@class="wynik_'.$gra.'_plus"]', $dane);
120         } catch(Exception $e) {}
121         
122         $lottoplusy = NULL;
123         try {
124             $lottoplusy = $this->wytnij('//div[@class="glowna_wyniki_'.$gra.'plus"]', $dane);
125         } catch(Exception $e) {}
126         
127         for($l = 0; $l < $daty->length && $l < $wyniki->length && $l < $zwroc; $l++) {
128             $rezultat = array();
50d2eb 129             
86e3eb 130             // Znajdź $l-tą datę losowania i jego wynik
JK 131             $data = $daty->item($l);
132             $wynik = $wyniki->item($l);
50d2eb 133             
JK 134             try {
86e3eb 135                 // Znajdź datę i godzinę
JK 136                 $data = $this->wytnij('strong', $data, 'Nie znaleziono '.$l.' daty losowania gry '.$gra);
137                 $rezultat['data'] = trim($data->item(0)->textContent);
138                 if($data->length > 1) {
139                     $rezultat['godzina'] = trim($data->item(1)->textContent);
140                 }
141                 
142                 // Znajdź poszczególne liczby w wyniku
143                 $liczby = $this->wytnij('div[@class="wynik_'.$gra.'"]', $wynik,
144                     'Nie znaleziono liczb w '.$l.' losowaniu gry '.$gra);
145                 $rezultat['liczby'] = array();
146                 foreach($liczby as $liczba) {
147                     $rezultat['liczby'][] = trim($liczba->textContent);
148                 }
149             } catch(Exception $e) {
50d2eb 150                 break;
JK 151             }
152             
86e3eb 153             try {
JK 154                 // Szukamy plusa
155                 if($plusy && $plusy->length > $l) {
156                     $rezultat['plus'] = trim($plusy->item($l)->textContent);
d8d9ec 157                 }
86e3eb 158             } catch(Exception $e) {}
50d2eb 159             
86e3eb 160             try {
JK 161                 // Szukamy ekstra liczby
162                 $ekstra = $this->wytnij('div[@class="wynik_'.strtr($gra, '-', '_').'"]', $wynik,
163                     'Nie znaleziono ekstra w '.$l.' losowaniu gry '.$gra);
164                 $rezultat['ekstra'] = trim($ekstra->item(0)->textContent);
165             } catch(Exception $e) {}
166             
167             try {
168                 // Szukamy lottoplusa
169                 if($lottoplusy && $lottoplusy->length > $l) {
170                     $liczby = $this->wytnij('div[@class="wynik_'.$gra.'plus"]', $lottoplusy->item($l),
171                         'Nie znaleziono liczb w '.$l.' losowaniu gry '.$gra.'plus');
172                     $rezultat['plus'] = array();
173                     foreach($liczby as $liczba) {
174                         $rezultat['plus'][] = trim($liczba->textContent);
175                     }
176                 }
177             } catch(Exception $e) {}
178             
179             $rezultaty[] = $rezultat;
50d2eb 180         }
JK 181         
86e3eb 182         return $rezultaty;
JK 183     }
184     
185     protected $skroty = array(
186         'lotto' => 'dl', 'mini-lotto' => 'el',
187         'kaskada' => 'ka', 'multi-multi' => 'mm',
188         'joker' => 'jk', 'ekstra-pensja' => 'ep'
189     );
190     
191     function pobierz_jeden($skrot, $wynik) {
192         $last_data = @file_get_contents('./last_'.$skrot.'.txt');
193         if($last_data != $wynik['data']) {
194             foreach($wynik['liczby'] as $i => $liczba) {
195                 $wynik[$i+1] = $liczba;
196             }
197             file_put_contents('./last_'.$skrot.'.txt', $wynik['data']);
198             file_put_contents('./'.$skrot.'.txt', serialize($wynik));
199             file_put_contents('./archiwum/'.$skrot.'_'.date('j.m.Y', strtotime($wynik['data'])).'.txt', serialize($wynik));
200             echo OK;
201         } else {
202             echo NOT;
203         }
50d2eb 204     }
JK 205     
206     function pobierz() {
86e3eb 207         foreach($this->gry as $gra) {
50d2eb 208             echo STAR.'Wyniki gry '.$gra.'...';
a29a93 209             if($gra == 'multi-multi') {
86e3eb 210                 echo "\n";
50d2eb 211                 $wyniki = $this->wyniki($gra, 2);
86e3eb 212                 foreach($wyniki as $wynik) {
JK 213                     $godzina = substr($wynik['godzina'], 0, 2);
214                     echo '   '.STAR.'godzina '.$godzina.'...';
215                     if($godzina == '21') {
216                         $godzina = '22';
50d2eb 217                     }
86e3eb 218                     $skrot = $this->skroty[$gra].$godzina;
JK 219                     
220                     $this->pobierz_jeden($skrot, $wynik);
50d2eb 221                 }
86e3eb 222             } else {
JK 223                 $this->pobierz_jeden($this->skroty[$gra], $this->wynik($gra));
50d2eb 224             }
JK 225         }
226     }
8bd4d9 227 }
JK 228
229 $lotto = new lotto();
230 echo OK;
231
232 $lotto->pobierz();
a29a93 233 ?>