Пользователь
0,0
рейтинг
14 августа 2012 в 15:50

Разработка → Информационные «виджеты» на PHP в Ubuntu из песочницы

PHP*
Всем привет.
Я хочу поделиться с вами идеей написания подобия информационных виджетов на 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 или что-нибудь ещё. Тут уже дело личных предпочтений.
Надеюсь, данный материал покажется кому-то полезным.
Спасибо за внимание.
Артур @kovalevsky
карма
36,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (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
    • 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 файле.

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