Гороскоп для всех знаков задиака на PHP

Форум для тех кто начинает осваивать язык php.
Аватара пользователя
PCB
Сообщения: 28
Благодарил (а): 5 раз
Поблагодарили: 8 раз

Гороскоп для всех знаков задиака на PHP

Сообщение PCB » Вт авг 23, 2016 11:36 am

Доброго времени суток! Есть идея сделать гороскоп для всех знаков зодиака, на текущий день, на завтрашний, ещё возможно на неделю, месяц и год. Для этого дела я думаю использовать сервис https://horo.mail.ru/, парсить страницы сервиса гороскопа при помощи функции file_get_contents, затем вытаскивать текста предсказания с полученного запроса и выводить его на экран. И с этим вроде проблем нету, т. к. на форум нашёл не одну тему, как сделать парсер на PHP и обработать полученную строку. Проблема заключается вот в чём: я хочу для получения предсказания нужного знака зодиака выбирать число и месяц рождения, по этим данным скрипт должен высчитать знак зодиака и только потом уже парсить сервис mail.ru.

Список знаков зодиака и дни рождения:
  1. Водолей - 21 января — 18 февраля.
  2. Рыбы - 19 февраля — 19 марта.
  3. Овен - 20 марта — 19 апреля.
  4. Телец - 20 апреля — 20 мая.
  5. Близнецы - 21 мая — 20 июня.
  6. Рак - 21 июня — 22 июля.
  7. Лев - 23 июля — 22 августа.
  8. Дева - 23 августа — 22 сентября.
  9. Весы - 23 сентября — 22 октября.
  10. Скорпион - 23 октября — 21 ноября.
  11. Стрелец - 22 ноября — 21 декабря.
  12. Козерог - 22 декабря — 20 января.
Похоже, что тут придётся писать длинное условие. Пожалуйста, помогите с реализацией данной идеей. Спасибо.
Реклама
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Гороскоп для всех знаков задиака на PHP

Сообщение Slash » Вт авг 23, 2016 2:39 pm

Вот, что пришло в голову, как Вы и говорили - писать условие, проверяем месяц и число рождения, по дате знака зодиака (от|до), найдя совпадение получаем имя знака, для парсера это имя будет частью URL. Составляем адрес страницы, которую будем парсить и парсим, получив содержимое страницы, вытаскиваем предсказание. Имя знака зодиака и предсказание, возвращается в одном массиве. Сама функция:

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

function horoscope($d, $m)
{
    $date = $m . '-' . $d;
    if ($date >= '01-21' && $date <= '02-18')
    {
        $sign = 'aquarius'; # Водолей
    }
    else if ($date >= '02-19' && $date <= '03-19')
    {
        $sign = 'pisces'; # Рыбы
    }
    else if ($date >= '03-20' && $date <= '04-19')
    {
        $sign = 'aries'; # Овен
    }
    else if ($date >= '04-20' && $date <= '05-20')
    {
        $sign = 'taurus'; # Телец
    }
    else if ($date >= '05-21' && $date <= '06-20')
    {
        $sign = 'gemini'; # Близнецы
    }
    else if ($date >= '06-21' && $date <= '07-22')
    {
        $sign = 'cancer'; # Рак
    }
    else if ($date >= '07-23' && $date <= '08-22')
    {
        $sign = 'leo'; # Лев
    }
    else if ($date >= '08-23' && $date <= '09-22')
    {
        $sign = 'virgo'; # Дева
    }
    else if ($date >= '09-23' && $date <= '10-22')
    {
        $sign = 'libra'; # Весы
    }
    else if ($date >= '10-23' && $date <= '11-21')
    {
        $sign = 'scorpio'; # Скорпион
    }
    else if ($date >= '11-22' && $date <= '12-21')
    {
        $sign = 'sagittarius'; # Стрелец
    }
    else
    
{
        $sign = 'capricorn'; # Козерог
    }

    $url  = 'https://horo.mail.ru/prediction/' . $sign . '/today/';
    $html = file_get_contents($url);
    preg_match('|<div class="article__item article__item_alignment_left article__item_html">(.*?)</div>|s', $html, $prediction);

    return array(
        'sign'       => ucfirst($sign),
        'prediction' => $prediction[1]
    );

Вызвать функцию, можно так:

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

$array = horoscope('01', '01');

Параметры функции: (1 - день, 2 - месяц) необходимо писать числа в кавычках (пример: '12'). Полученный массив можно разложить на переменные: $array['sign'] (название знака) и $array['prediction'] (предсказание). Увидеть сразу весь массив, можно так:

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

print_r($array);
Аватара пользователя
PCB
Сообщения: 28
Благодарил (а): 5 раз
Поблагодарили: 8 раз

Re: Гороскоп для всех знаков задиака на PHP

Сообщение PCB » Ср авг 24, 2016 8:28 am

Ух ты! Здорово получилось. Проверил со всеми знаками, выводит предсказания каждого.
Теперь буду мучить свою голову, как сделать предсказание на завтра, на неделю и на другое время тоже.

Была ещё идея сделать не только по вводу своей даты рождения, но и просто нажав на кнопку со своим знаком гороскопа, ведь многие знают свой знак.

Slash, я извиняюсь, что сразу не ответил, пока, что мало свободного времени.
За скрипт большое спасибо ;) !
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Гороскоп для всех знаков задиака на PHP

Сообщение Slash » Ср авг 24, 2016 12:20 pm

Набросал класс horoscope, выводит предсказание на вчерашний день, на сегодняшний, на завтра, на неделю, на месяц и на год в целом. Конечно недочеты имеются в классе (писал на скорую руку), но думаю, если что, можно поправить, как угодно. Сам код класса (возможно длинноват):

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

class horoscope
{
    public function definition($d, $m)
    {
        $date = $m . '-' . $d;
        if ($date >= '01-21' && $date <= '02-18')
        {
            $sign = 'aquarius'; # Водолей
        }
        else if ($date >= '02-19' && $date <= '03-19')
        {
            $sign = 'pisces'; # Рыбы
        }
        else if ($date >= '03-20' && $date <= '04-19')
        {
            $sign = 'aries'; # Овен
        }
        else if ($date >= '04-20' && $date <= '05-20')
        {
            $sign = 'taurus'; # Телец
        }
        else if ($date >= '05-21' && $date <= '06-20')
        {
            $sign = 'gemini'; # Близнецы
        }
        else if ($date >= '06-21' && $date <= '07-22')
        {
            $sign = 'cancer'; # Рак
        }
        else if ($date >= '07-23' && $date <= '08-22')
        {
            $sign = 'leo'; # Лев
        }
        else if ($date >= '08-23' && $date <= '09-22')
        {
            $sign = 'virgo'; # Дева
        }
        else if ($date >= '09-23' && $date <= '10-22')
        {
            $sign = 'libra'; # Весы
        }
        else if ($date >= '10-23' && $date <= '11-21')
        {
            $sign = 'scorpio'; # Скорпион
        }
        else if ($date >= '11-22' && $date <= '12-21')
        {
            $sign = 'sagittarius'; # Стрелец
        }
        else
        
{
            $sign = 'capricorn'; # Козерог
        }

        return $this->parse($sign);
    }

    public function parse($sign)
    {
        $urls = $this->urls($sign);

        $html = array();
        foreach ($urls as $url)
        {
            $html[] = file_get_contents($url);
        }

        return $this->treatment($html);
    }

    private function treatment($htmls)
    {
        $prediction = array();
        foreach ($htmls as $html)
        {
            preg_match('|<div class="article__item article__item_alignment_left article__item_html">(.*?)</div>|s', $html, $clarification);
            $prediction[] = $clarification[1];
        }

        return $prediction;
    }

    private function urls($sign)
    {
        return array(
            'https://horo.mail.ru/prediction/' . $sign . '/yesterday/',   # Вчера
            'https://horo.mail.ru/prediction/' . $sign . '/today/',       # Сегодня
            'https://horo.mail.ru/prediction/' . $sign . '/tomorrow/',    # Завтра
            'https://horo.mail.ru/prediction/' . $sign . '/week/',        # Неделя
            'https://horo.mail.ru/prediction/' . $sign . '/month/',       # Месяц
            'https://horo.mail.ru/prediction/' . $sign . '/year/'         # Год
        );
    }

Работать с классом можно так: Создаем объект:

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

$horoscope = new horoscope(); 

Теперь если надо вывести предсказания по дню и месяцу рождения, делаем так:

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

$predictions = $horoscope->definition('11', '11'); 

А если по названию знака, то так:

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

$predictions = $horoscope->parse('scorpio'); 

Полученная переменная $predictions - это массив с предсказаниями для разных времен (вчера | сегодня | неделя и так далее), выводим, например, в цикле:

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

foreach ($predictions as $prediction)
{
    echo $prediction;
    echo '<br />*** *** *** *** ***<br />';

Сценарий выдаст на экран сразу все предсказания. А если надо только одно, например, на сегодня, то можно так:

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

echo $predictions[1];
Аватара пользователя
PCB
Сообщения: 28
Благодарил (а): 5 раз
Поблагодарили: 8 раз

Re: Гороскоп для всех знаков задиака на PHP

Сообщение PCB » Ср авг 24, 2016 6:26 pm

Замечательно! Как я и хотел! Я Вам очень благодарен!

Передавать знак в класс:

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

$predictions = $horoscope->parse('scorpio');

Можно методом POST или GET или через AJAX, с передачей днём и месяцем рождения, тоже самое.
Из недочетов: скрипт долго обрабатываться, скорее всего из-за того, что читается шесть страниц, это можно решить, сделав вывод не всех предсказаний сразу, а только тех, что выберет пользователь.

Вернуться в «PHP»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость