Информационные «виджеты» на PHP в Ubuntu

Всем привет.
Я хочу поделиться с вами идеей написания подобия информационных виджетов на PHP.
Суть заключается в том, что средствами PHP легко граббить или просто получать информацию из интернета (+ личные предпочтения этому языку), после чего эту информацию можно вывести, используя утилиту notify-send, красиво и лаконично в правый угол монитора.

Скажу сразу, что на новаторство я не претендую. Возможно, данный метод может показаться многим довольно глупым, но мне, например, проще посмотреть в угол монитора, чем забивать рабочий стол всякими скринлетами, конки и прочим.
В качестве примера создадим виджет погоды, на основе данных с openweathermap.com.

Нам понадобится веб-сервер с PHP, не важно на локалхосте или нет.
Создайте на сервере директорию, в которой будут лежать виджеты, у меня это /public_html/scripts/.

Приступим к первой части — PHP:


Создайте файл с именем, например, weather.php. Создали? Отлично. Теперь давайте получим данные с openweathermap.com. У них есть своё API для этих целей, с которым можно познакомиться на этом же сайте, так что не будем на этом останавливаться.
Сперва нам нужно получить идентификатор нужного нам города. Для этого на сайте найдите этот город и посмотрите подробную информацию о нём. В адресной строке мы увидим идентификатор.
Для моего города ссылка виглядит так: openweathermap.org/city/705812, собственно идентификатор здесь 705812.
Отлично, теперь мы знаем id города и можем получить данные с помощью API

Листинг weather.php:
<?php
error_reporting(0);
Header('Content-Type: text/html; charset=utf-8');

function getWeather($id)
{
    if(!empty($id))
    {
        $json = file_get_contents('http://openweathermap.org/data/weather/'.$id.'?type=json');
        $weatherData = json_decode($json, true);
        return $weatherData;
    }
}

$weather = getWeather('705812'); // id нужного города
file_put_contents('weather.png', file_get_contents($weather['img'])); // сохраним картинку погоды для вывода в качество иконки для notify-send.

echo $weather['name']."\n";
echo $weather['temp']." °C\n";
echo "Облачность: ".$weather['clouds']."% \n";
echo "Давление: ".$weather['pressure']." hpa \n";
echo "Влажность: ".$weather['humidity']."% \n";
?>


Вторая часть — Shell скрипт.


Тут всё просто. Мы получаем содержимое нашей страницы с данными в файл, записываем его содержимое в переменную и выводим это через notify-send, используя стащенную с сервера иконку.
Я положил shell скрипт в домашнюю директорию с именем weather.sh

Листинг weather.sh:
#!/bin/bash

rm weather.php
wget http://localhost/scripts/weather.php
WEATHER=`cat ~/weather.php`
notify-send "Погода" "$WEATHER" -i ~/webserv/public_html/scripts/weather.png


PS. Если у кого-нибудь есть способ сделать это вариант по проще, то буду рад выслушать.

Заключение


При вызове shell-скрипта получим что-то похожее на это:

А дальше можно выводить каждую минуту/час/день и т.д. по крону, либо назначить на него горячую клавишу через Compiz или что-нибудь ещё. Тут уже дело личных предпочтений.
Надеюсь, данный материал покажется кому-то полезным.
Спасибо за внимание.
Метки:
Поделиться публикацией
Похожие публикации
Комментарии 31
  • +5
    curl 'http://openweathermap.org/data/weather/705812?type=json' | jsawk -a 'return this.name'
    А дальше эхо :) и PHP не нужен в данном ключе
    • +1
      а представь какая вакханалия выводится если сервис свалится, сомнительной полезности скрипт
      • +2
        понимаю, я лишь привел пример от зависимости к какому-либо языку
        • 0
          Посмотрел на ник и понадеялся, что homm разбанили. ан нет :(
      • НЛО прилетело и опубликовало эту надпись здесь
        • +7
          Я не понимаю зачем тут вообще нужно участие веб сервера.

          #!/usr/bin/php как бы должно хватать с головой, нет? И шелл скрипт, соответственно, тоже не нужен.
          • 0
            Для этого указал:
            Возможно, данный метод может показаться многим довольно глупым...

            А за комментарии спасибо. Над этими методами, к сожалению, не задумался совсем в силу небольшого опыта.
            • 0
              Может найдёте что-нибудь интересное для себя тут. И спасибо за пост :-)
              • 0
                Спасибо. Обязательно прочту
          • 0
            Для вашего примера нужно два файла скриптов (php и shell), установленный и настроенный веб-сервер и, конечно же, установленный php.

            Имхо можно сделать проще. Прямо из php вызывать notify-send и тогда можно обойтись одним файлом и без веб-сервера.

            Только заголовок php-скрипта должен быть:
            #!/bin/bash
            <?php
            
            • +1
              Сорри, заголовок файл должен быть:
              #!/usr/bin/php
              <?php
              ...
              
              • +2
                а не
                #!/usr/bin/env php
                <?php
                ...
                

                ?
                • 0
                  Не принципиально. /usr/bin/php — прямое указание к файлу интерпретатора, а /usr/bin/env сам ищет интерпретатор.
                  • 0
                    А интерпретатор всегда лежит в /usr/bin/php?
                    • 0
                      если ставилось как пакет то да
                      • 0
                        смотря какой пакет
              • 0
                Спасибо за советы. Учту.
                • +1
                  Как вариант запускать php weather.php без заголовка.
                  • +1
                    Старайтесь запускать всегда
                    php -f scriptname.php --
                    дабы избежать подстановки «левых» параметров для php интерпретатора. В 99% случаев ничего не будет, скрипт не запустится или параметр не передасться никуда, но лучше изначально избегать уловок даже при написании для себя, а то вдруг прийдётся где-нибудь в крон сервера ставить.
                • +2
                  Не смотря на то, что php мой основной язык, но для подобных задач предпочитаю python — как-то лаконичней получается и синтаксически, и вообще аккуратнее. Плюс есть биндинги ко многим API Ubuntu (включая Ubuntu-only, а не только кроссплатформенные и кроссдистрибутивные GTK+ и ниже). Ну и не надо устанавливать PHP. Вот когда под виндой сидел, то использовал PHP и в качестве скриптового языка, пока не открыл nnCron для себя :)
                  • 0
                    Не пинайте сильно — но я для аналогичной задачи java юзаю…
                    • –4
                      getWeather('705812')

                      вот за это я люто ненавижу php. это дело потом типизировать в других языках приходиться.
                      • 0
                        *приходится
                        • 0
                          Никто не мешает в php привести переменную к целочисленному типу, просто в данном случае в этом нет смысла.
                        • 0
                          Какое «это дело»? Этот id — часть урла стороннего сервиса, он по стандарту именно текстовый. Скорее php можно ненавидеть за то, что он в этом месте допустит getWeather(705812), неявно переведя параметр в строку при конкатенации.
                          • 0
                            { "id":"705812" }
                            феншуйно, да, ничего не скажешь.
                          • 0
                            Мне известно о Conky, спасибо.
                            Прочтите начало статьи: … мне, например, проще посмотреть в угол монитора, чем забивать рабочий стол всякими скринлетами, конки и прочим...
                            И погода здесь фигурирует лишь в качестве примера.
                          • +1
                            Использую что-то подобное, только notify-send вызываю в самом php скрипте, посредством exec(), как по мне, так проще.
                            • 0
                              Тоже изначально была такая идея, но я, к сожалению, упустил возможность запуска php скрипта из терминала.
                            • +1
                              Сделал пару исправлений
                              1. Чтобы не парится с правами картинку запихнул в /tmp
                              2. Сделал вызов notify-send из скрипта через exec
                              exec('notify-send "Погода" "'.$print.'" -i /tmp/weather.png');
                              

                              В результате все стало в 1 файле.

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