Last active
August 13, 2024 13:48
-
-
Save tomahock/af63fc91dd4060b1d0725033985bce1f to your computer and use it in GitHub Desktop.
Fogos.pt first PDF parser
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * Created by PhpStorm. | |
| * User: tomahock | |
| * Date: 10/08/15 | |
| * Time: 01:05 | |
| */ | |
| require_once '../vendor/autoload.php'; | |
| require_once '../lib/DatStore.php'; | |
| require_once '../lib/NotificationStore.php'; | |
| $ionicHeaders = [ | |
| 'verify' => false, | |
| 'allow_redirects' => true, | |
| 'headers' => [ | |
| 'Accept' => 'application/json', | |
| 'Content-Type' => 'application/json', | |
| 'Authorization' => '' | |
| ] | |
| ]; | |
| $settings = [ | |
| 'oauth_access_token' => "", | |
| 'oauth_access_token_secret' => "", | |
| 'consumer_key' => "", | |
| 'consumer_secret' => "", | |
| ]; | |
| $twitterUrl = 'https://api.twitter.com/1.1/statuses/update.json'; | |
| $requestMethod = 'POST'; | |
| const DEFAULT_URL = ''; | |
| const DEFAULT_TOKEN = ''; | |
| $firebase = new \Firebase\FirebaseLib(DEFAULT_URL, DEFAULT_TOKEN); | |
| $users = json_decode($firebase->get('/users')); | |
| switch (date('m')) { | |
| case 1: | |
| $month = 'Janeiro'; | |
| $abbr = 'JAN'; | |
| break; | |
| case 2: | |
| $month = 'Fevereiro'; | |
| $abbr = 'FEV'; | |
| break; | |
| case 3: | |
| $month = 'Marco'; | |
| $abbr = 'MAR'; | |
| break; | |
| case 4: | |
| $month = 'Abril'; | |
| $abbr = 'ABR'; | |
| break; | |
| case 5: | |
| $month = 'Maio'; | |
| $abbr = 'MAI'; | |
| break; | |
| case 6: | |
| $month = 'Junho'; | |
| $abbr = 'JUN'; | |
| break; | |
| case 7: | |
| $month = 'Julho'; | |
| $abbr = 'JUL'; | |
| break; | |
| case 8: | |
| $month = 'Agosto'; | |
| $abbr = 'AGO'; | |
| break; | |
| case 9: | |
| $month = 'Setembro'; | |
| $abbr = 'SET'; | |
| break; | |
| case 10: | |
| $month = 'Outubro'; | |
| $abbr = 'OUT'; | |
| break; | |
| case 11: | |
| $abbr = 'NOV'; | |
| $month = 'Novembro'; | |
| break; | |
| case 12: | |
| $month = 'Dezembro'; | |
| $abbr = 'DEZ'; | |
| break; | |
| } | |
| $year = date('Y'); | |
| $day = date('d'); | |
| $url = "http://www.prociv.pt/cnos/HAI/{$month}%20{$year}/Inc%C3%AAndios%20Rurais%20-%20Hist%C3%B3rico%20do%20Dia%20{$day}{$abbr}.pdf"; | |
| //file_put_contents("Tmpfile.pdf", fopen("http://www.prociv.pt/cnos/HAI/Agosto/Inc%C3%AAndios%20Rurais%20-%20Hist%C3%B3rico%20do%20Dia%2001SET.pdf", 'r')); | |
| file_put_contents("Tmpfile.pdf", fopen($url, 'r')); | |
| $parser = new \Smalot\PdfParser\Parser(); | |
| $pdf = $parser->parseFile("Tmpfile.pdf"); | |
| $text = $pdf->getText(); | |
| $fires = array(); | |
| $fireTypes = array( | |
| 'MATO', | |
| 'POVOAMENTO', | |
| 'FLORESTAL', | |
| 'AGRÍCOLA', | |
| ); | |
| $fireTypesAlt = array( | |
| 'Mato', | |
| 'Povoamento', | |
| 'Florestal', | |
| 'Agrícolas', | |
| ); | |
| $status = array( | |
| 'CURSO' => 1, | |
| 'ALERTA' => 3, | |
| 'RESOLUÇÃO' => 1, | |
| 'CONCLUSÃO' => 0, | |
| 'ENCERRADA' => 0, | |
| 'TO' => 2 | |
| ); | |
| $statusColors = array( | |
| ' Curso' => 'FF0000', | |
| 'Em Curso' => 'FF0000', | |
| 'ALERTA' => 'FF9900', | |
| ' Resolução' => '3366FF', | |
| ' Conclusão' => '66FF33', | |
| ' Encerrada' => '4D4D4D', | |
| ' DESPACHO DE 1º ALERTA' => 'FF9900', | |
| 'TO' => '800000' | |
| ); | |
| $statusColorsAlt = array( | |
| ' CURSO' => 'FF0000', | |
| ' EM CURSO' => 'FF0000', | |
| ' EM' => 'FF0000', | |
| ' ALERTA' => 'FF9900', | |
| 'ALERTA' => 'FF9900', | |
| ' EM RESOLUÇÃO' => '3366FF', | |
| ' CONCLUSÃO' => '66FF33', | |
| ' ENCERRADA' => '4D4D4D', | |
| ' DESPACHO DE 1º ALERTA' => 'FF9900', | |
| 'TO' => '800000' | |
| ); | |
| //read file line by line | |
| $lines = array(); | |
| foreach (preg_split("/((\r?\n)|(\r\n?))/", $text) as $line) { | |
| $lines[] = $line; | |
| if (preg_match('/^Informação válida/', $line)) { | |
| echo 'set update' . PHP_EOL; | |
| DataStore::setUpdate($line); | |
| } | |
| $fire = explode(' ', $line); | |
| $total = count($fire) - 1; | |
| if (preg_match('/^[0-9]/', $line) && $total > 7) { | |
| $fire = explode(' ', $line); | |
| $total = count($fire) - 1; | |
| if (!empty($fire[$total])) { | |
| $total = count($fire); | |
| } | |
| if (!DataStore::getItemById($fire[0])) { | |
| $location = ''; | |
| for ($i = 3; $i <= count($fire); $i++) { | |
| if (!in_array($fire[$i], $fireTypes)) { | |
| $location .= ' ' . $fire[$i]; | |
| } else { | |
| break; | |
| } | |
| } | |
| $url = 'https://maps.google.com/maps/api/geocode/json?sensor=false&language=pt&key=&address='; | |
| $url = $url . urlencode($location); | |
| $curl = curl_init(); | |
| curl_setopt($curl, CURLOPT_URL, $url); | |
| curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); | |
| curl_setopt($curl, CURLOPT_HEADER, 0); | |
| curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); | |
| $gMaps = json_decode(curl_exec($curl)); | |
| $district = null; | |
| $concelho = null; | |
| if (!empty($gMaps->results)) { | |
| foreach ($gMaps->results as $r) { | |
| if ($district) { | |
| continue; | |
| } | |
| foreach ($r->address_components as $r1) { | |
| if (isset($r1->types[0]) && $r1->types[0] === 'administrative_area_level_2') { | |
| $concelho = $r1->short_name; | |
| } | |
| if (isset($r1->types[0]) && $r1->types[0] === 'administrative_area_level_1') { | |
| $district = $r1->short_name; | |
| } | |
| } | |
| } | |
| $point = array( | |
| 'id' => $fire[0], | |
| 'coords' => true, | |
| 'date' => $fire[1], | |
| 'hour' => $fire[2], | |
| 'location' => $location, | |
| 'aerial' => $fire[$total - 1], | |
| 'terrain' => $fire[$total - 2], | |
| 'man' => $fire[$total - 3], | |
| 'district' => $district, | |
| 'concelho' => $concelho, | |
| 'lat' => $gMaps->results[0]->geometry->location->lat, | |
| 'lng' => $gMaps->results[0]->geometry->location->lng, | |
| 'notification' => true | |
| ); | |
| } else { | |
| $point = array( | |
| 'id' => $fire[0], | |
| 'coords' => false, | |
| 'date' => $fire[1], | |
| 'hour' => $fire[2], | |
| 'location' => $location, | |
| 'aerial' => $fire[$total - 1], | |
| 'terrain' => $fire[$total - 2], | |
| 'man' => $fire[$total - 3], | |
| 'district' => $district, | |
| 'concelho' => $concelho, | |
| 'notification' => true | |
| ); | |
| } | |
| DataStore::save($point); | |
| NotificationStore::create($district, $location); | |
| foreach ($users as $u) { | |
| if (isset($u->device)) { | |
| if (isset($u->distritos)) { | |
| foreach ($u->distritos as $d) { | |
| if (preg_match('/' . $d->name . '/', $district) && $d->selected) { | |
| if (isset($u->os) && $u->os == 'android') { | |
| $client = new GuzzleHttp\Client(); | |
| $ionicHeaders['json'] = array( | |
| "tokens" => [$u->device], | |
| "profile" => "android", | |
| "notification" => [ | |
| "title" => "Fogos.pt", | |
| "message" => 'Novo incêndio em ' . $location, | |
| "android" => array( | |
| "data" => array( | |
| "title" => "", | |
| "message" => "", | |
| "style" => "inbox", | |
| "summaryText" => "Há %n% novos incêndios" | |
| ) | |
| ) | |
| ] | |
| ); | |
| $res = $client->request('POST', 'https://api.ionic.io/push/notifications', $ionicHeaders); | |
| echo 'Sending ' . $district . ' to ' . $u->uid . PHP_EOL; | |
| } elseif (isset($u->os) && $u->os == 'ios') { | |
| $ionicHeaders['json'] = array( | |
| "tokens" => [$u->device], | |
| "profile" => "iosprod", | |
| "notification" => [ | |
| "title" => "Fogos.pt", | |
| "message" => 'Novo incêndio em ' . $location, | |
| 'ios' => array( | |
| 'title' => 'Fogos.pt', | |
| "message" => 'Novo incêndio em ' . $location, | |
| ) | |
| ] | |
| ); | |
| $res = $client->request('POST', 'https://api.ionic.io/push/notifications', $ionicHeaders); | |
| echo 'Sending ' . $district . ' to ' . $u->uid . PHP_EOL; | |
| } else { | |
| $client = new GuzzleHttp\Client(); | |
| $ionicHeaders['json'] = array( | |
| "tokens" => [$u->device], | |
| "profile" => "android", | |
| "notification" => [ | |
| "title" => "Fogos.pt", | |
| "message" => 'Novo incêndio em ' . $location, | |
| "android" => array( | |
| "data" => array( | |
| "title" => "", | |
| "message" => "", | |
| "style" => "inbox", | |
| "summaryText" => "Há %n% novos incêndios" | |
| ) | |
| ) | |
| ] | |
| ); | |
| $res = $client->request('POST', 'https://api.ionic.io/push/notifications', $ionicHeaders); | |
| echo 'Sending ' . $district . ' to ' . $u->uid . PHP_EOL; | |
| } | |
| } | |
| } | |
| } else { | |
| echo 'User without districts: ' . json_encode($u) . PHP_EOL; | |
| } | |
| } | |
| } | |
| $postfields = [ | |
| 'status' => 'Novo incêndio em' . $location . ' https://fogos.pt', | |
| ]; | |
| print_r($postfields); | |
| $twitter = new TwitterAPIExchange($settings); | |
| $twitter->buildOauth($twitterUrl, $requestMethod) | |
| ->setPostfields($postfields) | |
| ->performRequest(); | |
| } | |
| $statusOffset = $status[$fire[$total - 4]]; | |
| $currentStatus = ''; | |
| for ($i = 0; $i <= $statusOffset; $i++) { | |
| if ($fire[$total - 4] == 'ALERTA' && $fire[$total - 5] !== '1º') { | |
| $currentStatus = 'ALERTA'; | |
| break; | |
| } else { | |
| if (in_array($fire[$total - 4 - $statusOffset + $i], $fireTypes)) { | |
| $currentStatus .= ' ' . $fire[$total - 3 - $statusOffset + $i]; | |
| } else { | |
| $currentStatus .= ' ' . $fire[$total - 4 - $statusOffset + $i]; | |
| } | |
| } | |
| } | |
| $statusColor = $statusColors[$currentStatus]; | |
| if (is_null($statusColor)) { | |
| if ($currentStatus == ' DESPACHO DE 1º ALERTA') { | |
| $currentStatus = 'ALERTA'; | |
| } | |
| $statusColor = $statusColorsAlt[$currentStatus]; | |
| } | |
| var_dump($currentStatus); | |
| var_dump($statusColor); | |
| $currentStatus = trim($currentStatus); | |
| $data = array( | |
| 'aerial' => $fire[$total - 1], | |
| 'terrain' => $fire[$total - 2], | |
| 'man' => $fire[$total - 3], | |
| 'status' => $currentStatus, | |
| 'statusColor' => $statusColor | |
| ); | |
| DataStore::updateById($fire[0], $data); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
O primeiro código PHP do maior site sobre incêndios portugueses!