birthday
|
$today=gg("ThisComputer.DayOfMonthNum");
$today.=".";
$today.=gg("ThisComputer.MonthNum");
$objects=getObjectsByClass("Users");
foreach($objects as $obj) {
if (gg($obj['TITLE'].".Brithday") == $today){
$bodytext=gg($obj['TITLE'].".fullName").", ";
//$bodytext.="С днем рождения! ";
$bodytext.=getRandomLine(birthday);
say("С днем рождения!");
say($bodytext);
//playSound('СДнемРожения');
}
}
|
getDuration
|
Вычисляет сколько уйдет времени, чтобы доехать до работы
$from = gg('home.adress');
$to = gg('work.adress');;
$route = getDurationInGoogle($from, $to);
$res = '';
$duration = $route['in_traffic'] - $route['duration'];
if ($duration > 0) {
$res .= 'Путь от дома до работы, c учетом пробок займет примерно ' . chti($route['in_traffic'], 'минута', 'минуты', 'минут') . '. ';
$res .= 'Что на ' . chti($duration, 'минута', 'минуты', 'минут') . ' дольше обычного.';
if ($duration > 10) {
$res .= ' Лучше пойти пешком!';
}
} else {
$res .= 'Путь от дома до работы займет примерно ' . chti($route['duration'], 'минута', 'минуты', 'минут') . '.';
}
say($res);
|
Greeting
|
Скрипт "доброе утро";
// все проснулись
callMethod('SleepAllMode.deactivate');
callMethod('NightMode.deactivate');
say("Ну наконец-то кто-то проснулся! Доброе утро!");
runScript("reportStatus", array());
runScript("OpenWeatherTest");
//if (gg('ow_day0.rain') > 10) {
// say('Сегодня возможен дождь. Не забудьте взять зонтик!');
//}
if (strripos(gg('ow_day0.weather_type'), 'дожд')) {
say('Сегодня возможен дождь. Не забудьте взять зонтик!');
}
runScript("Primetyinformer");
runScript("sayTodayAgenda");
runScript("holidaysToday");
if (gg('today.isWeekDay')) { // сегодня рабочий день
setTimeOut("getDuration_greeting_timer", "runScript('getDuration');", 40*60);
}
runScript("birthday");
|
holidaysToday
|
Читает праздники и события на сегодня по версии calend.ru
libxml_use_internal_errors(true);
$rss = simplexml_load_file("http://www.calend.ru/img/export/calend.rss");
//var_dump(ini_get('allow_url_fopen'));
//var_dump($rss);
if($rss != false) {
$strDate = gg('ThisComputer.DayOfMonthNum') . " " . gg('ThisComputer.MonthTXTalt') . ' - ';
$hol = '';
foreach ($rss->channel->item as $item) {
$pos = strpos($item->title, $strDate);
if ($pos !== false) {
//echo $item->title . " ; " . $item->category . "<br />";
$hol .= str_replace($strDate, "", $item->title) . ", ";
}
}
if ($hol != '') {
say('Праздники и события на сегодня: ' . $hol);
}
}
else {
echo "Failed loading XML\n";
foreach (libxml_get_errors() as $error) {
echo "\t", $error->message;
}
}
|
MobilePhoneCall
|
Проговариваем имя или номер звонящего на мобильный.
say('Вам звонит '.$params['cname']);
|
Primetyinformer
|
Информер народных примет (погода) на текущий день
$file = file ("texts/primety.txt");
$blines = count($file);
for ($k = 0; $k < $blines; $k++){
list ($b0, $b1, $b2, $b3) = explode ("::", $file[$k]);
$array[$k] = array ($b0, $b1, $b2, $b3);
if ($b0 == date(d) && $b1 == date(m)) {
$pri = $b3;
say('По народным приметам ' . $pri);
//echo 'По народным приметам ' . $pri;
}
}
|
readWeatherToday
|
$weather.="Сегодня ожидается ".str_replace('°',' ',getGlobal('weatherToday'));
$weather.=". Завтра ".str_replace('°',' ',getGlobal('weatherTomorrow'));
$weather.=". Сейчас на улице ".getGlobal('TempOutside').'.';
$weather=str_replace('°','',$weather);
say($weather,2);
|
reportStatus
|
$res='';
if (gg('Security.stateColor')=='green' && gg('System.stateColor')=='green' && gg('Communication.stateColor')=='green') {
$res='Все системы работают в штатном режиме.';
} else {
if (gg('Security.stateColor')!='green') {
$res.=" Проблема безопасности: ".getGlobal('Security.stateDetails');
}
if (gg('System.stateColor')!='green') {
$res.=" Системная проблема: ".getGlobal('System.stateDetails');
}
if (gg('Communication.stateColor')!='green') {
$res.=" Проблема связи: ".getGlobal('Communication.stateDetails');
}
}
say($res,5);
|
rssProcess
|
/*
$params['URL'] --link
$params['TITLE'] -- title
$params['BODY'] -- body
$params['CHANNEL_ID'] -- channel ID
$params['CHANNEL_TITLE'] -- channed title
*/
//say($params['TITLE']); // reading news
|
SayJokes
|
/*
1 - Анекдот;
2 - Рассказы;
3 - Стишки;
4 - Афоризмы;
5 - Цитаты;
6 - Тосты;
8 - Статусы;
11 - Анекдот (+18);
12 - Рассказы (+18);
13 - Стишки (+18);
14 - Афоризмы (+18);
15 - Цитаты (+18);
16 - Тосты (+18);
18 - Статусы (+18);
*/
function GetJoke($ctype = 11) {
$pretext = array("Слушай", "Слушайте шутку", "Слушай анекдот", "Вот шутка смешная", "Еще шутка");
$number = mt_rand(0, count($pretext) - 1);
$res = geturl('http://rzhunemogu.ru/Rand.aspx?CType=' . $ctype, 0);
$res = win2utf($res);
$xml = new SimpleXMLElement($res);
$joke = trim(preg_replace('/\s{2,}/', ' ', $xml->content));
$joke = $pretext[$number] . ': ' . $joke;
if (strlen($joke) > 500) {
sleep(10);
GetJoke();
} else {
//return $joke;
//say($pretext[$number].':', 1);
say($joke, 1);
}
}
//if (gg('ThisComputer.SayJokes') != 0) {
GetJoke();
//}
|
sayTodayAgenda
|
Чтение задач и событий на сегодня
if (file_exists('./modules/app_calendar/app_calendar.class.php')) {
include_once('./modules/app_calendar/app_calendar.class.php');
$calendar=new app_calendar();
$calendar->usual($out);
$events=$out['EVENTS_TODAY'];
$say_phrase='';
if (is_array($events)) {
$total=count($events);
$tasks=array();
$cals=array();
for($i=0;$i<$total;$i++) {
if ($events[$i]['IS_TASK']=='1' && $events[$i]['IS_DONE']!='1') {
$tasks[]=$events[$i]['TITLE'];
} elseif ($events[$i]['IS_TASK']!='1') {
$cals[]=$events[$i]['TITLE'];
}
}
$total_tasks=count($tasks);
if ($total_tasks) {
$say_phrase.="У вас на сегодня запланированы задачи. ";
for($i=0;$i<$total_tasks;$i++) {
$say_phrase.=($i+1).". ".$tasks[$i].". ";
}
} else {
//say("Никаких дел на сегодня не запланировано.",1);
}
$total_cals=count($cals);
if ($total_cals) {
$say_phrase.=("Сегодняшние события. ");
for($i=0;$i<$total_cals;$i++) {
$say_phrase.=$cals[$i].'. ';
}
}
} else {
say("Никаких дел на сегодня не запланировано. Везёт же!",1);
}
$events=$out['EVENTS_PAST'];
if ($events[0]['TITLE']) {
$say_phrase.=" Так же напоминаю о пропущенных задачах. ";
$total_tasks=count($events);
for($i=0;$i<$total_tasks;$i++) {
$say_phrase.=($i+1).". ".$events[$i]['TITLE'].". ";
}
}
}
if ($say_phrase) {
say($say_phrase,1);
}
|
sayWeather
|
//function closure($num)
// {
// if ($num==1){
// $res = '';
// }elseif($num==2 || $num==3 || $num==4){
// $res = 'а';
// }else{
// $res = 'ов';
// }
// return $res;
// }
$text = strip_tags(getGlobal('ThisComputer.rp5WeatherThisDay'));
$text = str_replace("\r\n",'',$text);
$text = str_replace("\n",'',$text);
$text = "Сейчас на улице ".$text;
preg_match_all('/-{0,1}(?:\d+(?:\.|,)\d+|\d+) ?°C/isU', $text, $matches);
for ($i = 0; $i < count($matches[0]); $i++)
{
$matches1[$i] = str_replace(" ",'',$matches[0][$i]);
$matches1[$i] = str_replace("°C",'',$matches[0][$i]);
if (substr_count($matches1[$i],".") != 0) { //float
$tGradus = 'градуса';
$matches1[$i].= " ".$tGradus;
}
else { //int
$tNew = abs((int)$matches1[$i]);
if ($tNew==1){
$tGradus = 'градус';
}elseif($tNew==2 || $tNew==3 || $tNew==4){
$tGradus = 'градуса';
}else{
$tGradus = 'градусов';
}
//$tGradus = "градус".closure($tNew);
$matches1[$i].= " ".$tGradus;
}
$matches1[$i] = str_replace("-",'минус ',$matches1[$i]);
$text = str_replace($matches[0][$i], $matches1[$i], $text);
}
preg_match_all('/\d\s+?м\/сек/isU', $text, $matches);
for ($i = 0; $i < count($matches[0]); $i++)
{
$matches1[$i] = str_replace(" ",'',$matches[0][$i]);
$matches1[$i] = str_replace("м/сек",'',$matches[0][$i]);
$tNew = abs((int)$matches1[$i]);
if ($tNew==1){
$tMetr = 'метр';
}elseif($tNew==2 || $tNew==3 || $tNew==4){
$tMetr = 'метра';
}else{
$tMetr = 'метров';
}
//$tMetr = "метр".closure($tNew);
$matches1[$i].= " ".$tMetr." в секунду";
$text = str_replace($matches[0][$i], $matches1[$i], $text);
}
preg_match_all('/\d\s+?м\/с/isU', $text, $matches);
for ($i = 0; $i < count($matches[0]); $i++)
{
$matches1[$i] = str_replace(" ",'',$matches[0][$i]);
$matches1[$i] = str_replace("м/с",'',$matches[0][$i]);
$tNew = abs((int)$matches1[$i]);
if ($tNew==1){
$tMetr = 'метр';
}elseif($tNew==2 || $tNew==3 || $tNew==4){
$tMetr = 'метра';
}else{
$tMetr = 'метров';
}
$matches1[$i].= " ".$tMetr." в секунду";
$text = str_replace($matches[0][$i], $matches1[$i], $text);
}
preg_match_all('/[а-я]\.[А-Я]/isU', $text, $matches);
for ($i = 0; $i < count($matches[0]); $i++)
{
$matches1[$i] = str_replace(".",'. ',$matches[0][$i]);
$text = str_replace($matches[0][$i], $matches1[$i], $text);
}
$text = str_replace(" км", " километра", $text);
say($text);
//Разбить на предложения, если надо.
//$pred = explode('. ', $text);
//for ($i = 0; $i < count($pred); $i++)
//{
// say($pred[$i]);
//}
|
TelegramMessage
|
Уведомление в телеграм
if (is_array($params)) {
include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram = new telegram();
if ($params['message'] != '') {
if (preg_match('/\.(?:jp(?:e?g|e|2)|gif|png|tiff?|bmp|ico)$/i', $params['message'])) { //Если это картинка
if (isset($params['id']) && $params['id'] !='') {
if ($params['id'] !='admin' && $params['id'] !='Admin') {
$telegram->sendImageToUser($params['id'], $params['message']);
} else {
$telegram->sendImageToAdmin($params['message']);
}
} else {
$telegram->sendImageToAll($params['message']);
}
} else { //Если в сообщении строка
if (isset($params['id']) && $params['id'] !='') {
if ($params['id'] !='admin' && $params['id'] !='Admin') {
$telegram->sendMessageToUser($params['id'], $params['message']);
} else {
$telegram->sendMessageToAdmin($params['message']);
}
} else {
$telegram->sendMessageToAll($params['message']);
}
}
} elseif ($params['sticker'] != '') { //Если это стикер
if (isset($params['id']) && $params['id'] !='') {
if ($params['id'] !='admin' && $params['id'] !='Admin') {
$telegram->sendStickerToUser($params['id'], $params['sticker']);
} else {
$telegram->sendStickerToAdmin($params['sticker']);
}
} else {
$telegram->sendStickerToAll($params['sticker']);
}
} elseif ($params['loc'] != '') { //Если это локация
$loc = explode(',', $params['loc']);
if (isset($params['id']) && $params['id'] !='') {
if ($params['id'] !='admin' && $params['id'] !='Admin') {
$telegram->sendLocationToUser($params['id'], $loc[0], $loc[1]);
} else {
$telegram->sendLocationToAdmin($loc[0], $loc[1]);
}
} else {
$telegram->sendLocationToAll($loc[0], $loc[1]);
}
}
}
|
timeNow
|
|
2ip
|
Информация про интернет, взятая с сервиса 2ip
$mes = 'Про интернет к которому я подключена: ';
$url="http://api.2ip.com.ua/provider.json";
//Работаем со строкой JSON
$data = json_decode(file_get_contents($url), true);
$ip=$data["ip"]; // что искали
$name_ripe=$data["name_ripe"];
$name_rus=$data["name_rus"];
$site=$data["site"];
echo $ip;
$mes .= 'Ай-Пи адрес ' . $ip . ', Провайдер: ' . $name_rus . '. ';
//$mes .= 'Сайт провайдера: ' . $site . '. ';
$url2="http://api.2ip.com.ua/geo.json?ip=".$ip;
echo $url2;
//Работаем со строкой JSON
$data = json_decode(file_get_contents($url2), true);
$country_rus=$data["country_rus"]; // что искали
$region_rus=$data["region_rus"];
$city_rus=$data["city_rus"];
$mes .= 'Мое местонахождение по мнению других: ' . $country_rus . ', ';
$mes .= $region_rus;
if($region_rus != $city_rus) {
$mes .= ', ' . $city_rus;
}
$mes .= '.';
say($mes);
|
backupServer
|
Резервное копирование каталогов и БД сервера
/*
* Сценарий для ежедневного создания резервных копий БД и каталогов.
*
* Архивы сохраняются на локальный диск и загружаются в облако (на Яндекс.Диск средствами REST API и OAuth-авторизации).
* Предусмотрена ротация архивных копий (хранится не более заданного числа архивов, остальные удаляются).
* На каждый ежедневный архив создается собственный каталог с именем вида "год-месяц-день", в который
* помещаются файлы с архивами БД и каталогов.
*
* Для использования облачного хранилища Яндекс.Диск предварительно необходимо авторизоваться на Яндексе
* и создать приложение здесь https://oauth.yandex.ru/client/new (указать название приложения, дать все права
* в разделе Яндекс.Диск REST API, в Callback URL подставить URL для разработки). В свойствах созданного приложения
* будут приведены ID и пароль приложения.
*
* OAuth-токен можно получить вручную согласно этой инструкции https://tech.yandex.ru/oauth/doc/dg/tasks/get-oauth-token-docpage/
* Либо, оставив поле token в $yandexDiskConfig пустым, указать в этом сценарии свои логин и пароль для доступа к сервисам Яндекса,
* тогда токен будет запрашиваться у Яндекса при каждом запуске сценария. Рекомендую запросить токен таким образом однократно, а в
* дальнейшем полученный токен указывать непосредственно в $yandexDiskConfig).
*
* Если имеется несколько учеток к Яндекс.Диск, то достаточно создать только одно приложение и указывать его ID и пароль при
* получении токена для другой учетки.
*
* Copyright (C) 2014-2015 Agaphonov Dmitri aka skysilver [mailto:skysilver.da@gmail.com]
*/
/*
Конфигурация и параметры
*/
$numberOfCloudBackups = gg('dailyBackup.numberOfCloudBackups'); // количество хранимых бэкапов в облаке (в днях)
$numberOfLocalBackups = gg('dailyBackup.numberOfLocalBackups'); // количество хранимых бэкапов локально (в днях)
$cloudBackupFolder = gg('dailyBackup.cloudBackupFolder'); // каталог для бэкапов в облаке (например, /backups)
$localBackupFolder = gg('dailyBackup.localBackupFolder'); // локальный каталог для бэкапов (например, /home/skysilver/backups)
// Путь к вспомогательному shell-скрипту
// У пользователя www-data нет права чтения некоторых каталогов. Поэтому, чтобы была возможность такие
// каталоги архивировать, для запуска линуксовых команд используется shell-скрипт, который благодаря sudo
// может запускаться с правами root под пользователем www-data.
// Чтобы дать пользователю www-data возможность запускать этот скрипт от root,
// необходимо в /etc/sudoers добавить строку www-data ALL=(root) NOPASSWD: /путь_до_скрипта/backup.sh
$shellScript = "/usr/src/backupmd.sh";
// Определим путь к текущему (сегодняшнему) локальному каталогу и каталогу на Яндекс Диск
$todayLocalFolder = $localBackupFolder."/".date('Y-m-d');
$todayCloudFolder = $cloudBackupFolder."/".date('Y-m-d');
// Архивируемые БД и реквизиты доступа к ним.
$databases = [
['login' => gg('dailyBackup.mysqlUser'), 'password' => gg('dailyBackup.mysqlPassword'), 'dbname' => 'db_terminal'],
['login' => gg('dailyBackup.mysqlUser'), 'password' => gg('dailyBackup.mysqlPassword'), 'dbname' => 'torrentmonitor'],
['login' => gg('dailyBackup.mysqlUser'), 'password' => gg('dailyBackup.mysqlPassword'), 'dbname' => 'zm'],
];
// Архивируемые каталоги
$dirs = [
//['name' => 'etc', 'path' => '/etc'],
['name' => 'mysql', 'path' => '/media/d5c56356-c68d-4a48-8976-203b9de5448e/mysql-data'],
//['name' => 'logs', 'path' => '/var/log'],
['name' => 'SmartHome', 'path' => '/media/d5c56356-c68d-4a48-8976-203b9de5448e/smarthome'],
];
// Реквизиты доступа к Яндекс Диск
// Если токен уже получен, то параметры app_id, app_secret, login и password можно не заполнять.
// Если токена нет, то заполняем все поля, а поле token оставляем пустым (равным '').
$yandexDiskConfig = [
'app_id' => gg('YaDisk1.app_id'), // идентификатор приложения
'app_secret' => gg('YaDisk1.app_secret'), // секретный ключ (пароль) приложения
'token' => gg('YaDisk1.token'), // OAuth-токен
//'login' => gg('YaDisk1.login'), // логин пользователя
//'password' => gg('YaDisk1.password'), // пароль пользователя
];
// Писать логи ( 0-нет, 1-только критические, 2-все )
$reclog = 2;
// Т.к. архивирование и загрузка файлов в облако может занимать неопределенное время,
// то снимем ограничение на время выполнения php-скрипта (по умолчанию в моем конфиге php.ini задано 90 секунд).
set_time_limit(0);
/*
Оповещение
*/
say('Начинаю архивацию данных на сервере.', 1);
// Открываем лог, если нужно.
if ($reclog) { $log = getLogger('script.backupServer'); }
if ($reclog == 2) $log->trace('Начало резервного копирования данных на сервере.');
/*
Архивация БД и каталогов сервера на локальный диск
*/
if ($reclog == 2) $log->trace('Этап 1. Архивация БД и каталогов сервера на локальный диск.');
// Проверяем, создан или нет общий каталог для бэкапов. Если нет, то создаем.
if (!is_dir($localBackupFolder)) {
if ($reclog == 2) $log->trace(sprintf('Создаем общий каталог %s на локальном диске.', $localBackupFolder));
if (!mkdir($localBackupFolder, 0777)) {
if ($reclog) $log->error('Не удалось создать общий каталог на локальном диске.');
return;
} else {
if ($reclog == 2) $log->trace('Общий каталог успешно создан.');
}
} else {
if ($reclog == 2) $log->trace('Общий каталог для бэкапов уже создан на локальном диске.');
}
// Проверяем, создан или нет каталог для ежедневного бэкапа. Если нет, то создаем.
if (!is_dir($todayLocalFolder)) {
if ($reclog == 2) $log->trace(sprintf('Создаем каталог для ежедневного бэкапа %s на локальном диске.', $todayLocalFolder));
if (!mkdir($todayLocalFolder, 0777)) {
if ($reclog) $log->error('Не удалось создать каталог для ежедневного бэкапа на локальном диске.');
return;
} else {
if ($reclog == 2) $log->trace('Каталог для ежедневного бэкапа успешно создан.');
}
} else {
if ($reclog == 2) $log->trace(sprintf('Каталог для ежедневного бэкапа %s уже создан на локальном диске.', $todayLocalFolder));
}
/* Архивирование баз данных */
$date = date('Y-m-d_H-i');
foreach ($databases as $db) {
$filename = "$todayLocalFolder/mysql_{$db['dbname']}_$date.sql.gz";
// f - force overwrite of output file and compress links
// 1 - compress faster
// 9 - compress better
// mysqldump --opt - аккумулирует в себя сразу несколько опций
// (--add-drop-table, --add-locks, --all, --extended-insert, --quick, --lock-tables)
$cmd = "mysqldump --user={$db['login']} --password={$db['password']} --no-create-db --add-drop-table {$db['dbname']} | gzip -f -4 > $filename";
exec($cmd, $out);
if (!file_exists($filename) || filesize($filename) < 100) {
if ($reclog) $log->error(sprintf('Резервная копия БД %s не создана: %s', $db['dbname'], $out));
} else {
if ($reclog == 2) $log->trace(sprintf('Резервная копия БД %s успешно создана на локальном диске.', $db['dbname']));
}
}
foreach ($dirs as $dir) {
$filename = "$todayLocalFolder/files_{$dir['name']}_$date.tar.gz";
//c - создать архив,
//v - выводить информацию о процессе,
//z - использовать сжатие gzip,
//p - сохраняем данные о владельцах и правах доступа,
//f - пишем архив в файл
//P - don't strip leading `/'s from file names
$cmd = "sudo ".$shellScript." -czpPf $filename {$dir['path']}";
//var_dump($cmd);
exec($cmd, $out);
//var_dump($op);
if (!file_exists($filename) || filesize($filename) < 100) {
if ($reclog) $log->error(sprintf('Резервная копия каталога %s не создана: %s', $dir['name'], $out));
} else {
if ($reclog == 2) $log->trace(sprintf('Резервная копия каталога %s успешно создана на локальном диске.', $dir['name']));
}
}
say('Архивация данных на сервере закончена.', 1);
/*
Копирование локального бэкапа в облако
*/
say('Начинаю копирование локального бэкапа в облако.', 1);
if ($reclog == 2) $log->trace('Этап 2. Копирование локального бэкапа в облако.');
// Создаем объект класса Yandex_Disk
// Если токен еще не получен (не указан в конфиге), то запросим его.
if( $yandexDiskConfig['token'] == '' ) {
$ynd = new Yandex_Disk($yandexDiskConfig);
$myToken = $ynd->getToken();
//echo "<br> Токен = ".$myToken." <br>";
//sg('YaDisk1.token', $myToken);
if ($reclog) $log->error(sprintf('Мой OAuth-токен: %s', $myToken));
if( isset($ynd->error) ) {
if ($reclog) $log->error(sprintf('Ошибка запроса OAuth-токена: %s', $ynd->error));
}
}
else $ynd = new Yandex_Disk($yandexDiskConfig);
// Узнаем доступное место на Яндекс Диске (для справки)
$req = $ynd->get();
if( isset($req['error']) ) {
if ($reclog) $log->error(sprintf('Ошибка запроса метаинформации о диске: %s', $req['message']));
} else {
//Получаем свободное и занятое место
sg('YaDisk1.totalSpace', round(($req['total_space']) / 1024 / 1024 / 1024, 2));
sg('YaDisk1.usedSpace', round(($req['used_space']) / 1024 / 1024 / 1024, 2));
sg('YaDisk1.freeSpace', round(($req['total_space'] - $req['used_space']) / 1024 / 1024 / 1024, 2));
if ($reclog == 2) $log->trace(sprintf('Всего места на Яндекс.Диске: %s ГБ.', gg('YaDisk1.totalSpace')));
if ($reclog == 2) $log->trace(sprintf('Занято данными: %s ГБ.', gg('YaDisk1.usedSpace')));
if ($reclog == 2) $log->trace(sprintf('Свободно: %s ГБ.', gg('YaDisk1.freeSpace')));
}
// Проверяем, создан или нет общий каталог для бэкапов на Яндекс Диске. Если нет, то создаем.
$req = $ynd->resources_get($cloudBackupFolder);
if( isset($req['error']) || $req['path'] != 'disk:'.$cloudBackupFolder) {
if ($reclog == 2) $log->trace(sprintf('Создаем общий каталог %s на Яндекс.Диске.', $todayCloudFolder));
$req = $ynd->resources_put($cloudBackupFolder);
if( isset($ynd->error) ) {
if ($reclog) $log->error(sprintf('Ошибка создания общего каталога на Яндекс.Диск: %s', $ynd->error));
} else {
if ($reclog == 2) $log->trace('Общий каталог успешно создан.');
}
} else {
if ($reclog == 2) $log->trace('Общий каталог для бэкапов уже создан на Яндекс.Диске.');
}
// Если локальный каталог с архивами существует
if (is_dir($todayLocalFolder)) {
// Узнаем содержимое каталога
$files = scandir($todayLocalFolder);
// Проверяем, создан или нет каталог для ежедневного бэкапа на Яндекс Диске. Если нет, то создаем.
$req = $ynd->resources_get($todayCloudFolder);
if( isset($req['error']) || $req['path'] != 'disk:'.$todayCloudFolder) {
if ($reclog == 2) $log->trace(sprintf('Создаем каталог для ежедневного бэкапа %s на Яндекс.Диске.', $todayCloudFolder));
$req = $ynd->resources_put($todayCloudFolder);
if( isset($ynd->error) ) {
if ($reclog) $log->error(sprintf('Ошибка создания каталога для ежедневного бэкапа на Яндекс.Диск: %s', $ynd->error));
} else {
if ($reclog == 2) $log->trace('Каталог для ежедневного бэкапа успешно создан.');
}
} else {
if ($reclog == 2) $log->trace(sprintf('Каталог для ежедневного бэкапа %s уже создан на Яндекс.Диске.', $todayCloudFolder));
}
// Загрузим все файлы архивов на Яндекс Диск
foreach($files as $file) {
if(($file != ".") && ($file != "..")) {
if(is_file($todayLocalFolder."/".$file)) {
$fileCloudPath = $todayCloudFolder."/".$file;
$fileLocalPath = $todayLocalFolder."/".$file;
// Если файл с таким же именем уже существует, то будет переписан.
if ($reclog == 2) $log->trace(sprintf('Загрузка на Яндекс.Диск: %s [%s Байт]', $file, filesize($fileLocalPath)));
$req = $ynd->file_upload($fileCloudPath, $fileLocalPath);
}
}
}
}
say('Копирование локального бэкапа в облако завершено.', 1);
/*
Ротация бэкапов на локальном диске и в облаке
*/
say('Начинаю ротацию резервных копий.', 1);
if ($reclog == 2) $log->trace('Этап 3. Ротация бэкапов на локальном диске и в облаке.');
/* Ротация бэкапов на локальном диске */
// Если локальный каталог с архивами существует
if (is_dir($localBackupFolder)) {
// Узнаем содержимое каталога
$req = scandir($localBackupFolder);
// Если каталог с архивами не пустой (не учитываем текущую '.' и родительскую '..' директории)
if ((count($req) - 2) != 0) {
// Составим список всех подкаталогов
for ($i = 0, $j = 0; $i < count($req); $i++) {
if ((is_dir($localBackupFolder."/".$req[$i])) && ($req[$i] != ".") && ($req[$i] != "..")) {
// Берем имя (путь) подкаталога и время создания
$locallist[$j]['path'] = $localBackupFolder."/".$req[$i];
$locallist[$j]['created'] = filemtime($localBackupFolder."/".$req[$i]);
$j += 1;
}
}
if ($reclog == 2) $log->trace(sprintf('Найдено %s каталогов на локальном диске.', count($locallist)));
// Если архивов больше, чем требуется, то удалим часть старых.
if (count($locallist) > $numberOfLocalBackups) {
if ($reclog == 2) $log->trace('Архивов больше, чем требуется. Удалим часть старых.');
// Отсортируем по дате создания
arraySort($locallist, 'created');
// Исключим из удаляемых нужное количество "свежих" архивов
array_splice($locallist, -$numberOfLocalBackups);
if ($reclog == 2) $log->trace(sprintf('Для удаления %s каталогов.', count($locallist)));
// Удалим старые каталоги с архивами из облака
foreach($locallist as $l) {
removeDirectory($l['path']);
if ($reclog == 2) $log->trace(sprintf('Каталог %s удален с локального диска.', $l['path']));
}
} else {
if ($reclog == 2) $log->trace('Архивов меньше (или равно) требуемого количества. Ничего не удаляем.');
}
}
}
/* Ротация бэкапов на Яндекс Диске */
// Узнаем содержимое каталога
$req = $ynd->resources_get($cloudBackupFolder, '_embedded.path,_embedded.total,_embedded.items.name,_embedded.items.type,_embedded.items.path,_embedded.items.created');
if( isset($req['error']) ) {
if ($reclog) $log->error(sprintf('Ошибка запроса списка каталогов и файлов на Яндекс.Диск: %s', $req['message']));
} else {
// Если каталог с архивами не пустой
if (count($req['_embedded']['items']) != 0) {
// Составим список всех подкаталогов
for ($i = 0; $i < count($req['_embedded']['items']); $i++) {
if ($req['_embedded']['items'][$i]['type'] == 'dir') {
// Берем имя (путь) подкаталога и время создания
$cloudlist[$i]['path'] = $req['_embedded']['items'][$i]['path'];
$cloudlist[$i]['created'] = strtotime($req['_embedded']['items'][$i]['created']);
}
}
if ($reclog == 2) $log->trace(sprintf('Найдено %s каталогов на Яндекс.Диске.', count($cloudlist)));
// Если архивов больше, чем требуется, то удалим часть старых.
if (count($cloudlist) > $numberOfCloudBackups) {
if ($reclog == 2) $log->trace('Архивов больше, чем требуется. Удалим часть старых.');
// Отсортируем по дате создания
arraySort($cloudlist, 'created');
// Исключим из удаляемых нужное количество "свежих" архивов
array_splice($cloudlist, -$numberOfCloudBackups);
if ($reclog == 2) $log->trace(sprintf('Для удаления %s каталогов.', count($cloudlist)));
// Удалим старые каталоги с архивами из облака
foreach($cloudlist as $l) {
$req = $ynd->resources_delete($l['path'], false, true);
if( isset($req['error']) ) {
if ($reclog) $log->error(sprintf('Ошибка удаления каталога %s с Яндекс.Диск: %s', $l['path'], $req['message']));
} else {
if ($reclog == 2) $log->trace(sprintf('Каталог %s удален с Яндекс.Диска.', $l['path']));
}
}
}
else {
if ($reclog == 2) $log->trace('Архивов меньше (или равно) требуемого количества. Ничего не удаляем.');
}
}
}
say('Ротация резервных копий завершена.', 1);
if ($reclog == 2) $log->trace('Завершение резервного копирования данных на сервере.');
|
CallAsterisk
|
Звонок через астериск на указанный номер (с помощью call файла)
if (is_array($params)) {
if($params['text'] != '' && $params['phone'] !='') {
$in_file = '/tmp/alice-temp' . $params['phone'] . time() . '.wav.tmp';
$cmd = 'echo "' . $params['text'] . '" | RHVoice-test -p Anna+CLB -o '. $in_file;
$out_file = '/tmp/alice-temp' . $params['phone'] . time();
$cmd .= '&& sox ' . $in_file . ' -r 8000 -c 1 -s ' . $out_file . '.wav -q';
$cmd .= '&& rm ' . $in_file;
safe_exec($cmd, 1, $out);
$call_file_name = 'alice' . $params['phone'] . time() . '.call';
$call_file = '/tmp/' . $call_file_name;
$fh = fopen($call_file, 'a');
fwrite($fh, 'Channel: SIP/multifon-out/' . $params['phone'] . "\r\n");
fwrite($fh, 'MaxRetries: 3' . "\r\n");
fwrite($fh, 'RetryTime: 180' . "\r\n");
fwrite($fh, 'WaitTime: 30' . "\r\n");
fwrite($fh, 'Application: Playback' . "\r\n");
fwrite($fh, 'Data: ' . $out_file . "\r\n");
fwrite($fh, 'Archive: yes' . "\r\n");
fclose($fh);
rename($call_file, '/var/spool/asterisk/outgoing/' . $call_file_name);
}
}
|
getSceneImage
|
Возвращаем изображение для сцен.
if($params['scene'] == "explay_weather") {
$winter = array("cms/scenes/backgrounds/winter_1067x640.jpg");
$spring = array("cms/scenes/backgrounds/spring_1067x640.jpg");
$summer = array("cms/scenes/backgrounds/summer_1067x640.jpg");
$autumn = array("cms/scenes/backgrounds/autumn_1067x640.jpg",
"cms/scenes/backgrounds/weather_1067x640.jpg");
$seasons = array(0 => $winter,
1 => $spring,
2 => $summer,
3 => $autumn);
$season = $seasons[floor(date('n') / 3) % 4];
$img = $season[rand(0, count($season) - 1)];
if (file_exists($img)) {
header("Content-type: image/jpeg");
readfile($img);
}
} else {
$files = array("cms/scenes/backgrounds/weather_1067x640.jpg",
"cms/scenes/backgrounds/city_1067x640.jpg",
"cms/scenes/backgrounds/plants_1067x640.jpg");
$file = $files[rand(0, 2)];
if (file_exists($file)) {
header("Content-type: image/jpeg");
readfile($file);
}
}
|
getSystemInfo
|
Получение данных о ресурсах сервера.
$uptime = shell_exec("uptime | grep up|awk '{print $3,$4,$5,$6}'");
$uptime = str_replace("day,", "дней", $uptime);
$uptime = str_replace("min,", "минут", $uptime);
setGlobal("ThisComputer.uptime",$uptime);
//$mem=shell_exec("free -m|grep Mem|awk '{print $2,$3,$4}'");
//$mem=explode(" ",$mem);
//$mem="Всего: ".$mem[0]." Занято: ".$mem[1]." Доступно: ".$mem[2];
//setGlobal("ThisComputer.memory",$mem);
//$disk=shell_exec("df -h|grep sda1|awk '{print $2,$3,$5}'"); // p.s. sda1 нужно изменить на свой диск
//$disk=explode(" ",$disk);
//$disk=$disk[1]."/".$disk[0]." ( ".$disk[2].")";
//setGlobal("ThisComputer.driveStatus",$disk);
|
jsonobj
|
Формирование истории значений объекта в json для построения графиков
// Получить имя и проверить
if ( isset($params['name']) ) { $name = $params['name']; } else { returm; }
// Разбить на объект и свойство
$name = explode('.', $name);
// Получить объект по имени
$obj=getObject($name[0]);
// Получить id свойства
$prop_id=$obj->getPropertyByName($name[1], $obj->class_id, $obj->id);
// Получаем VALUE_ID для следующей таблицы
$pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$obj->id."'");
// Получаем таблицу
$arr_s = SQLSelect("SELECT UNIX_TIMESTAMP(ADDED) as ADDED, VALUE FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' ORDER BY ADDED");
// Собрать структуру JSON
$st = $params['callback'].'([';
foreach($arr_s as $s) {
if ($f) { $st .=','; }
$st .= '['.$s['ADDED'].'000,'.$s['VALUE'].']' ;
$f=1;
}
$st .= '])';
// Ответ
echo ($st);
|
petplants
|
$dates=explode("-", date("m-d-Y"));
$then=mktime (0,0,0,$dates[0],$dates[1]+1,$dates[2]);
$now=time();
$how=$then-$now; //Вычисляем колличество секунд до конца дня.
$fishTime = $how + 60*60*20; // 20 часов завтра
$plantsTime = $how + 72000 + 60*60*24*4; //20 часов через 5 дней
$CleanFilterTime = $how + 72000 + 60*60*24*29; //20 часов через 30 дней
if ($params['VALUE'] == 1) {
sg("animalsplants.FishFood", 0);
say('Рыбки покормлены!');
SetTimeOut('FishFood', 'sg("animalsplants.FishFood", 1);', $fishTime);
}
elseif ($params['VALUE'] == 2) {
sg("animalsplants.Plant1Water", 0);
say('Цветок в зале полит!');
SetTimeOut('Plant1Water', 'sg("animalsplants.Plant1Water", 1);', $plantsTime);
}
elseif ($params['VALUE'] == 3) {
sg("animalsplants.Plant2Water", 0);
say('Цветок на кухне полит!');
SetTimeOut('Plant2Water', 'sg("animalsplants.Plant2Water", 1);', $plantsTime);
}
elseif ($params['VALUE'] == 4) {
sg("animalsplants.CleanFilter", 0);
say('Фильтры в аквариумах почищены!');
SetTimeOut('CleanAquaFilter', 'sg("animalsplants.CleanFilter", 1);', $CleanFilterTime);
}
elseif ($params['VALUE'] == 5) {
sg("animalsplants.PlantsWater", 0);
say('Цветы политы! Анечка молодец!');
//SetTimeOut('CleanAquaFilter', 'sg("animalsplants.CleanFilter", 1);', $CleanFilterTime);
}
else {
say('Ничего!');
}
|
PingUsers
|
Проверка пользователей онлайн
$users = "";
$objects = getObjectsByClass("Users");
foreach ($objects as $obj) {
$host = getGlobal($obj['TITLE'] . ".deviceip");
$mac = getGlobal($obj['TITLE'] . ".deviceMacAddr");
$fullname = getGlobal($obj['TITLE'] . ".fullName");
if ($host != '') {
$rec = SQLSelectOne("SELECT * FROM pinghosts WHERE HOSTNAME LIKE '" . DBSafe($host) . "' OR TITLE LIKE '" . DBSafe($host) . "'");
$hostname = $rec['HOSTNAME'];
$online = false;
$online = ping($hostname);
if (!$online) {
if($mac != '') {
$online = onlineLog($mac);
} else {
$online = onlineLog($hostname);
}
}
if ($online) {
if ($users != "") {
$users .= ", ";
}
$users .= $fullname;
setGlobal($obj['TITLE'] . ".deviceOnline", 1);
} else {
//say('Оффлайн');
setGlobal($obj['TITLE'] . ".deviceOnline", 0);
}
}
}
if (!$params['SAY']) {
if ($users != "") {
say($users);
DebMes('Users:' . $users);
}
}
function onlineLog($addr) {
//$debugInfo = '<html><b>start</b><br>';
//var_dump($debugInfo);
$logString = shell_exec("sudo /usr/src/routerlog.sh");
if (isset($logString)) {
$online = false;
$ArrLogString = explode("\n", $logString);
//var_dump(count($ArrLogString));
for ($i = 0; $i < count($ArrLogString); $i++) {
//$tempStr = explode('router.asus.com', $ArrLogString[$i]);
$tempStr = explode('10.0.3.1', $ArrLogString[$i]);
$time = time() - strtotime($tempStr[0]);
//$debugInfo .= $tempStr[0].'<br>';
$min = $time / 60;
//$debugInfo .= $min.'<br>';
//var_dump($min);
if ($min <= 30) {
//$debugInfo .= $tempStr[1].'<br>';
if (substr_count($tempStr[1], $addr) > 0) {
//var_dump(substr_count($tempStr[1], $addr));
$online = true;
//var_dump($online);
}
}
}
} else {
$online = false;
}
if ($online) {
//$debugInfo .= 'true<br></html>';
} else {
//$debugInfo .= 'false<br><b>end</b></html>';
}
//file_put_contents('/media/d5c56356-c68d-4a48-8976-203b9de5448e/smarthome/debuginfo.html', $debugInfo);
return $online;
}
|
sayHook
|
Хук для функции say
/* Хук на функцию say() */
$level = $params['level'];
$ph = $params['ph'];
$out = '';
//echo "Привет, это Элис. С вами говорит шелезяка" | RHVoice-test -p Elena -o /tmp/test.wav
if ($level >= getGlobal('minMsgLevel')) {
//safe_exec('spd-say "'.$ph.'" -w -y anna+clb', 1, $out);
safe_exec('echo "'.$ph.'" | RHVoice-test -p Anna+CLB', 1, $out);
}
|
timer_10s
|
Таймер, который срабатывает раз в 10 секунд. Вызывается ("на всякий случай") раз в минуту из onNewMinute(?).
clearTimeout("timer_10s_timeout");
//$h=(int)date('G',time());
// Код для запуска раз в 10 секунд -------------------->
//setTimeOut("TimerZoneminderAlert", "runScript('ZoneminderAlert');", 1);
runScript('ZoneminderAlert');
runScript('TraccarData');
//include_once(DIR_MODULES . 'telegram/telegram.class.php');
//$telegram = new telegram();
//$telegram->SendMessageToUser(gg('Anna.TelegramId'), "положи мне 400р на телефон");
// Код для запуска раз в 10 секунд -------------------->
setTimeOut("timer_10s_timeout", "runScript('timer_10s');", 10);
|
TraccarData
|
Синхронизация координат с сервером traccar
$db = array('host' => gg('TraccarDB.host'),
'port' => gg('TraccarDB.port'),
'user' => gg('TraccarDB.user'),
'pass' => gg('TraccarDB.pass'),
'db' => gg('TraccarDB.name')
);
$traccardb = new mysql($db['host'],
$db['port'],
$db['user'],
$db['pass'],
$db['db']
);
$last_position = gg('ThisComputer.TraccarLastPosition');
if ($last_position == '') {
$last_position = 0;
}
$res = $traccardb->Select("SELECT id, altitude, latitude, longitude, other, UNIX_TIMESTAMP(serverTime) ts, serverTime, speed, device_id FROM positions WHERE id > " . $last_position . " ORDER BY id");
if ($res) {
foreach ($res as $itm){
sg('ThisComputer.TraccarLastPosition', $itm['id']);
sg('ThisComputer.TraccarLastPositionTime', $itm['ts']);
$other = json_decode(mb_strtolower($itm['other']), true);
$battlevel = $other['battery'];
$provider='YOTA';
$ids = $traccardb->SelectOne("SELECT uniqueId FROM devices WHERE id = " . $itm['device_id']);
if ($ids) {
$deviceid = $ids['uniqueId'];
} else {
$deviceid = 'unknown_id';
}
$url = 'http://10.0.3.100:8183/gps.php?latitude='.$itm["latitude"]
.'&longitude='.$itm["longitude"]
.'&altitude='.$itm["altitude"]
.'&provider='.$provider
.'&speed='.$itm["speed"]
.'&battlevel='.$battlevel
.'&deviceid='.$deviceid;
getURL($url, 0);
}
}
|
WeatherFromYandex
|
Прогноз погоды по данным яндекса.
$objects=getObjectsByClass("YandexWeather"); //имя класса
foreach($objects as $obj) {
$city_id=gg($obj['TITLE'].".city_id"); //ID города узнаем тут: https://pogoda.yandex.ru/static/cities.xml
$data_file="http://export.yandex.ru/weather-ng/forecasts/$city_id.xml?".rand(); // адрес xml файла
//say($data_file);
$xml = simplexml_load_file($data_file); // раскладываем xml на массив
$temp_yesterday=$xml->yesterday->temperature; //узнаем вчерашнюю температуру в это же время
if ($temp_yesterday>0) {$temp_yesterday='+'.$temp_yesterday;} // Если значение температуры положительно, для наглядности добавляем "+"
sg($obj['TITLE'].".TempYesterday",$temp_yesterday);
$temp=$xml->fact->temperature;
if (date('G')==13) {sg($obj['TITLE'].".Temp13h",$temp);}
if (date('G')==21) {sg($obj['TITLE'].".Temp21h",$temp);}
if ($temp>0) {$temp='+'.$temp;} // Если значение температуры положительно, для наглядности добавляем "+"
sg($obj['TITLE'].".Temp",$temp);
sg($obj['TITLE'].".Type",$xml->fact->weather_type);
sg($obj['TITLE'].".Pressure",$xml->fact->pressure);
sg($obj['TITLE'].".Humidity",$xml->fact->humidity);
sg($obj['TITLE'].".WindSpeed",$xml->fact->wind_speed);
sg($obj['TITLE'].".Image",$xml->fact->{'image-v3'});
$rain1=gg($obj['TITLE'].".Type");
$rain2=$xml->day[0]->day_part[0]->weather_type;
$rain3=$xml->day[0]->day_part[1]->weather_type;
$rain4=$xml->day[0]->day_part[2]->weather_type;
$rain5=$xml->day[0]->day_part[3]->weather_type;
$rain=($rain1. $rain2. $rain3. $rain4. $rain5);
$pos = strpos($rain, "дожд");
if ($pos === false) {
sg($obj['TITLE'].".Rain",0);
} else {
sg($obj['TITLE'].".Rain",1);
// say("Возможен дождь",2);
}
$dir = $xml->fact->wind_direction;
switch ($dir){
case 's':
$dir="южный";
break;
case 'n':
$dir="северный";
break;
case 'w':
$dir="западный";
break;
case 'e':
$dir="восточный";
break;
case 'sw':
$dir="юго-западный";
break;
case 'nw':
$dir="северо-западный";
break;
case 'se':
$dir="юго-восточный";
break;
case 'ne':
$dir="северо-восточный";
break;
case 'calm':
$dir="штиль";
break;
}
sg($obj['TITLE'].".WindDir",$dir);
sg($obj['TITLE'].".SunRise",$xml->day[0]->sunrise);
sg($obj['TITLE'].".SunSet",$xml->day[0]->sunset);
// $metcast="";
$metcast="На улице ".gg($obj['TITLE'].".Type").".";
// ветер
$WindSpeed=(float)gg($obj['TITLE'].".WindSpeed");
if ($WindSpeed<1) { $metcast.=' Ветра, скорее всего, нет.';
} elseif ($WindSpeed<3) { $metcast.=' Возможен слабый ветер.';
} elseif ($WindSpeed<6) { $metcast.=' Возможен сильный ветер.';
} elseif ($WindSpeed<9) { $metcast.=' Возможен довольно сильный ветер.';
} else { $metcast.=' Возможен очень сильный ветер.';
}
$w=round(strip_tags(gg($obj['TITLE'].".Temp")));
$tempw=$w;
if($w < "0"){ $tempw=abs($w); }
if($w > "0"){ $templus=" плюс "; }
if($tempw >= 11 and $tempw <= 14){ $tempcels=" градусов";}
else{
while ($tempw > 9){
$tempw=$tempw-10;
}
if($tempw == 0 or $tempw >= 5 and $tempw <= 9){ $tempcels=" градусов"; }
if($tempw == 1){ $tempcels=" градус"; }
if($tempw >= 2 and $tempw <= 4){ $tempcels=" градуса"; }
}
$metcast.=' Температура '.gg($obj['TITLE'].".Temp").' '.$tempcels.'.';
$tm=(float)gg($obj['TITLE'].".Temp");
if ($tm<-40) { $metcast.=' Мы морозов не боимся!';
} elseif ($tm<-30) { $metcast.=' Очень холодно, оденьтесь теплее.';
} elseif ($tm<-20) { $metcast.=' Самое время есть мороженое.';
} elseif ($tm<-10) { $metcast.=' Холодновато.';
} elseif ($tm<-3) { $metcast.=' Не особо холодно.';
} elseif ($tm<3) { $metcast.=' Значит, возможно, гололёд.';
} elseif ($tm<10) { $metcast.=' Тепловато.';
} elseif ($tm<25) { $metcast.=' Тепло.';
} elseif ($tm<30) { $metcast.=' Жарко.';
} elseif ($tm>30) { $metcast.=' Ташкент.';
}
// $metcast.=' Восход солнца сегодня в '.gg($obj['TITLE'].".SunRise").',';
// $metcast.=' закат в '.gg($obj['TITLE'].".SunSet").'.';
sg($obj['TITLE'].".metcast",$metcast);
//
$w3days="Сегодня ночью будет ";
$temp=$xml->day[0]->day_part[3]->temperature_from;
if ($temp>0) {$temp='+'.$temp;}
$w3days.=$temp;
$w3days.="°, ";
$w3days.=$xml->day[0]->day_part[3]->weather_type;
$w3days.=".\r\nЗавтра днём будет ";
$temp=$xml->day[1]->day_part[1]->temperature_from;
if ($temp>0) {$temp='+'.$temp;}
$w3days.=$temp;
$w3days.="°, ";
$w3days.=$xml->day[1]->day_part[1]->weather_type;
$w3days.=". Послезавтра ночью ";
$temp=$xml->day[1]->day_part[3]->temperature_from;
if ($temp>0) {$temp='+'.$temp;}
$w3days.=$temp;
$w3days.="°, ";
$w3days.=$xml->day[1]->day_part[3]->weather_type;
$w3days.=".";
$dir1 = $xml->fact->season;
switch ($dir1){
case 'winter':
$dir1="зима";
break;
case 'summer':
$dir1="лето";
break;
case 'autumn':
$dir1="осень";
break;
case 'spring':
$dir1="весна";
break;
}
sg($obj['TITLE'].".season",$dir1); //время года
sg($obj['TITLE'].".forecast",$w3days);
sg($obj['TITLE'].".updated" , date("H:i",time()));}
//say("Читаю прогноз погоды с Yandex", 0);
|
ZoneminderAlert
|
Обнаружение движения в Zoneminder и отправка уведомлений на электронную почту.
$db = array('host' => gg('ZoneminderDB.host'),
'port' => gg('ZoneminderDB.port'),
'user' => gg('ZoneminderDB.user'),
'pass' => gg('ZoneminderDB.pass'),
'db' => gg('ZoneminderDB.name')
);
$zmdb = new mysql($db['host'], $db['port'], $db['user'], $db['pass'], $db['db']
);
$last_event = gg('ThisComputer.ZmLastEvent');
if ($last_event == '') {
$last_event = 0;
}
$last_event_time = gg('ThisComputer.ZmLastEventTime');
if ($last_event_time == '') {
$last_event_time = 0;
}
$res = $zmdb->Select("SELECT Id, UNIX_TIMESTAMP(StartTime) ts, StartTime, MonitorId FROM Events WHERE Id > " . $last_event . " AND AlarmFrames > 10 ORDER BY id DESC"); //10 AlarmFrames для фильтра ложных срабатываний, по идее должно быть 0
if ($res) {
for ($i = 0; $i < count($res); $i++) {
if ($i == 0) {
sg('ThisComputer.ZmLastEvent', $res[$i]['Id']);
sg('ThisComputer.ZmLastEventTime', $res[$i]['ts']);
if (gg('NobodyHomeMode.active')) {
if ($res[$i]['MonitorId'] != 5) {
$img_path = "/usr/share/zoneminder/events/" . $res[$i]['MonitorId'] . "/" . date("y/m/d/H/i/s/", $res[$i]["ts"]);
$frames = $zmdb->Select("SELECT FrameId FROM Frames WHERE EventId = " . $res[$i]['Id'] . " AND Type = 'Alarm' ORDER BY id DESC");
$img_arr = array();
for ($j = 0; $j < count($frames); $j++) {
$img_arr[] = $img_path . str_pad($frames[$j]['FrameId'], 5, '0', STR_PAD_LEFT) . '-analyse.jpg';
//if ($j == 5) {
// break;
//}
}
$img_arr = array_reverse($img_arr);
$str_room = 'в доме';
if ($res[$i]['MonitorId'] == 3) {
$str_room = 'в комнате';
} elseif ($res[$i]['MonitorId'] == 4) {
$str_room = 'на кухне';
}
$gifImage = CreateGif($img_arr, win2uni("Камера " . $str_room . date("Y-m-d H:i:s")));
include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram = new telegram();
$mes = 'Обнаружено движение ' . $str_room . ' . Расходились тут...';
$objects = getObjectsByClass("Users");
$from = gg('ThisComputer.emailFrom');
foreach ($objects as $obj) {
if (gg($obj['TITLE'] . ".emailNotifications") && !gg($obj['TITLE'] . ".deviceOnline")) {
if (gg($obj['TITLE'] . ".email") != "") {
$to = gg($obj['TITLE'] . '.email');
$subject = utf2win("Обнаружено движение " . $res[$i]['StartTime']);
$body = utf2win('Обнаружено движение ' . $str_room . ' . Расходились тут...');
SendMail_html($from, $to, $subject, $body, array_slice($img_arr, 0, 5));
}
if (gg($obj['TITLE'] . ".TelegramId") != "") {
//$telegram->SendImageToUser(gg($obj['TITLE'] . '.TelegramId'), $img_arr[rand(0, count($img_arr)-1)], $mes);
$telegram->SendMessageToUser(gg($obj['TITLE'] . '.TelegramId'), $mes);
$telegram->SendFileToUser(gg($obj['TITLE'] . '.TelegramId'), $gifImage);
}
}
}
//runScript('GifAnimate', array('images' => $img_arr));
}
}
}
if ($res[$i]['MonitorId'] == 3) {
callMethod("sensorMovementBedroom.statusChanged", array("status" => "1"));
//say('Камера в комнате');
} elseif ($res[$i]['MonitorId'] == 4) {
callMethod("sensorMovementKitchen.statusChanged", array("status" => "1"));
//say('Камера на кухне!');
}
}
} else {
//return NULL;
}
function CreateGif($images, $text = "Hello World") {
$gifFile = 'cached/animegif_temp.gif';
$percent = 320; // Ширина изображения миниатюры
foreach ($images as $img) {
// Open the first source image, resize and add the text.
//
list($width, $height) = getimagesize($img); // Возвращает ширину и высоту
$newheight = $height * $percent;
$newwidth = $newheight / $width;
$image = imagecreatetruecolor($percent, $newwidth);
$source = imagecreatefromjpeg($img);
imagecopyresized($image, $source, 0, 0, 0, 0, $percent, $newwidth, $width, $height);
//$text_color = imagecolorallocate($image, 200, 200, 200);
//imagestring($image, 5, 5, 10, $text, $text_color);
// Generate GIF from the $image
// We want to put the binary GIF data into an array to be used later,
// so we use the output buffer.
//
ob_start();
imagegif($image);
$frames[] = ob_get_contents();
$framed[] = 30; // Delay in the animation.
ob_end_clean();
}
@imagedestroy($image);
@imagedestroy($source);
// Generate the animated gif and output to screen.
$gif = new GIFEncoder($frames, $framed, 0, 2, 0, 0, 0, 'bin');
$fp = fopen($gifFile, 'w');
fwrite($fp, $gif->GetAnimation());
fclose($fp);
return $gifFile;
}
// Преобразование Windows 1251 -> Unicode
function win2uni($s) {
$s = convert_cyr_string($s,'w','i'); // преобразование win1251 -> iso8859-5
// преобразование iso8859-5 -> unicode:
for ($result='', $i=0; $i<strlen($s); $i++) {
$charcode = ord($s[$i]);
$result .= ($charcode>175)?"&#".(1040+($charcode-176)).";":$s[$i];
}
return $result;
}
|
ZoneminderHashGenerator
|
$now = time();
$time = localtime( $now );
$ZmSecretString = gg('ThisComputer.ZmSecretString');
$authKey = $ZmSecretString . $time[2] . $time[3] . $time[4] . $time[5];
$authHash = md5($authKey);
sg('ZmAuthHash', $authHash);
|
Обновление YandexDNS
|
$token = gg('ThisComputer.YandexDNSToken');
$domain = gg('ThisComputer.YandexDNSRootDomain');
$ttl = "300";
function get_real_ip_old() {
$a = file_get_contents("http://internet.yandex.ru/");
$start = mb_strpos($a, "IPv4:") + 6;
$a = mb_substr($a, $start);
$end = mb_strpos($a, " ");
$ip = mb_substr($a, 0, $end);
echo "Ваш IP-адрес: " . $_SERVER["REMOTE_ADDR"];
if (preg_match('/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])' . '\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|[0-9])$/', $ip) == FALSE) {
die(date("Y-m-d H:i:s") . " - Получил не правильный IP адресс -" . $ip);
}
return trim($ip);
}
function get_real_ip() {
/*
http://www.telize.com/ip
http://api.ipify.org/?format=json
http://api.ipify.org/
http://what-is-my-ip.net/?json
http://what-is-my-ip.net/?text
http://ipinfo.io/ip
http://curlmyip.com/
http://dns-ip.ru/home/simple
*/
$ip = file_get_contents("http://ru.smart-ip.net/myip");
if (preg_match('/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])' . '\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|[0-9])$/', $ip) == FALSE) {
die(date("Y-m-d H:i:s") . " - Получил не правильный IP адресс -" . $ip);
}
return trim($ip);
}
function get_yandex_data($token, $domain) {
$res = file_get_contents("https://pddimp.yandex.ru/nsapi/get_domain_records.xml" .
"?token=" . $token .
"&domain=" . $domain
);
$xml = simplexml_load_string($res);
return $xml;
}
function edit_a_record($token, $domain, $subdomain, $record_id, $new_ip, $ttl) {
$answer = file_get_contents("https://pddimp.yandex.ru/nsapi/edit_a_record.xml" .
"?token=" . $token .
"&ttl=" . $ttl .
"&subdomain=" . $subdomain .
"&record_id=" . $record_id .
"&content=$new_ip"
);
return $answer;
}
$domainCount = 0;
$real_ip = get_real_ip();
$ya_data = get_yandex_data($token, $domain);
for ($i = 0; $i < count($ya_data->domains->domain->response->record); $i++) {
if (strval($ya_data->domains->domain->response->record[$i]['type'] == "A")) {
$ip = strval($ya_data->domains->domain->response->record[$i]);
$subdomain = strval($ya_data->domains->domain->response->record[$i]['subdomain']);
$id = strval($ya_data->domains->domain->response->record[$i]['id']);
if ($ip != $real_ip) {
edit_a_record($token, $domain, $subdomain, $id, $real_ip, $ttl);
//echo date("Y-m-d H:i:s")." - Изменил запись для домена ".$subdomain.".".$domain." из ".$ip." на ".$real_ip;
//say('Ай-пи адрес изменился на ' . $real_ip);
$domainCount++;
}
}
}
if ($domainCount > 0) {
//$domainCount++;
say('Ай-пи адрес для ' . $domainCount . ' доменов изменился на ' . $real_ip);
}
|
ПроверкаПосылок
|
$items = SQLSelect("SELECT TRACK_ID, TRACK_NAME FROM POST_TRACK WHERE FLAG_CHECK='Y'");
$total = count($items);
if ($total) {
$postel = '';
for ($i=0; $i < $total; $i++) {
$el=SQLSelect("SELECT * FROM POST_TRACKINFO WHERE TRACK_ID="."'".$items[$i]['TRACK_ID']."'"." AND ATTRIB_ID=2");
if($el) {
//say("Получить на почте " . $items[$i]['TRACK_NAME']);
$postel = $postel . $items[$i]['TRACK_NAME'];
if ($i < $total - 1) {
$postel .= ', ';
} else {
$postel .= '.';
}
}
}
say('Не забудьте получить на почте: ' . $postel);
}
else {
//say("Нет посылок");
}
|
РасширенноеПредставлениеДаты
|
Расширенное описание даты.
function getDateInfo($date) {
$days = array('воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота');
$months = array(1 => 'январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь');
$months2 = array(1 => 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря');
$daymonth = array(1 => 'первое', 'второе', 'третье', 'четвертое', 'пятое', 'шестое', 'седьмое', 'восьмое', 'девятое', 'десятое', 'одиннадцатое', 'двенадцатое', 'тринадцатое', 'четырнадцатое', 'пятнадцатое', 'шестнадцатое', 'семнадцатое', 'восемнадцатое', 'девятнадцатое', 'двадцатое', 'двадцать первое', 'двадцать второе', 'двадцать третье', 'двадцать четвертое', 'двадцать пятое', 'двадцать шестое', 'двадцать седьмое', 'двадцать восьмое', 'двадцать девятое', 'тридцатое', 'тридцать первое');
$dateInfo = array();
$dateInfo['this_year'] = (int) date('Y', $date);
$dateInfo['day_num'] = (int) date('w', $date);
$dateInfo['month_num'] = (int) date('m', $date);
$dateInfo['day_month'] = (int) date('j', $date);
$dateInfo['day_of_month'] = $daymonth[$dateInfo['day_month']];
$dateInfo['day_of_week'] = $days[$dateInfo['day_num']];
$dateInfo['month_txt1'] = $months[$dateInfo['month_num']];
$dateInfo['month_txt2'] = $months2[$dateInfo['month_num']];
return $dateInfo;
}
function weekDay($date) {
$this_year = (int) date('Y', $date);
//Загружаем производственный календарь
$productionCalendar = @file_get_contents('http://xmlcalendar.ru/data/ru/' . $this_year . '/calendar.xml');
if ($productionCalendar) { //Если прочитали без ошибок
sg('DateTime.productionCalendar', $productionCalendar); //Запишем на всякий случай))
} else { //Если не прочиталось
$productionCalendar = gg('DateTime.productionCalendar'); // Возьмем ранее загруженный календарь
}
//Проверяем сегодняшний день по производственному календарю (рабочий или нет)
$weekDay = -1;
$this_date = date('m.d', $date);
$calend = new SimpleXMLElement($productionCalendar);
foreach ($calend->days->day as $day) {
$type = $day->attributes()->t; //тип дня: 1 - выходной день, 2 - короткий день, 3 - рабочий день (суббота/воскресен)
$CalDate = $day->attributes()->d; //дата
if ($this_date == $CalDate) {
if ($type == 1) { //выходной
$weekDay = 0;
} elseif ($type == 2) {
//Короткий день
$weekDay = 1;
} elseif ($type == 3) { //Перенесенный рабочий
$weekDay = 1;
}
}
}
//Если в производственном календаре ничего не нашлось
if ($weekDay == -1) {
if (date('w', $date) == 0 || date('w', $date) == 6) {
$weekDay = 0;
} else {
$weekDay = 1;
}
}
return $weekDay;
}
$today = getDateInfo(strtotime("now"));
$tomorrow = getDateInfo(strtotime("+1 day"));
$today['weekDay'] = weekDay(strtotime("now"));
$tomorrow['weekDay'] = weekDay(strtotime("+1 day"));
//Сохраняем данные
sg('DateTime.DateNow',date( "d.m.Y", time()));
//Сегодня
sg('today.thisYear', $today['this_year']);
sg('today.monthNum', $today['month_num']);
sg('today.monthTXT', $today['month_txt1']);
sg('today.monthTXTalt', $today['month_txt2']);
sg('today.dayOfMonthNum', $today['day_month']);
sg('today.dayOfMonthTXT', $today['day_of_month']);
sg('today.dayOfWeekTXT', $today['day_of_week']);
sg('today.dayOfWeekNum', $today['day_num']);
sg('today.isWeekDay', $today['weekDay']);
//Сегодня (временно, потом удалить, ибо объекты переносятся
sg('ThisComputer.DateNow',date( "d.m.Y", time()));
sg('ThisComputer.thisYear', $today['this_year']);
sg('ThisComputer.MonthNum', $today['month_num']);
sg('ThisComputer.MonthTXT', $today['month_txt1']);
sg('ThisComputer.MonthTXTalt', $today['month_txt2']);
sg('ThisComputer.DayOfMonthNum', $today['day_month']);
sg('ThisComputer.DayOfMonthTXT', $today['day_of_month']);
sg('ThisComputer.DayOfWeekTXT', $today['day_of_week']);
sg('ThisComputer.DayOfWeekNum', $today['day_num']);
//Завтра
sg('tomorrow.thisYear', $tomorrow['this_year']);
sg('tomorrow.monthNum', $tomorrow['month_num']);
sg('tomorrow.monthTXT', $tomorrow['month_txt1']);
sg('tomorrow.monthTXTalt', $tomorrow['month_txt2']);
sg('tomorrow.dayOfMonthNum', $tomorrow['day_month']);
sg('tomorrow.dayOfMonthTXT', $tomorrow['day_of_month']);
sg('tomorrow.dayOfWeekTXT', $tomorrow['day_of_week']);
sg('tomorrow.dayOfWeekNum', $tomorrow['day_num']);
sg('tomorrow.isWeekDay', $tomorrow['weekDay']);
|
CallAsterisk1
|
Звонок через астериск на указанный номер (с помощью call файла)
if (is_array($params)) {
if($params['text'] != '' && $params['phone'] !='') {
$in_file = '/tmp/alice-temp' . $params['phone'] . time() . '.wav.tmp';
$cmd = 'echo "' . $params['text'] . '" | RHVoice-test -p Anna+CLB -o '. $in_file;
$out_file = '/tmp/alice-temp' . $params['phone'] . time();
$cmd .= '&& sox ' . $in_file . ' -r 8000 -c 1 -s ' . $out_file . '.wav -q';
$cmd .= '&& rm ' . $in_file;
safe_exec($cmd, 1, $out);
$call_file_name = 'alice' . $params['phone'] . time() . '.call';
$call_file = '/tmp/' . $call_file_name;
$fh = fopen($call_file, 'a');
fwrite($fh, 'Channel: SIP/multifon3034-out/' . $params['phone'] . "\r\n");
fwrite($fh, 'MaxRetries: 3' . "\r\n");
fwrite($fh, 'RetryTime: 180' . "\r\n");
fwrite($fh, 'WaitTime: 30' . "\r\n");
fwrite($fh, 'Application: Playback' . "\r\n");
fwrite($fh, 'Data: ' . $out_file . "\r\n");
fwrite($fh, 'Archive: yes' . "\r\n");
fclose($fh);
rename($call_file, '/var/spool/asterisk/outgoing/' . $call_file_name);
}
}
|
Demo
|
rs('DemoSay', 'Ну как, понравилось?');
|
DemoSay
|
$ph=$params;
$level = 0;
safe_exec('spd-say "'.win2utf($ph).'" -w -y anna+clb', 1, $level);
|
facedetect
|
Определение лиц на изображении с веб камеры
function LoadJpeg($imgname) {
$im = @imagecreatefromjpeg($imgname); /* Attempt to open */
if (!$im) { /* See if it failed */
$im = imagecreate(150, 30); /* Create a blank image */
$bgc = imagecolorallocate($im, 255, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
/* Output an errmsg */
imagestring($im, 1, 5, 5, "Error loading $imgname", $tc);
}
return $im;
}
function SaveJpeg($image) {
$name = 'cached/faces_detected/' . md5(microtime() . rand(0, 9999)) . '.jpg';
imagejpeg($image, $name);
}
if ($params['img'] != '') {
$imgfile = $params['img'];
} else {
$imgfile = 'temp/facedetect/facetest4.jpg';
}
include_once(ROOT . 'lib/FaceDetector/FaceDetector.php');
$detector = new FaceDetector();
$detector->scan($imgfile);
$faces = $detector->getFaces();
$im = LoadJpeg($imgfile);
$w = 120;
foreach($faces as $face)
{
$crop_face = imagecreatetruecolor($w, $w);
imagecopyresampled($crop_face, $im, 0, 0, $face['x'], $face['y'], $w, $w, $face['width'], $face['width']);
SaveJpeg($crop_face);
imagedestroy($crop_face);
}
imagedestroy($im);
|
GifAnimate
|
$img_arr = $params['images'];
$percent = 320; // Ширина изображения миниатюры
$text = "Hello World";
foreach ($img_arr as $img) {
// Open the first source image, resize and add the text.
//
list($width, $height) = getimagesize($img); // Возвращает ширину и высоту
$newheight = $height * $percent;
$newwidth = $newheight / $width;
$image = imagecreatetruecolor($percent, $newwidth);
$source = imagecreatefromjpeg($img);
imagecopyresized($image, $source, 0, 0, 0, 0, $percent, $newwidth, $width, $height);
$text_color = imagecolorallocate($image, 200, 200, 200);
imagestring($image, 5, 5, 10, $text, $text_color);
// Generate GIF from the $image
// We want to put the binary GIF data into an array to be used later,
// so we use the output buffer.
//
ob_start();
imagegif($image);
$frames[] = ob_get_contents();
$framed[] = 30; // Delay in the animation.
ob_end_clean();
}
@imagedestroy($image);
@imagedestroy($source);
// Generate the animated gif and output to screen.
$gif = new GIFEncoder($frames, $framed, 0, 2, 0, 0, 0, 'bin');
//echo $gif->GetAnimation();
$fp = fopen('cached/animegif_temp.gif', 'w');
fwrite($fp, $gif->GetAnimation());
fclose($fp);
include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram = new telegram();
$telegram->SendFileToUser(gg('Me.TelegramId'), 'cached/animegif_temp.gif');
$telegram->SendFileToUser(gg('Anna.TelegramId'), 'cached/animegif_temp.gif');
|
GifAnimateTest
|
header('Content-type:image/gif');
$db = array('host' => gg('ZoneminderDB.host'),
'port' => gg('ZoneminderDB.port'),
'user' => gg('ZoneminderDB.user'),
'pass' => gg('ZoneminderDB.pass'),
'db' => gg('ZoneminderDB.name')
);
$zmdb = new mysql($db['host'], $db['port'], $db['user'], $db['pass'], $db['db']
);
$last_event = 0;
$res = $zmdb->SelectOne("SELECT Id, UNIX_TIMESTAMP(StartTime) ts, StartTime, MonitorId FROM Events WHERE Id > " . $last_event . " AND AlarmFrames > 10 ORDER BY id DESC"); //10 AlarmFrames для фильтра ложных срабатываний, по идее должно быть 0
$img_path = "/usr/share/zoneminder/events/" . $res['MonitorId'] . "/" . date("y/m/d/H/i/s/", $res["ts"]);
$frames_cam = $zmdb->Select("SELECT FrameId FROM Frames WHERE EventId = " . $res['Id'] . " AND Type = 'Alarm' ORDER BY id DESC");
$img_arr = array();
for ($j = 0; $j < count($frames_cam); $j++) {
$img_arr[] = $img_path . str_pad($frames_cam[$j]['FrameId'], 5, '0', STR_PAD_LEFT) . '-analyse.jpg';
//if ($j == 5) {
//break;
//}
}
$img_arr = array_reverse($img_arr);
RunScript('GifAnimate', array('images' => $img_arr));
/*
$percent = 320; // Ширина изображения миниатюры
$text = "Hello World";
foreach ($img_arr as $img) {
// Open the first source image, resize and add the text.
//
list($width, $height) = getimagesize($img); // Возвращает ширину и высоту
$newheight = $height * $percent;
$newwidth = $newheight / $width;
$image = imagecreatetruecolor($percent, $newwidth);
$source = imagecreatefromjpeg($img);
imagecopyresized($image, $source, 0, 0, 0, 0, $percent, $newwidth, $width, $height);
$text_color = imagecolorallocate($image, 200, 200, 200);
imagestring($image, 5, 5, 10, $text, $text_color);
// Generate GIF from the $image
// We want to put the binary GIF data into an array to be used later,
// so we use the output buffer.
//
ob_start();
imagegif($image);
$frames[] = ob_get_contents();
$framed[] = 30; // Delay in the animation.
ob_end_clean();
}
@imagedestroy($image);
@imagedestroy($source);
// Generate the animated gif and output to screen.
$gif = new GIFEncoder($frames, $framed, 0, 2, 0, 0, 0, 'bin');
//echo $gif->GetAnimation();
$fp = fopen('cached/animegif_temp.gif', 'w');
fwrite($fp, $gif->GetAnimation());
fclose($fp);
include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram = new telegram();
$telegram->SendFileToUser(gg('Me.TelegramId'), 'cached/animegif_temp.gif');
*/
|
HardwareMonitor
|
$load_avg_json = shell_exec("/usr/local/bin/hvmonitor_sh/load_avg.sh");
$load_avg = json_decode($load_avg_json, true);
sg('ThisServer.1_min_avg', $load_avg['1_min_avg']);
sg('ThisServer.5_min_avg', $load_avg['5_min_avg']);
sg('ThisServer.15_min_avg', $load_avg['15_min_avg']);
$cpu_temp_json = shell_exec("/usr/local/bin/hvmonitor_sh/cpu_temp.sh");
$cpu_temp = json_decode($cpu_temp_json, true);
sg('ThisServer.cpu_temp', $cpu_temp['temperature']);
$current_ram_json = shell_exec("/usr/local/bin/hvmonitor_sh/current_ram.sh");
$current_ram = json_decode($current_ram_json, true);
sg('ThisServer.ram_total', $current_ram['total']);
sg('ThisServer.ram_used', $current_ram['used']);
sg('ThisServer.ram_free', $current_ram['free']);
|
iiibot_test
|
define('BOT_TOKEN', '8a5526de-f601-4f35-ba33-70ce385fffcb'); //Идентификатор бота с iii.ru
class Bot {
protected $key = null;
protected $session = null;
private $salt = 'some very-very long string without any non-latin characters due to different string representations inside of variable programming languages';
/**
* @param $key - Ключ из урла после создания инфа
*/
public function __construct($key) {
$this->key = $key;
}
/**
* @param null $session - Идентификатор сессии существуюющей, если нет то создается новая
* @return string Идентификатор текущей сессии
*/
public function session($session = null) {
if ($session === null) {
$response = file_get_contents('http://iii.ru/api/2.0/json/Chat.init/' . $this->key . '/');
$this->session = $this->decode($response)->result->cuid;
} else {
$this->session = $session;
}
return $this->session;
}
/**
* ОТправить сообщение боту
* @param string $message Сообщение
* @return string Ответ
*/
public function say($message) {
$request = '["' . $this->session . '","' . $message . '"]';
$myCurl = curl_init();
curl_setopt_array($myCurl, array(
CURLOPT_URL => 'http://iii.ru/api/2.0/json/Chat.request',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $this->encode($request)
));
$response = curl_exec($myCurl);
curl_close($myCurl);
return $this->decode($response)->result->text->tts;
}
/**
* Кодирование сообщения
* @param $message
* @return string
*/
private function encode($message) {
$message = base64_encode($message);
$ml = strlen($message);
$kl = strlen($this->salt);
$encoded = "";
for ($i = 0; $i < $ml; $i++) {
$encoded = $encoded . ($message[$i] ^ $this->salt[$i % $kl]);
}
return base64_encode($encoded);
}
/**
* Декодирование сообщения
* @param $message
* @return mixed|null
*/
private function decode($message) {
$msg = base64_decode($message);
$ml = strlen($msg);
$kl = strlen($this->salt);
$decoded = "";
for ($i = 0; $i < $ml; $i++) {
$decoded.= ($msg[$i] ^ $this->salt[$i % $kl]);
}
return json_decode(base64_decode($decoded));
}
}
if ($params['message']) {
$sessionId = gg('ThisComputer.iiiBotSessionId');
$message = $params['message'];
//include_once(ROOT . 'lib/iiibot/iiibot.class.php');
$bot = new Bot(BOT_TOKEN);
//$bot = new Bot('8a5526de-f601-4f35-ba33-70ce385fffcb');
var_dump($bot);
if ($sessionId == '') {
$session = $bot->session();
sg('ThisComputer.iiiBotSessionId', $session);
} else {
$session = $bot->session($sessionId);
}
$response = $bot->say($message);
say($response);
SetTimeOut('CleanIiiSessionId', 'sg("ThisComputer.iiiBotSessionId", "");', 3*60*60);
}
|
info_v
|
$stickerbody = $params['stickerbody'];
$width = 230;
$height = 230;
$image = imagecreatetruecolor($width, $height)
or die('Cannot create image');
$image = imageCreateFromPng("./cms/images/report_v.png");
// Шрифт текста
$font = './cms/fonts/impact.ttf';
// Размер шрифта
$font_size = 16;
$colorfont="0x7749c8";
// Ширина области для вывода текста
$width_text = 140;
$align = "center";
$text = $stickerbody;
// Заливаем изображение цветом
//imagefill($image, 1, 1, 0xFFF729);
// Разбиваем наш текст на массив слов
$arr = explode(' ', $text);
// Возращенный текст с нужными переносами строк, пока пустая
$ret = "";
// Перебираем наш массив слов
foreach($arr as $word)
{
// Временная строка, добавляем в нее слово
$tmp_string = $ret.' '.$word;
// Получение параметров рамки обрамляющей текст, т.е. размер временной строки
$textbox = imagettfbbox($font_size, 0, $font, $tmp_string);
// Если временная строка не укладывается в нужные нам границы, то делаем перенос строки, иначе добавляем еще одно слово
if($textbox[2] > $width_text)
$ret.=($ret==""?"":"\n").$word;
else
$ret.=($ret==""?"":" ").$word;
}
// Разбиваем снова на массив строк уже подготовленный текст
$arr = explode("\n", $ret);
// Расчетная высота смещения новой строки
$height_tmp = 0;
//Выводить будем построчно с нужным смещением относительно левой границы
foreach($arr as $str)
{
// Размер строки
$testbox = imagettfbbox($font_size, 0, $font, $str);
// Рассчитываем смещение
if($align=="center")
$left_x = round(($width_text - ($testbox[2] - $testbox[0]))/2);
else
$left_x = round($width_text - ($testbox[2] - $testbox[0]));
// Накладываем текст на картинку с учетом смещений
imagettftext($image, $font_size ,0 , 15 + $left_x, 35 + $height_tmp, $colorfont, $font, $str); // 50 - это отступы от края
// Смещение высоты для следующей строки
$height_tmp = $height_tmp + 20;
}
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
|
internet_speed
|
$internet_speed_json = shell_exec("/usr/local/bin/hvmonitor_sh/internet_speed.sh");
$internet_speed = json_decode($internet_speed_json, true);
//$internet_speed_dl = trim(str_replace('Mbits/s', '', $internet_speed['Download']));
//$internet_speed_ul = trim(str_replace('Mbits/s', '', $internet_speed['Upload']));
sg('ThisServer.internet_speed_DL', $internet_speed['Download']);
sg('ThisServer.internet_speed_UL', $internet_speed['Upload']);
|
iphone
|
$AppleID = gg('Anna.AppleID');
$ApplePass = gg('Anna.ApplePass');
$id = 0;
//$timeout = 240;
$message = 'Тестирование';
$subject = 'Женько';
$sound = '1';
//findMyiPhone($AppleID, $ApplePass, $id, $timeout); //Ищет устройство и заполняет данные для приложения GPS-трэкер, а так же обновляет объект User привязанный в приложении
soundToMyiPhone($AppleID, $ApplePass, $subject, $id); // воспроизводит звуковое оповещение на устройстве
//messageToMyiPhone($AppleID, $ApplePass, $message, $subject, $sound, $id); // Выводит сообщение на устройстве, звуковое сопровождение опционально
//messageToMyiPhone($AppleID, $ApplePass, $message, $subject);
//Найдем айфончик
//findMyiPhone(gg('Anna.AppleID'), gg('Anna.ApplePass'), 0, 280);
|
LedTest
|
if (is_array($params)) {
//$time = $params['TIME'];
//$i = $params['COUNT'];
//$name = $params['OBJ_NAME'];
say('123');
//$obj = getObject($name);
//$level_now = $obj->getProperty("Level");
//say($level_now);
//$t = $time/$i;
//$count = $level_now/$i;
//$timeout = $time - $t;
//$level = $level_now - $count;
//say($level);
//if ($level <= 10 || $i < 1) {
//$obj->callMethod('turnOff');
//$obj->callMethod('setLevel', array('level' => 100));
// } else {
//$obj->callMethod('setLevel', array('level' => $level));
//$i = $i - 1;
//$param = array('TIME' => $timeout, 'COUNT' => $i, 'OBJ_NAME' => $name);
//$command = "runScript('LedTest', array(
// 'TIME' => ". $timeout .",
// 'COUNT' => " . $i .",
// 'OBJ_NAME' => '" . $name ."'
// ));";
//$command = "runScript('LedTest'," . $param . ");";
//var_dump($command);
//SetTimeOut($name . "Off", $command, $t);
//}
}
|
OpenWeatherTest
|
//на всякий случай обновим погоду
//include_once(DIR_MODULES . 'app_openweather/app_openweather.class.php');
//$openweather = new app_openweather();
//$openweather->get_weather(gg('ow_city.id'));
//////////
$status .= "Сейчас на улице " . gg("ow_fact.weather_type") . ", ";
$w = round(gg("ow_fact.temperature"));
$status .= 'температура ' . chti($w, 'градус', 'градуса', 'градусов') . " цельсия, ";
//Температура "По ощущениям"
$realFellTemp = round(gg("ow_fact.realFell"));
if ($w != $realFellTemp) {
$status .= "ощущается как " . chti($realFellTemp, 'градус', 'градуса', 'градусов') . " цельсия, ";
}
$w = gg("ow_fact.realFell");
if ($w < -40) {
$status .= 'мы морозов не боимся! ';
} elseif ($w < -30) {
$status .= 'одевайтесь теплее, очень холодно, ';
} elseif ($w < -20) {
$status .= 'самое время есть мороженое, ';
} elseif ($w < -10) {
$status .= 'холодновато, ';
} elseif ($w <- 3) {
$status .= 'не особо холодно, ';
} elseif ($w < 3) {
$status .= 'значит, возможно, гололёд, ';
} elseif ($w < 10) {
$status .= 'прохладно, ';
} elseif ($w < 22) {
$status .= 'тепло, ';
} elseif ($w < 30) {
$status .= 'жарко, ';
} elseif ($w > 30) {
$status .= 'ташкент, ';
}
// Сравнение со вчерашним днем
$tNew = round((float) getGlobal('ow_fact.temperature'));
$tOld = round((float) getGlobal('ow_fact.tempYesterday'));
$tDelta = abs($tNew - $tOld);
if ($tNew > $tOld) {
$status .= "теплее, чем вчера на " . chti($tDelta, 'градус', 'градуса', 'градусов') . ". ";
} elseif ($tNew < $tOld) {
$status .= "холоднее, чем вчера на " . chti($tDelta, 'градус', 'градуса', 'градусов') . ". ";
} elseif ($tNew == $tOld) {
$status .= "так же как и вчера. ";
}
$h = round(gg("ow_fact.humidity"));
$status .= "Относительная влажность " . chti($h, 'процент', 'процента', 'процентов') . ". ";
$pressure = (float) gg("ow_fact.pressure_mmhg");
if ($pressure < 738) {
$status .= 'Атмосферное давление пониженное';
} elseif ($pressure > 768) {
$status .='Атмосферное давление повышенное';
} else {
$status .= 'Атмосферное давление в пределах нормы';
}
$status .= " (" . chti(round($pressure), 'миллиметр', 'миллиметра', 'миллиметров') . " ртутного столба). ";
// ветер
$WindSpeed = (float) gg("ow_fact.wind_speed");
if ($WindSpeed < 1) {
$status .= "Ветра нет";
} elseif ($WindSpeed < 2) {
$status .= "Легкий ветер, ";
} elseif ($WindSpeed < 5) {
$status .= "Слабый ветер";
} elseif ($WindSpeed < 8) {
$status .= "Умеренный ветер";
} elseif ($WindSpeed < 10) {
$status .= "Свежий ветер";
} elseif ($WindSpeed < 14) {
$status .= "Сильный ветер";
} elseif ($WindSpeed < 17) {
$status .= "Очень сильный ветер";
} elseif ($WindSpeed < 21) {
$status .= "Ветер очень-очень сильный";
} elseif ($WindSpeed < 28) {
$status .= "Шторм";
} else {
$status .= "Ураган";
}
if ($WindSpeed >= 1) {
$status .= " (" . chti(round($WindSpeed), 'метр', 'метра', 'метров') . " в секунду), ";
$windDirections = array('севера', 'северо-востока', 'востока', 'юго-востока', 'юга', 'юго-запада', 'запада', 'северо-запада', 'севера');
$degree = gg('ow_fact.wind_direction');
$WindDir = $windDirections[round($degree / 45)];
$status .= " дующий с " . $WindDir;
}
$status .= ". ";
// Прогноз погоды на сегодня
if (timeBetween("01:00", "10:00")) {
$status .= "Сегодня утром ожидается ";
$w = round(gg("ow_day0.temp_morn"));
} elseif (timeBetween("10:00", "14:00")) {
$status .= "Сегодня днем ожидается ";
$w = round(gg("ow_day0.temp_day"));
} elseif (timeBetween("14:00", "20:00")) {
$status .= "Сегодня вечером ожидается ";
$w = round(gg("ow_day0.eve"));
} else {
$status .= "Сегодня ночью ожидается ";
$w = round(gg("ow_day0.temp_night"));
}
$status .= chti($w, 'градус', 'градуса', 'градусов') . " цельсия, " . gg("ow_day0.weather_type") . ". ";
// Погода на завтра
$w = round(gg("ow_day1.temperature"));
$status .= 'Завтра ожидается ' . chti($w, 'градус', 'градуса', 'градусов') . " цельсия, ";
$status .= gg("ow_day1.weather_type") . ".";
say($status, 1);
|
PostTracker
|
Уведомления от модуля PostTracker
/*
$params['NAME'] - name parcel
$params['TRACK'] - track number
$params['TRACK_URL'] - track url
$params['DATE'] - datetime last status
$params['STATUS'] - last status
$params['DISPUTE'] - day to dispute
$params['LOCATION'] - location
*/
require_once(DIR_MODULES . '/app_PostTracker/app_PostTracker.class.php');
if (isset($params['DISPUTE'])) {
$text = "Истекает срок доставки для посылки " . $params['NAME'] . ". Осталось " . chti($params['DISPUTE'], 'день', 'дня', 'дней') . ".";
} else {
$text = "Изменился статус посылки " . $params['NAME'] . ". Новый статус: " . $params['STATUS'] . " " . $params['LOCATION'] . ".";
}
say($text);
if (mb_strstr($params['STATUS'], 'доставлена')) {
$PostTracker = new app_PostTracker();
//$PostTracker->archiveByTrack($params['TRACK']);
$PostTracker->archiveByTrack(trim($params['TRACK']));
say('Помещаю посылку ' . $params['NAME'] . ' с трек-номером ' . $params['TRACK'] . ' в архив.');
}
|
pushbullet
|
Отправка сообщений через PushBullet
include_once(ROOT.'modules/app_pushbullet/app_pushbullet.class.php');
//$device = "Chrome";
$device = "ArtelPerfect";
//простое сообщение на конкретное устройство
//push_note('$device', 'Заголовок', 'Текст сообщения');
//простое сообщение на все устройства
//push_note_to_all('Заголовок', 'Текст сообщения');
//сообщение в виде списка
push_list($device, 'Купи в магазине:', array("Хлеб", "Колбаса"));
//адрес со ссылкой на картах google
//push_address('Chrome', 'Заголовок', 'Москва, Шаболовка, 37');
//файл
//push_file('Chrome', '/var/www/images/trees.jpg');
//ссылка
//push_link($device, 'MajorDoMo', 'http://smartliving.ru');
|
telegramTest
|
include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram = new telegram();
//$telegram->SendImageToUser(gg('Me.TelegramId'), $img, 'Image cap');
//$telegram->SendImage(-1001056998952, $img, "Image caption");
//$telegram->sendVenueToUser(gg('Me.TelegramId') , 58.5876084,49.6533398, 'test', '');
$telegram->sendVenueToUser(gg('Me.TelegramId') , 58.5876084,49.6533398, 'test', 'address');
|
test
|
$list_name="Купить";
$data = unserialize(gg('Me.WunderlistTasks'));
foreach ($data as $value) {
if ($value['title'] == $list_name) {
$tasks = $value["TASKS"];
$total = count($tasks);
if ($total != 0) {
for($i=0; $i < $total; $i++) {
say($tasks[$i]["title"]);
}
}
}
}
|
test2
|
//$text = "<a href='http://www.ya.ru'>тест</a>";
//say($text);
require_once(DIR_MODULES . '/app_PostTracker/app_PostTracker.class.php');
$PostTracker = new app_PostTracker();
$PostTracker->archiveByTrack('RT115696585MN');
|
testann
|
тестирование нейронной сети
// Считываем данные с обучающих фотографий в массив.
$j = 0;
$my_example = array();
for ( $i = 0; $i < 2; $i++ )
{
$d = dir("teach/test/$i");
while($entry = $d->read())
{
if ( preg_match("/jpg/", $entry) )
{
//say($entry);
$im = imagecreatefromjpeg("teach/test/$i/$entry");
$cur_array = array();
$cnt = 0;
for($y=150; $y<230; $y++)
{
for($x=125; $x < 350; $x++)
{
$rgb = imagecolorat($im, $x, $y) / 16777215;
$cur_array[$cnt] = $rgb;
$cnt++;
}
}
imagedestroy($im);
$my_example[$j] = array($cur_array, array($i));
$j++;
}
}
}
// Создаем и обучаем сеть
$ann = fann_create_standard(array(18000, 100, 1), 1.0, 0.7);
if ( fann_train($ann, $my_example, 1000, 0.001, 1000) == FALSE)
//exit('Could not train $ann.');
say('Could not train $ann.');
// Сохраняем обученную сеть в файл для дальнейшего использования.
fann_save($ann, "teach/test/my.ann");
|
tmupdate
|
Уведомление об окончании закачки torrent monitor
if (isset($params['serial_name'])) {
say("Скачивается новая серия " . $params['serial_name'] . "!");
}
|
zmtest
|
$db = array('host' => gg('ZoneminderDB.host'),
'port' => gg('ZoneminderDB.port'),
'user' => gg('ZoneminderDB.user'),
'pass' => gg('ZoneminderDB.pass'),
'db' => gg('ZoneminderDB.name')
);
$zmdb = new mysql($db['host'], $db['port'], $db['user'], $db['pass'], $db['db']
);
$last_event = gg('ThisComputer.ZmLastEvent');
if ($last_event == '') {
$last_event = 0;
}
$last_event_time = gg('ThisComputer.ZmLastEventTime');
if ($last_event_time == '') {
$last_event_time = 0;
}
$res = $zmdb->Select("SELECT Id, UNIX_TIMESTAMP(StartTime) ts, StartTime, MonitorId FROM Events WHERE Id > " . $last_event . " AND AlarmFrames > 10 ORDER BY id DESC"); //10 AlarmFrames для фильтра ложных срабатываний, по идее должно быть 0
if ($res) {
for ($i = 0; $i < count($res); $i++) {
if ($i == 0) {
sg('ThisComputer.ZmLastEvent', $res[$i]['Id']);
sg('ThisComputer.ZmLastEventTime', $res[$i]['ts']);
$img_path = "/usr/share/zoneminder/events/" . $res[$i]['MonitorId'] . "/" . date("y/m/d/H/i/s/", $res[$i]["ts"]);
//say('Обнаружено движение!');
if (gg('NobodyHomeMode.active')) {
$objects = getObjectsByClass("Users");
$from = gg('ThisComputer.emailFrom');
say('Обнаружено движение дома. Уведомляю хозяев по электронной почте. Расходились тут...');
$img_arr = array($img_path . '00001-capture.jpg',
$img_path . '00010-capture.jpg',
$img_path . '00020-capture.jpg',
$img_path . '00030-capture.jpg',
$img_path . '00040-capture.jpg',
$img_path . '00050-capture.jpg',
);
foreach ($objects as $obj) {
if (gg($obj['TITLE'] . ".emailNotifications") == 1 && gg($obj['TITLE'] . ".email") != "") {
$to = gg($obj['TITLE'] . '.email');
$subject = utf2win("Обнаружено движение!");
$body = utf2win("Обнаружено движение " . $res[$i]['StartTime']);
SendMail_html($from, $to, $subject, $body, $img_arr);
}
}
}
}
if ($res[$i]['MonitorId'] == 3) {
callMethod("sensorMovementBedroom.statusChanged", array("status" => "1"));
//say('Камера в комнате');
} elseif ($res[$i]['MonitorId'] == 4) {
callMethod("sensorMovementKitchen.statusChanged", array("status" => "1"));
//say('Камера на кухне!');
}
}
} else {
//return NULL;
}
|
beelineBalance
|
Не используется, удалить
$cookie_file = ROOT . 'cached/dialog_cookie.txt'; //в этом файле будет храниться сессия
//$cookie_file = 'dialog_cookie.txt'; //в этом файле будет храниться сессия
// STEP 1 -- LOGIN
$url = 'https://lk.beeline.ru'; // ссылка, по которой нам надо зайти
// задаём поля, которые будут отправлены при логине
$fields = array(
'login' => gg('balance.beelineLogin'), // номер телефона
'password' => gg('balance.beelinePass'), // пароль
'check' => '1');
$fields_string = '';
foreach ($fields as $key => $value) {
$fields_string .= $key . '=' . urlencode($value) . '&';
}
rtrim($fields_string, '&');
$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
$result = curl_exec($ch);
curl_close($ch);
// STEP 2 -- GET DATA
$url = 'https://lk.beeline.ru/personal/'; // это собственно страница, на которую нам надо заходить уже залогинившись
$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
$result = curl_exec($ch);
curl_close($ch);
//SaveFile(ROOT . 'cached/dialog_result.txt', $result); // сохранять в файл не обязательно, это я делаю просто для того чтобы посмотреть что внутри
@unlink($cookie_file);
$balance = '1';
$endDate = '';
$paySumm = '';
//echo $result;
$doc = new DOMDocument();
@$doc->loadHTML($result);
$xpath = new DOMXpath($doc);
$description = array();
$values = array();
$descriptionDom = $xpath->query('//span[@class="personal_html_inner_usluga_name"]');
if ($descriptionDom->length > 0) {
foreach ($descriptionDom as $item) {
$description[] = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
}
}
$valuesDom = $xpath->query('//span[@class="personal_html_inner_usluga_status"]');
if ($valuesDom->length > 0) {
foreach ($valuesDom as $item) {
$values[] = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
}
}
$deathLine = date_parse_from_format("j.n.Y H:iP", $values[array_search('Дата окончания расчетного периода', $description)].'+03:00');
//sg('balance.beelinePaymentData', $values[array_search('Дата окончания расчетного периода', $description)]);
sg('balance.beelinePaymentData', $deathLine['day'].'.'.$deathLine['month']);
$balance = strip_tags($values[array_search('Текущий баланс', $description)]);
$balance = str_replace(' ', '', $balance);
$balance = str_replace('руб.', '', $balance);
sg('balance.beelineBalance', $balance);
$paySumm = strip_tags($values[array_search('Сумма к оплате', $description)]);
$paySumm = str_replace(' ', '', $paySumm);
$paySumm = str_replace('руб.', '', $paySumm);
sg('balance.beelinePaymentSum', $paySumm);
|
SipZadarmaBalance
|
Не используется, удалить
$cookie_file = ROOT . 'cached/dialog_cookie.txt'; //в этом файле будет храниться сессия
//$cookie_file = 'dialog_cookie.txt'; //в этом файле будет храниться сессия
// STEP 1 -- LOGIN
$url = 'https://ss.zadarma.com/auth/login/?lang=ru'; // ссылка, по которой нам надо зайти
// задаём поля, которые будут отправлены при логине
$fields = array(
//'Lang' => 2,
'email' => gg('balance.sipZadarmaLogin'), // номер телефона
'password' => gg('balance.sipZadarmaPassword'), // пароль
//'check' => '1'
);
$fields_string = '';
foreach ($fields as $key => $value) {
$fields_string .= $key . '=' . urlencode($value) . '&';
}
rtrim($fields_string, '&');
$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
$result = curl_exec($ch);
curl_close($ch);
// STEP 2 -- GET DATA
$url = 'https://ss.zadarma.com/dirnum/'; // это собственно страница, на которую нам надо заходить уже залогинившись
$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
$result = curl_exec($ch);
curl_close($ch);
//echo $result;
//SaveFile(ROOT . 'cached/dialog_result.txt', $result); // сохранять в файл не обязательно, это я делаю просто для того чтобы посмотреть что внутри
@unlink($cookie_file);
$balance = '1';
$intMin = '1';
if (preg_match_all('/<span class="balance"><a style="color:#000;" href="\/pay\/">(.+?)<\/a><\/span>/is', $result, $m)) { // здесь как раз ищем нужную нам информацию
$balance = strip_tags($m[0][0]);
$balance = str_replace('$', '', $balance);
$balance = str_replace('руб', '', $balance);
$balance = trim($balance);
setGlobal('balance.sipZadarmaBalance',$balance);
}
if (preg_match_all('/<br\/>Входящих звонков - <i>(.+?)<\/i> мин. <a href=/is', $result, $m)) { // здесь как раз ищем нужную нам информацию
preg_match_all('/<i>(.+?)<\/i>/is', $m[0][0], $m);
$intMin = strip_tags($m[0][0]);
setGlobal('balance.sipZadarmaintMin',$intMin);
}
|