Кулинария

Всё, что не подходит под вышеперечисленные разделы

Модератор: immortal

Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Кулинария

Сообщение Ivan » Чт мар 19, 2015 8:30 am

Есть вариант с наливом. Тысяч за 20 :)
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Кулинария

Сообщение sergejey » Чт мар 19, 2015 11:26 am

где-то в стопке старых бумажек у меня даже есть структура модуля планирования меню на неделю с базой рецептов "дежурных" блюд. там суть сводилась к тому, что с помощью этого модуля можно (было бы) планировать, что готовить каждый день, с учётом (или без) имеющихся продуктов или с составлением списка покупок того, чего не хватает (связь с модулем Продукты). но руки так и не дошли...

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Кулинария

Сообщение Amarok » Чт мар 19, 2015 11:36 am

Amarok писал(а):
Dark_Veter писал(а):Я думаю сделать не особо сложно, опишите, как это должно работать. Мне пока в голову ничего интересного не пришло :-)
Думаю должно быть примерно так:
- Алиса, давай что-нибудь приготовим?
- Давай. Что?
- Пельмени.
Алиска роется в базе и выдает рецепты.
- 1) Пельмени по уральски. 2) Пельмени по сибирски. 3) Пельмени жареные
- Будем готовить №1
Алиса выдает рецепт №1
Хотелось бы такой модуль тоже)
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
Dark_Veter
Сообщения: 295
Зарегистрирован: Вт апр 23, 2013 5:16 pm
Откуда: Брянск
Благодарил (а): 18 раз
Поблагодарили: 94 раза

Re: Кулинария

Сообщение Dark_Veter » Вт апр 07, 2015 6:00 pm

Вот написал скрипт, правда его еще допиливать надо, но в целом работает.
Как использовать: Создаем примерно такой шаблон поведения

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

(Д|д)авай приготовим (.+) 
Затем вставляем в него следующий код:

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

$queryString = $matches[2];

/*
  $findParams = array(
  'aerogrill' => '22', // Рецепты для аэрогриля
  'waffle' => '27', // Для вафельницы
  'yoghurt' => '28', // Для йогуртиницы
  'multivarka' => '25', //Рецепты для мультиварки
  'steamer' => '15', //Для пароварки
  'pressureCooker' => '46', //Для скороварки
  'breadMaker' => '23', //Для хлебопечки
  'fondue' => '24'  //Рецепты фондю
  );

 */
$findParams = array();

$recipeNumber = rand(0, 5);

$recipesList = findRecipes($queryString, $findParams);

if (!empty($recipesList)) {
    $recipe = getRecipes($recipesList[$recipeNumber]['link']);
    $recipe['link'] = $recipesList[$recipeNumber]['link'];
    $recipe['name'] = $recipesList[$recipeNumber]['text'];
    sayRecipe($recipe);
} else {
    say('Ничего не найдено.');
}

function OpenRecipeURL($link) {
    $rec=array();
    $rec['EVENT_TYPE']='openurl'; // команда может быть ещё newwindow
    $rec['WINDOW']='alice';
    $rec['TERMINAL_TO']='*'; //здесь можно конкретный терминал указать
    $rec['ADDED']=date('Y-m-d H:i:s');
    $rec['EXPIRE']=date('Y-m-d H:i:s', time()+10);
    $rec['DETAILS']=$link;
    $rec['ID']=SQLInsert('events', $rec); 
}

function sayRecipe($recipe) {
    OpenRecipeURL($recipe['link']);

    say($recipe['name']);

    if (!empty($recipe['description'])) {
        foreach ($recipe['description'] as $e) {
            say($e);
        }
    }

    $ingrstr = 'Нам понадобится: ';
    foreach ($recipe['ingredients'] as $e) {
        $ingrstr .= $e . ', ';
    }
    
    say($ingrstr);

    say('Способ приготовления:');

    foreach ($recipe['preparing'] as $e) {
        say($e);
    }
}

function getRecipes($recipeLink) {
    if (empty($recipeLink)) {
        return FALSE;
    }

    $html = @file_get_contents($recipeLink);

    $doc = new DOMDocument();
    @$doc->loadHTML($html);

    $xpath = new DOMXpath($doc);
    $ingredients = array();
    $description = array();

    $ingredientsDom = $xpath->query('//table[@class="rec-ingred-table"]/tr');
    if ($ingredientsDom->length > 0) {
        foreach ($ingredientsDom as $item) {
            $ingredients[] = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
        }

        $descriptionDom = $xpath->query('//div[@class="b-page_block__outside"]/p');
        foreach ($descriptionDom as $item) {
            $description[] = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
        }
    } else {
        $ingredientsDom = $xpath->query('//div[@class="b-page_block__outside"]/p');
        foreach ($ingredientsDom as $item) {
            $ingredients[] = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
        }
    }
    $preparingDom = $xpath->query('//div[@class="b-list__clause__text"]/p');
    $preparing = array();
    foreach ($preparingDom as $item) {
        $preparing[] = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
    }

    $recipe = array(
        'description' => $description,
        'ingredients' => $ingredients,
        'preparing' => $preparing
    );

    return $recipe;
}

function findRecipes($queryString, $params) {
    if (empty($queryString)) {
        return FALSE;
    }

    $url = 'http://www.edimdoma.ru/search?utf8=%E2%9C%93&asset=recipes&index=title_search&query=' . urlencode($queryString) . '&search%5Bmain_category_id%5D=&search%5Bcuisine_id%5D=';

    if (!empty($params)) {
        foreach ($params as &$value) {
            $url .= '&cooking_method_ids%5B%5D=' . $value;
        }
    }

    $url .= '&user_name=';

    $html = @file_get_contents($url);
    $doc = new DOMDocument();
    @$doc->loadHTML($html);

    $xpath = new DOMXpath($doc);
    $articles = $xpath->query('//div[@class="b-page_block__header"]');

    $links = array();
    foreach ($articles as $container) {
        $arr = $container->getElementsByTagName("a");
        foreach ($arr as $item) {
            if ($item->parentNode->tagName == "h2") {
                $href = $item->getAttribute("href");
                $text = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
                $links[] = array(
                    'link' => $href,
                    'text' => $text
                );
            }
        }
    }

    return $links;
}
 
Работать будет только при наличии интернета, т.к. парсит сайт http://www.edimdoma.ru/

И сразу вопросик :-) Может кто подскажет, как программно открывать страницу на каком либо терминале? Можно бы было открывать страницу с рецептом при запросе.
Последний раз редактировалось Dark_Veter Пт апр 10, 2015 8:17 pm, всего редактировалось 1 раз.
За это сообщение автора Dark_Veter поблагодарили (всего 3):
slgeo (Вт апр 07, 2015 8:16 pm) • Amarok (Ср апр 08, 2015 7:19 am) • Bagir (Пт апр 10, 2015 4:11 pm)
Рейтинг: 3.49%
Debian GNU/Linux 7.9 (wheezy), версия 0.9.0b, Connect
Аватара пользователя
slgeo
Сообщения: 551
Зарегистрирован: Чт фев 05, 2015 2:35 pm
Откуда: РнД
Благодарил (а): 139 раз
Поблагодарили: 74 раза

Re: Кулинария

Сообщение slgeo » Вт апр 07, 2015 8:16 pm

Как подгрузить на конкретном терминале - не подскажу, но в url домашней страницы можно записать свойство объекта, например, %ThisComputer.KitchenUrl%, и подгружать уже необходимую страницу.
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

Re: Кулинария

Сообщение Bagir » Пт апр 10, 2015 4:10 pm

Dark_Veter писал(а):как программно открывать страницу на каком либо терминале?
Это можно, вот пример

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

$rec=array();
$rec['EVENT_TYPE']='openurl'; // команда может быть ещё newwindow
$rec['WINDOW']='alice';
$rec['TERMINAL_TO']='*'; //здесь можно конкретный терминал указать
$rec['ADDED']=date('Y-m-d H:i:s');
$rec['EXPIRE']=date('Y-m-d H:i:s', time()+10);
$rec['DETAILS']='my_site.ru';
$rec['ID']=SQLInsert('events', $rec); 
За это сообщение автора Bagir поблагодарили (всего 2):
Dark_Veter (Пт апр 10, 2015 8:17 pm) • slgeo (Пт апр 17, 2015 9:26 pm)
Рейтинг: 2.33%
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Dark_Veter
Сообщения: 295
Зарегистрирован: Вт апр 23, 2013 5:16 pm
Откуда: Брянск
Благодарил (а): 18 раз
Поблагодарили: 94 раза

Re: Кулинария

Сообщение Dark_Veter » Пт апр 10, 2015 8:18 pm

Bagir, Спасибо! Добавил в код для открытия страницы с рецептом.
Debian GNU/Linux 7.9 (wheezy), версия 0.9.0b, Connect
Roman_13j
Сообщения: 32
Зарегистрирован: Пт мар 25, 2016 11:34 pm
Благодарил (а): 5 раз
Поблагодарили: 0

Re: Кулинария

Сообщение Roman_13j » Вт июл 19, 2016 10:23 pm

Никак не могу заставить работать данный скрипт. Все время говорит, что "Я не знаю такого рецепта". В чем может быть проблема?
Dark_Veter
Сообщения: 295
Зарегистрирован: Вт апр 23, 2013 5:16 pm
Откуда: Брянск
Благодарил (а): 18 раз
Поблагодарили: 94 раза

Re: Кулинария

Сообщение Dark_Veter » Ср июл 20, 2016 10:03 am

Странно, только что проверил у себя, работает. А шаблон у вас срабатывает?
Debian GNU/Linux 7.9 (wheezy), версия 0.9.0b, Connect
Roman_13j
Сообщения: 32
Зарегистрирован: Пт мар 25, 2016 11:34 pm
Благодарил (а): 5 раз
Поблагодарили: 0

Re: Кулинария

Сообщение Roman_13j » Ср июл 20, 2016 11:22 am

Проверил, при шаблоне "(Д|д)авай приготовим (.+)" шаблон не отрабатывает, если задать "давай приготовим (.+)" и выставить $matches[1], срабатывает нормально и ищет рецепт. Если поставить галочку на Use morphology перестает срабатывать.
Ответить