Скрипт граббинга погоды Gismeteo

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
immortal
Сообщения: 1137
Зарегистрирован: Вт янв 29, 2013 9:16 am
Откуда: Белозерск
Благодарил (а): 16 раз
Поблагодарили: 392 раза
Контактная информация:

Скрипт граббинга погоды Gismeteo

Сообщение immortal » Чт май 20, 2021 11:50 pm

собственно написал скрипт ибо в граббить через web переменные такое количество просто не реально.

запускать можно раз в час, можно скрипт разделить для текущего дня и для прогноза и прогноз запускать реже.
СпойлерПоказать

Код: Выделить всё

// код для рег выражений https://tools.icoder.uz/regex-tester.php
// сайт, регулярное выражение, свойство в МД, номер переменной (если одна то не указывается)
function SaveToProp ($myurl, $myreg, $mdprop, $num = 1) 
{
$isMatched = preg_match($myreg, $myurl, $matches);
$res = str_replace("+", "" , $matches[$num]);
$res = str_replace(".sun", "" , $res);
$res = str_replace(".moon", "" , $res);

sg($mdprop, $res);
echo $res."</br>";
}
function SaveToPropAll ($myurl, $myreg, $mdprop, $num = 1) 
{
$isMatched = preg_match_all($myreg, $myurl, $matches);
$res = $matches[1][$num];
sg($mdprop, $res);
echo $res."</br>";
}
// текущая погода
$str = file_get_contents("http://m.gismeteo.com/weather/11938/current/"); //текущая погода
SaveToProp ($str, '/<td class="weather__temp"><span>(.+?)<\/span>/', "GismeteoCurrent.Temperature");
SaveToProp ($str, '/<td class="weather__desc">(.+?)<\/td>/', "GismeteoCurrent.description");
SaveToProp ($str, '/Feels: (.+?)<\/p>/', "GismeteoCurrent.Feels");
SaveToProp ($str, '/Pressure: (.+?) mmHg<\/p>/', "GismeteoCurrent.Pressure");
SaveToProp ($str, '/Humidity: (.+?) %<\/p>/', "GismeteoCurrent.Humidity");
SaveToProp ($str, '/Geomagnetic сonditions: (.+?) points<\/p>/', "GismeteoCurrent.Geomagnetic");
SaveToProp ($str, '/Wind: (.+?) m\/s,/', "GismeteoCurrent.Wind");
SaveToProp ($str, '/ m\/s, (.+?)<\/p>/', "GismeteoCurrent.Wind_direction");
SaveToProp ($str, '/Sunrise: (.+?)<\/p>/', "GismeteoCurrent.Sunrise");
SaveToProp ($str, '/Sunset: (.+?)<\/p>/', "GismeteoCurrent.Sunset");
SaveToProp ($str, '/Day length: (.+?)<\/p>/', "GismeteoCurrent.Day_length");
SaveToProp ($str, '/Moon: (.+?) %,/', "GismeteoCurrent.Moon");
SaveToProp ($str, '/ %, (.+?)<\/p>/', "GismeteoCurrent.Moon_type");
SaveToProp ($str, '/<div class="title">(.+?), (.+?) (.+?), (.+?)<\/div>/', "GismeteoCurrent.date_day", 2);
SaveToProp ($str, '/<div class="title">(.+?), (.+?) (.+?), (.+?)<\/div>/', "GismeteoCurrent.date_month", 3);
SaveToProp ($str, '/<div class="title">(.+?), (.+?) (.+?), (.+?)<\/div>/', "GismeteoCurrent.date_time", 4);
SaveToProp ($str, '/<td class="weather__icon"><img alt="" src="\/static\/images\/icons\/wap2\/(.+?)\.png" \/><\/td>/', "GismeteoCurrent.Image");

// функция для параметров погоды детально
function Detail($myurl, $param0, $param1, $param2) {
SaveToPropAll ($myurl, '/<div class="title">(.+?)<\/div>/', $param0 . "." . $param1 . "TimesofDay", $param2 + 1);
SaveToPropAll ($myurl, '/<td class="weather__temp"><span>(.+?)<\/span>/', $param0.".".$param1."Temperature", $param2);
SaveToPropAll ($myurl, '/<td class="weather__desc">(.+?)<\/td>/', $param0.".".$param1."Description", $param2);
SaveToPropAll ($myurl, '/Feels: (.+?)<\/p>/', $param0.".".$param1."Feels", $param2);
SaveToPropAll ($myurl, '/Pressure: (.+?) mmHg<\/p>/', $param0.".".$param1."Pressure", $param2);
SaveToPropAll ($myurl, '/Humidity: (.+?) %<\/p>/', $param0.".".$param1."Humidity", $param2);
SaveToPropAll ($myurl, '/Geomagnetic сonditions: (.+?) points<\/p>/', $param0.".".$param1."Geomagnetic", $param2);
}


$str = file_get_contents("http://m.gismeteo.com/weather/11938/detailday/"); //погода подробно на текущий день
Detail ($str, "GismeteoDetailday", "Night", 0 );
Detail ($str, "GismeteoDetailday", "Morning", 1 );
Detail ($str, "GismeteoDetailday", "Day", 2 );
Detail ($str, "GismeteoDetailday", "Evening", 3 );

$str = file_get_contents("http://m.gismeteo.com/weather/11938/detailday/1/"); //погода подробно на завтра
Detail ($str, "GismeteoDetailday1", "Night", 0 );
Detail ($str, "GismeteoDetailday1", "Morning", 1 );
Detail ($str, "GismeteoDetailday1", "Day", 2 );
Detail ($str, "GismeteoDetailday1", "Evening", 3 );

$str = file_get_contents("http://m.gismeteo.com/weather/11938/detailday/2/"); //погода подробно на послезавтра
Detail ($str, "GismeteoDetailday2", "Night", 0 );
Detail ($str, "GismeteoDetailday2", "Morning", 1 );
Detail ($str, "GismeteoDetailday2", "Day", 2 );
Detail ($str, "GismeteoDetailday2", "Evening", 3 );

$str = file_get_contents("http://m.gismeteo.com/weather/11938/detailday/3/"); //погода подробно через 2 дня
Detail ($str, "GismeteoDetailday3", "Night", 0 );
Detail ($str, "GismeteoDetailday3", "Morning", 1 );
Detail ($str, "GismeteoDetailday3", "Day", 2 );
Detail ($str, "GismeteoDetailday3", "Evening", 3 );
в приложенном файле иконки
gismeteo-icons.zip
(788.16 КБ) 32 скачивания
За это сообщение автора immortal поблагодарили (всего 4):
xor (Пт май 21, 2021 12:23 am) • volend (Вт июн 01, 2021 10:23 am) • krepton85 (Вс июн 06, 2021 12:44 pm) • yden (Сб июн 12, 2021 9:16 pm)
Рейтинг: 4.71%
Lubuntu на cubieboard2 + ds9490R
DietPi на Orange Pi PC + 1wire на esp8266 с прошивкой Homes-smart.ru
krepton85
Сообщения: 49
Зарегистрирован: Вс окт 28, 2018 11:04 pm
Благодарил (а): 5 раз
Поблагодарили: 0

Re: Скрипт граббинга погоды Gismeteo

Сообщение krepton85 » Вс июн 06, 2021 12:47 pm

Отлично, но направление ветра и состояние погоды на английском языке, для озвучки погоды нужно на русском, я знаю как сделать перевод, но мне нужно знать с учетом регистра все состояния погоды и направления ветра на английском языке.
yden
Сообщения: 138
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 27 раз
Поблагодарили: 5 раз

Re: Скрипт граббинга погоды Gismeteo

Сообщение yden » Сб июн 12, 2021 9:19 pm

Благодарю за труд.
вопрос:
1. иконки из приложения к посту можно как-то вывести на сцену?
2. можно в телегу выводить прогноз текст + иконки. С текстом мне понятно, но как картинки внедрить - непонятно.

сенк
immortal
Сообщения: 1137
Зарегистрирован: Вт янв 29, 2013 9:16 am
Откуда: Белозерск
Благодарил (а): 16 раз
Поблагодарили: 392 раза
Контактная информация:

Re: Скрипт граббинга погоды Gismeteo

Сообщение immortal » Пт июн 25, 2021 10:18 pm

krepton85 писал(а):
Вс июн 06, 2021 12:47 pm
Отлично, но направление ветра и состояние погоды на английском языке, для озвучки погоды нужно на русском, я знаю как сделать перевод, но мне нужно знать с учетом регистра все состояния погоды и направления ветра на английском языке.
к сожалению не подскажу, знал бы сам то сделал бы сразу, в api направление циферками, я полагаю что тут тоже 8 направлений, надо включить историю и посмотреть, сейчас включу историю и позже напишу
Lubuntu на cubieboard2 + ds9490R
DietPi на Orange Pi PC + 1wire на esp8266 с прошивкой Homes-smart.ru
immortal
Сообщения: 1137
Зарегистрирован: Вт янв 29, 2013 9:16 am
Откуда: Белозерск
Благодарил (а): 16 раз
Поблагодарили: 392 раза
Контактная информация:

Re: Скрипт граббинга погоды Gismeteo

Сообщение immortal » Пт июн 25, 2021 10:30 pm

yden писал(а):
Сб июн 12, 2021 9:19 pm
1. иконки из приложения к посту можно как-то вывести на сцену?
разрешаю.
так стандартно, как обычно.
yden писал(а):
Сб июн 12, 2021 9:19 pm
2. можно в телегу выводить прогноз текст + иконки. С текстом мне понятно, но как картинки внедрить - непонятно.
этот вопрос лучше в тему про телеграмм бота, я делал конвертацию направлений для телеги эмоджи, там есть и эмоджи погоды, можно сопоставить, я планировал это сделать ,но пока руки не доходят и там мало эмоджи погоды. как вариант формировать картинку с погодой и отправлять в телегу картинку. Картинку формировать например с помощью php
Lubuntu на cubieboard2 + ds9490R
DietPi на Orange Pi PC + 1wire на esp8266 с прошивкой Homes-smart.ru
Ответить