From 0078935fc140f0124af4ae5104cdd4f1613dc521 Mon Sep 17 00:00:00 2001 From: Jacek Kowalski <Jacek@jacekk.info> Date: Sun, 08 Jul 2012 19:01:42 +0000 Subject: [PATCH] Poprawka parsowania programu telewizyjnego - filtrowanie znaków UTF-8 ze względu na problemy z kodowaniem na stronach WP --- data/lotto/pobierz.php | 111 ++++++++++++++++++++++++++++++++----------------------- 1 files changed, 65 insertions(+), 46 deletions(-) diff --git a/data/lotto/pobierz.php b/data/lotto/pobierz.php index 2260d8b..2dc91d0 100644 --- a/data/lotto/pobierz.php +++ b/data/lotto/pobierz.php @@ -2,9 +2,12 @@ echo STAR.'Pobieranie danych...'; class lotto { + // Zawartość strony http://lotto.pl/wyniki-gier protected $strona = NULL; + // Lista gier. protected $gry = array( + // nazwa => array(ilość liczb, plus?) 'lotto' => array(6, FALSE, 'dl'), 'mini-lotto' => array(5, FALSE, 'el'), 'kaskada' => array(12, FALSE, 'ka'), @@ -12,15 +15,21 @@ 'joker' => array(5, FALSE, '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,99 @@ } } + // 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); } $wyniki[] = $wynik; @@ -128,7 +147,7 @@ function pobierz() { foreach($this->gry as $gra => $data) { echo STAR.'Wyniki gry '.$gra.'...'; - if($gra == 'multi-multi') { + if($gra == 'multimulti') { $wyniki = $this->wyniki($gra, 2); $wynik = $wyniki[0]; $skrot = $data[2].substr($wynik['godzina'], 0, 2); @@ -192,4 +211,4 @@ echo OK; $lotto->pobierz(); -?> +?> \ No newline at end of file -- Gitblit v1.9.1