[Сценарий] Парсер праздников сегодня

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

Ответить
Аватара пользователя
S_Nick
Сообщения: 67
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 54 раза
Контактная информация:

[Сценарий] Парсер праздников сегодня

Сообщение S_Nick » Пт окт 25, 2019 9:14 pm

Актуально для жителей СНГ. Может кому-то будет полезно.
Умный дом говорит какой сегодня праздник, российский или международный. В духе таких, как "День гранёного стакана" :D
Рекомендую выполнять один раз в сутки, лучше всего утром, когда вы просыпаетесь, будете знать, может быть сегодня ваш профессиональный праздник ;)
Данные получает с сайта kalendar-365.ru
Версия сырая, могут быть ошибки.
Если есть мысли как оптимизировать улучшить код, пишите в теме.

Код сценария feastToday:

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

if (isset($params["level"])) $level = $params["level"]; else $level = 1;
if (!isOnline('Internet')) { say("Нет доступа в Интернет!", $level); return; }
if (isset($params["change"])) $change = $params["change"];

$page_url = "http://kalendar-365.ru/today";

//делаем до 10 запросов, т.к. сайт иногда не отвечает с первого раза
for ($i = 0; $i <= 10; $i++) {
	if (!$page_cont) $page_cont = file_get_contents($page_url);
}

if ($page_cont) {
	$page_cont = str_replace("\r", "", $page_cont);
	$page_cont = str_replace("\n", "", $page_cont);
	
	preg_match_all("/<span class=\"cl\">(.*?)<\/span>/ui", $page_cont, $match);
	
	$ret = "Сегодня: ";
	foreach($match[1] as $key => $value) {
		$ret .= $value . ".; ";
	}
}

$ret = trim($ret);
if ($ret) {
 	sg("ThisComputer.feastToday", $ret);
	say($ret, $level);
 	echo "<br>" . $ret;
}
Пример выполнения:
Сегодня: День работника кабельной промышленности.; День таможенника Российской Федерации.; День маркетолога.; Андрон Звездочет.;

В нагрузку привожу сценарий определения Рабочего/Выходного дня РБ (может быть адаптирован для других стран, параметром ?cc=by), чтобы не создавать отдельный топик.
у меня выполняется ежедневно утром в 7:03, когда все просыпаются.

Код сценария dateNow:

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

if (isset($params["level"])) $level = $params["level"]; else $level = 1;
if (!isOnline('Internet')) { say("Нет доступа в Интернет!", $level); return; }

//определение выходного дня
function isDayOff($str) {
	$url = "https://isdayoff.ru/" . $str . "?cc=by";
	$response = file_get_contents($url);
	if ($response == "1") $result = "Выходной!";
	if ($response == "0") $result = "Рабочий день.";
	return $result;
}

//дата на русском
function dateru($str) {
   $result = "";
   $iter = 0;
   while ($iter < mb_strlen($str)) {
 
     switch (mb_substr($str,$iter,1)) {
       case 'д': {
         $dayN = date("N");
         $day = "";
       switch ($dayN) {
         case 1:$day = "Понедельник";break;
         case 2:$day = "Вторник";break;
         case 3:$day = "Среда";break;
         case 4:$day = "Четверг";break;
         case 5:$day = "Пятница";break;
         case 6:$day = "Суббота";break;
         case 7:$day = "Воскресенье";break;
       }
         $iter++;
         $result .= $day;
         break;
       }
       case 'м': {
         $monthN = date("m");
         $month = "";
         switch($monthN) {
           case '01':$month = "января";break;
           case '02':$month = "февраля";break;
           case '03':$month = "марта";break;
           case '04':$month = "апреля";break;
           case '05':$month = "мая";break;
           case '06':$month = "июня";break;
           case '07':$month = "июля";break;
           case '08':$month = "августа";break;
           case '09':$month = "сентября";break;
           case '10':$month = "октября";break;
           case '11':$month = "ноября";break;
           case '12':$month = "декабря";break;
         }
         $iter++;
         $result .= $month;
         break;
   
       }
 
       default: {
         $result .=    date(mb_substr($str,$iter,1));
         $iter++;
         break;
       }
     }
 
   }
 
   return $result;
}

$ret .= "Сегодня " . date("d") . " " . dateru("м") . ". " . dateru("д") . ". ";
$ret .= isDayOff(date("Ymd")) . " ";
$ret .= "Средняя температура этой ночью на улице была " . round(getHistoryAvg("minsk.temp", strtotime("00:00")), 1) . "°, ";
$ret .= "опускалась до " . round(getHistoryMin("minsk.temp", strtotime("00:00")), 1) . "°. ";
$ret .= "Фаза луны: " . gg("ThisComputer.MoonStage") . ". ";
$ret .= "Солнце зайдет сегодня в " . gg("ThisComputer.SunSetTime") . ". ";

say($ret, $level);
echo "<br>" . $ret;
Пример выполнения:
Доброе утро! Сегодня 26 октября. Суббота. Выходной! Средняя температура этой ночью на улице была 10.6°, опускалась до 10°. Фаза луны: убывающая. Солнце зайдет сегодня в 17:49.
P/S. Модераторы. Если я опубликовал не в тот раздел тему, пожалуйста перенесите, поправьте.
За это сообщение автора S_Nick поблагодарили (всего 5):
Nail (Сб окт 26, 2019 10:11 am) • Lerych (Вс окт 27, 2019 8:30 pm) • Jilber (Пн окт 28, 2019 6:44 pm) • xor (Чт мар 19, 2020 1:54 pm) • Sergey.Chek (Пт сен 25, 2020 10:08 pm)
Рейтинг: 5.81%
Аватара пользователя
vitosmaxim80sad145
Сообщения: 148
Зарегистрирован: Сб июл 07, 2018 12:48 am
Откуда: Днепр
Благодарил (а): 100 раз
Поблагодарили: 1 раз

Re: [Сценарий] Парсер праздников сегодня

Сообщение vitosmaxim80sad145 » Чт мар 19, 2020 1:06 pm

[qоткуда берутся данные у вас в ThisComputer.MoonStage фаза лунв , и как сделать историю для днепра или хоть для киева
Аватара пользователя
xor
Сообщения: 2036
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 283 раза
Поблагодарили: 628 раз

Re: [Сценарий] Парсер праздников сегодня

Сообщение xor » Чт мар 19, 2020 1:56 pm

vitosmaxim80sad145 писал(а):[qоткуда берутся данные у вас в ThisComputer.MoonStage фаза лунв , и как сделать историю для днепра или хоть для киева
На форуме поискать фазы Луны не пробовали(

Отправлено с моего Redmi 4X через Tapatalk

Аватара пользователя
S_Nick
Сообщения: 67
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 54 раза
Контактная информация:

Re: [Сценарий] Парсер праздников сегодня

Сообщение S_Nick » Вс мар 22, 2020 8:54 am

vitosmaxim80sad145 писал(а):
Чт мар 19, 2020 1:06 pm
[qоткуда берутся данные у вас в ThisComputer.MoonStage фаза лунв , и как сделать историю для днепра или хоть для киева
viewtopic.php?f=27&t=2157
За это сообщение автора S_Nick поблагодарил:
vitosmaxim80sad145 (Вс мар 22, 2020 5:02 pm)
Рейтинг: 1.16%
Максим Николаевич
Сообщения: 44
Зарегистрирован: Пт июн 24, 2016 3:32 pm
Благодарил (а): 5 раз
Поблагодарили: 0

Re: [Сценарий] Парсер праздников сегодня

Сообщение Максим Николаевич » Ср июн 30, 2021 3:45 pm

S_Nick писал(а):
Пт окт 25, 2019 9:14 pm
...
У меня почему-то нет никакого ответа после выполнения скрипта о праздниках. Если есть актуальная версия поделитесь если не жалко.
MajorDoMo живет на Xpenology DSM 6.2.3-25426 Update 2 :arrow: Virtual Machine Manager :arrow: Debian 10
Аватара пользователя
S_Nick
Сообщения: 67
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 54 раза
Контактная информация:

Re: [Сценарий] Парсер праздников сегодня

Сообщение S_Nick » Чт июл 29, 2021 11:41 am

Максим Николаевич писал(а):
Ср июн 30, 2021 3:45 pm
S_Nick писал(а):
Пт окт 25, 2019 9:14 pm
...
У меня почему-то нет никакого ответа после выполнения скрипта о праздниках. Если есть актуальная версия поделитесь если не жалко.
Сейчас использую, и у меня работает:

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

<?php
//универсальный

if (isset($params["level"])) $level = $params["level"]; else $level = 1;
if (!isOnline('Internet')) { say("Нет доступа в Интернет!", $level); return; }
if (isset($params["change"])) $change = $params["change"];

$page_url = "http://kalendar-365.ru/today";

//делаем до 10 запросов, т.к. сайт иногда не отвечает с первого раза
for ($i = 0; $i <= 10; $i++) {
	if (!$page_cont) $page_cont = file_get_contents($page_url);
}

if ($page_cont) {
	$page_cont = str_replace("\r", "", $page_cont);
	$page_cont = str_replace("\n", "", $page_cont);
	
	preg_match_all("/<span class=\"cl\">(.*?)<\/span>/ui", $page_cont, $match);
	
	$ret = "Сегодня: ";
	foreach($match[1] as $key => $value) {
		$ret .= $value . ".; ";
	}
}

$ret = trim($ret);
if ($ret) {
 	sg("ThisComputer.feastToday", $ret);
	say($ret, $level);
 	echo "<br>" . $ret;
}
?>
Ответ:
Сегодня: Международный день тигра.; Финогеев день.;
Максим Николаевич
Сообщения: 44
Зарегистрирован: Пт июн 24, 2016 3:32 pm
Благодарил (а): 5 раз
Поблагодарили: 0

Re: [Сценарий] Парсер праздников сегодня

Сообщение Максим Николаевич » Пт июл 30, 2021 8:53 am

S_Nick писал(а):
Чт июл 29, 2021 11:41 am
Сейчас использую, и у меня работает:
К сожалению выдаёт ошибку:
error.JPG
error.JPG (63.47 КБ) 3546 просмотров
Что я делаю не правильно?
MajorDoMo живет на Xpenology DSM 6.2.3-25426 Update 2 :arrow: Virtual Machine Manager :arrow: Debian 10
Аватара пользователя
xor
Сообщения: 2036
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 283 раза
Поблагодарили: 628 раз

Re: [Сценарий] Парсер праздников сегодня

Сообщение xor » Пт июл 30, 2021 1:12 pm

Максим Николаевич писал(а):
Пт июл 30, 2021 8:53 am
S_Nick писал(а):
Чт июл 29, 2021 11:41 am
Сейчас использую, и у меня работает:
К сожалению выдаёт ошибку:
error.JPG

Что я делаю не правильно?
удалите первую и последнюю строку - при размещении в окне скрипта это не нужно. но у меня не работает) сыпет ворнингами про неверный сертификат(
Ответить