Ubuntu на Онего.ру
Новости Статьи Знакомство
Получить Убунту! О сайте
—


Unity и Задачи Google 545H, 29 мая 2011, 28 комментариев

Unity и Задачи Google

Предисловие

Google открыл API для своего сервиса Задачи. Я иногда всегда забываю что-либо сделать, поэтому записываю заметки в телефон. Но тут возникает другая проблема — я забываю смотреть записанные заметки по приходу домой. Поэтому захотелось иметь какое-то напоминание на компьютере.

Концепт

Записываем задачи на любом устройстве через веб-интерфейс или через специальную утилиту (iOS, Android), данные синхронизируются с сервисом Google. После включения компьютера дома (или где-либо еще), на лаунчере Unity показывается счетчик незавершенных задач, который всячески привлекает к себе внимание (уведомление, подсветка иконки, звуковое сопровождение).

Реализация

В принципе, у Unity есть API, позволяющий реализовать счетчик для панели (см. как это сделано для браузеров). Я решил испытать свои силы в программировании на языке Python, на котором раньше писать не пробовал.

Один хороший человек (Chad Black) уже написал скрипт, реализующий вывод заметок, за это ему большое спасибо, нам остается только приделать это все к Unity.

Поехали!

Что требуется

Самое главное — библиотеки Python:

sudo apt-get install python-dev python-gdata python-notify python-gflags python-httplib2 python-keyring python-oauth2 python-gobject python-dbus

И, возможно, какие-то еще (которые у меня уже были установлены).

Второе, но не по важности, — библиотеки для работы с API Гугла:

sudo apt-get install python-setuptools
sudo easy_install google-api-python-client

Тяжкий путь почти пройден, остается только открыть доступ к API на личной странице Google APIs Console:

  1. Открываем в браузере Консоль
  2. Передвигаем ползунок напротив Tasks API чтобы он стал зеленым с надписью ON
  3. На левой панели сайта переходим по ссылке “API Access”
  4. Создаем новое приложение (выбирайте desktop, не веб-приложение)

Мы получим client_id и client_secret — позже это будет использовано в самом скрипте.

Теперь установлено все, что нужно для работы.

Скрипт: установка и настройка

Загрузите архив со скриптом, desktop-файлом и иконкой: архив (зеркало).
Распакуйте в любую удобную папку (для примера: ~/.gtasks-cinnamon/).

Измените desktop-файл (gedit cinnamon.desktop) под своего пользователя: замените все “/home/alexander/” на “/home/ваше_имя_пользователя/“.

Перетяните desktop-файл на лаунчер Unity (файл может называться «Задачи Cinnamon»).

Добавьте хотя бы одну заметку на сервис Google Tasks.

Теперь очень важное: написать ваши client_id и client_secret в строке 45 скрипта. Кроме того, не забудьте указать свое имя пользователя (то, что стоит до @gmail.com). Должно получиться что-то вроде:

CLIENT_ID='912345684.apps.googleusercontent.com'
CLIENT_SECRET='545ILUV-InStRuCti0NZ'
CLIENT_USERNAME='hellowrrld'

Можно проверить работоспособность — запустить в терминале:
cd ~/.gtasks-cinnamon/
chmod u+x ./gtasks-cinnamon.py
./gtasks-cinnamon.py

Если никаких ошибок выдано не было и иконка на лаунчере показала счетчик незавершенных задач (как минимум одну, которую вы добавили на сервис ранее), то скрипт работает. Можно установить запуск скрипта после загрузки системы.

Если появились ошибки, то см. ниже.

Что не работает

Самая возможная причина, из-за которой скрипт не работает: не установлена какая-то библиотека.

Но есть и известные ошибки:

  • Вылет при обработке пустого списка задач
  • Вылет при отсутствии сетевого подключения

Что сделано

  • Обновление данных через 5 минут (настраивается путем изменения значения константы UPDATE_TIME в скрипте)
  • Отрисовка счетчика невыполненных задач
  • Заполнение квиклиста невыполненными задачами
  • Вздрагивание иконки при увеличении счетчика задач
  • Уведомление через NotifyOSD при увеличении счетчика задач (текст настраивается при помощи констант TXT_TITLE, TXT_NEWTASK, TXT_NEWTASKS)
  • Сокращение слишком длинных заголовков задач

Что сделать

  • звуковое уведомление
  • установочный скрипт
  • исправить ошибки
  • сделать разделение квиклистов (пока не придумано как именно)
  • сделать интерфейс добавления заметки [нужно ли?]
  • упрощенную авторизацию
  • вынести настройки в конфиг-файл

Если кто-то может и хочет помочь доделать скрипт, то напишите мне: five4five@linux.ptz.ru

Некоторые клиенты для Задач Google

Chrome\Chromium: расширение.

Android: GTasks (Маркет, QR), ToDoid (Маркет, QR).

Спасибо Сергею, Рустаму и Алому за консультации.

28 комментариев:

Gorch написал 30.5.2011 в 12:29:

Все сделал, как написано, скрипт выдает вот:

Traceback (most recent call last):
File "./gtasks-cinnamon.py", line 212, in
cinnamon.proceed()
File "./gtasks-cinnamon.py", line 154, in proceed
for task in tasks['items']:
KeyError: 'items'

Задача в списке есть одна.

545H написал 30.5.2011 в 14:19:

Gorch, у меня такое выдавало, когда были пустые списки.

Sasha Shveik написал 30.5.2011 в 14:22:

Спасибо, полезный скрипт!

545H написал 30.5.2011 в 14:30:

Sasha Shveik, у Вас заработал?

Gorch написал 30.5.2011 в 16:28:

ага, пустые списки убрал.
но теперь, почему то число задач в иконке больше числа задач в гугле на 1. :(
т.е. у меня реально 1 задача, а на иконке вижу цифру 2.

Gorch написал 30.5.2011 в 16:30:

а, все нормально, видимо пустая “невидимая” задача была.

Alexander написал 30.5.2011 в 18:24:

Действительно, скрипт полезный, но не пойму почему не подошел CLIENT_SECRET полученный при первой генерации. У меня срабатывает только в том случае, если ввожу вновь получаемый CLIENT_SECRET в терминале каждый раз. По этому в автозагрузке не работает. Что не так , подскажите, пожалуйста.

545H написал 30.5.2011 в 19:01:

Gorch, Гугл сам вставляет “невидимую” задачу, насчет этого надо быть внимательным :)

Alexander, у меня в автозагрузку тоже не сработало, но CLIENT_SECRET я не меняю. Выдает ли какую-нибудь ошибку в терминале?

Alexander написал 30.5.2011 в 19:30:

545H, после перезагрузки выдавать ошибки перестал, но скрипт запускается и работает только с терминала, из автозагрузки нет. При этом, понятно, что при закрытии терминала процесс убивается и задачи на иконке исчезают.

545H написал 30.5.2011 в 19:56:

Alexander, а в автозагрузке указываете просто путь до файла? Можно попробовать: python путь_до_файла

Alexander написал 30.5.2011 в 20:11:

Пробовал и так
python /home/alexander/Загрузки/Crome_to_Unity/gtasks-cinnamon.py
и так
/home/alexander/Загрузки/Crome_to_Unity/gtasks-cinnamon.py
разницы нет. Запускается даже из Наутилуса просто по даблклику, в терминале – само собой. Только не в автозагрузке.

545H написал 30.5.2011 в 21:30:

Alexander, тогда не знаю. У меня у самого не работает, подумаю на досуге.

Sasha Shveik написал 31.5.2011 в 15:43:

После перелогина понятно дело через автозагрузку не запустился.
Попытался запустить в терминале, в итоге ошибка:

$ /home/ap/.gtasks4unity/gtasks4unity.py
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Ftasks&redirect_uri=oob&response_type=code&client_id=450890248337.apps.googleusercontent.com

Have you authorized me? (y/n) y
What is the verification code?
You have successfully authenticated.
** Message: couldn’t connect to dbus session bus: Failed to connect to socket /tmp/dbus-CjNAzOFPAL: Connection refused
Traceback (most recent call last):
File “/home/ap/.gtasks4unity/gtasks4unity.py”, line 90, in
service = build(serviceName=’tasks’, version=’v1′, http=http, developerKey=keyring.get_password(‘googleDevKey’, CLIENT_USERNAME))
File “/usr/lib/python2.7/dist-packages/keyring/core.py”, line 30, in get_password
return _keyring_backend.get_password(service_name, username)
File “/usr/lib/python2.7/dist-packages/keyring/backend.py”, line 139, in get_password
items = gnomekeyring.find_network_password_sync(username, service)
gnomekeyring.IOError

Что делаю не так? Кейринг у меня беспарольный.

Да, и как сделать, чтобы приходило оповещение на почту о добавлении комментариев в этой статье?

545H написал 31.5.2011 в 20:30:

Sasha Shveik, возможно, нет какой-то библиотеки (что-нибудь вроде python-keyring). Я раньше не писал на Питоне, я же сказал.

Про комментарии: никак. Добавьте эту идею в штуку “Оставить отзыв” слева :)

Sasha Shveik написал 31.5.2011 в 21:58:

545H, отсутствие библиотеки возможно, но маловероятно, так как первый раз скрипт запустился и работал корректно. Ошибка произошла после того как я перезапустил сеанс. Хотя не исключаю что “sudo apt-get autoremove” и “sudo apt-get autoclean” что-то подтерли. В любом случае, пакеты указанные в статье установлены, я только что проверил.

Отзыв оставил, хотя я думаю, что после регистрации оповещения будут приходить.

545H написал 31.5.2011 в 22:07:

Sasha Shveik, а по ссылке предложенной переходили? Код вставляли? Не знаю, у Alexander (см. выше) после перезагрузки тоже не работало, а потом как-то запустилось.

Зарегистрировались где?

Alexander написал 31.5.2011 в 22:23:

У меня на запрос What is the verification code? не принимался код из CLIENT_SECRET, приходилось переходить по ссылке в терминале, получать там код и вставлять его в ответ на этот вопрос, тогда все работало. А после какого-то раза стала работать и так. Почему, не знаю. А что с автозагрузкой, без перемен ?

Sasha Shveik написал 1.6.2011 в 09:29:

Have you authorized me? (y/n) y
What is the verification code?
You have successfully authenticated.

Если бы я не вставил код, то третью строку не получил бы.

Кликнул на “Оставьте свой отзыв”, затем кликнул на одной из идей. На открывшейся страничке вверху есть “Регистрация”, но сейчас посмотрев внимательно я понял что это другой ресурс.

545H написал 1.6.2011 в 12:45:

Alexander, пока что не было времени, подумаю чуть позже. А Вы зарегистрировались в Консоли Гугла, создали приложение, добавили данные в скрипт? У меня не запрашивало в терминале вообще никаких данных.

Sasha Shveik, функция следить за комментариями будет. Над проблемой думаю.

spidermc написал 1.6.2011 в 14:50:

Никто не знает, на N900 есть клиент для этого дела?

545H написал 1.6.2011 в 19:59:

Alexander, Sasha Shveik, вот что я получил в тестах:

Запускаем как /usr/share/python /home/alexander/.gtasks-cinnamon/gtasks-cinnamon.py – получаем запрос

Запускаем как python /home/alexander/.gtasks-cinnamon/gtasks-cinnamon.py – получаем запрос

Запускаем из папки: python gtasks-cinnamon или ./gtasks-cinnamon – запроса нет.

Все интересней, чем кажется.

545H написал 1.6.2011 в 20:21:

Alexander, Sasha Shveik, нашел и устранил проблему. Как оказалось, дело в самом скрипте, а точнее, в файле tasks.dat, в котором он хранит некоторые данные. Получается, что скрипт не понимает, где этот файл (ищет в текущей папке, а надо в папке, где он лежит). Поэтому исправить можно так:

- откройте файл скрипта
- в 77-ой строке исправьте task.dat на полный путь до этого файла (например, у меня это ‘/home/alexander/.gtasks-cinnamon/tasks.dat’)
- в команде для запуска в “Запускаемых приложениях” укажите просто полный путь до файла (/home/alexander/.gtasks-cinnamon/gtasks-cinnamon.py). Естественно, у файла должны быть права на запуск.

Постараюсь летом выпустить новую версию с багфиксами.

Alexander написал 1.6.2011 в 20:50:

545H, спасибо, я выполнил все указанное и заработало из автозагрузки. Теперь предложение которое лежит на поверхности. Я думаю, что надо, чтобы с иконки на панели Unity можно было запускать браузер, который по дефолту, с открытием страницы управления задачами Google или Google calendar. А так все хорошо и главное – полезно. Удачного плодотворного лета, аВтОр. :-)

545H написал 1.6.2011 в 21:05:

Alexander, спасибо. Если хотите чтобы запускался браузер, то можно в desktop-файле убрать строки ниже X-Ayatana-Desktop-Shortcuts=GoOnline (и саму строку тоже), а в секцию [Desktop Entry] добавить такое: Exec=chromium-browser --app="https://mail.google.com/tasks/canvas" (со своим именем и любимым браузером, конечно же).

В новой версии можно сделать небольшое окошко для добавления новой задачи. Считаете ли Вы это нужным?

Sasha Shveik написал 3.6.2011 в 09:57:

После перезагрузки из консоли скрипт успешно запускается. А вот из автозагрузки почему-то не запустился. В скрипте указан полный путь к tasks.dat и python-скрипт разумееется исполняемый.

545H написал 3.6.2011 в 16:48:

Sasha Shveik, можно в “Запускаемых приложениях” попробовать написать “python полный_путь_к_файлу”.

Alexander написал 5.6.2011 в 21:13:

545H, я думаю, что возможность добавления задач напрямую (а по сути с иконки запуска) только увеличит функциональность и юзабилити т.к. исчезнет необходимость в действиях связанных с открытием страницы браузера. Dот еще предложение сделать что-то подобное с Google-calendar а то ведь извечная тема – отсутствие нормальной синхронизации google-tasks.

545H написал 6.6.2011 в 08:33:

Alexander, я тут посмотрел, баг с пустым списком невозможно воспроизвести в Google Tasks (сервис не дает удалить последнюю задачу списка).
Теперь скрипт показывает еще заметки из Tomboy и Gnote, если они есть в системе, на подходе GTG. В квиклисте сервисы разделены пунктами и при нажатии на пункт с Задачами Google открывается браузер, при клике на заметки Tomboy открывается Tomboy и т.д. Кроме того, если открывать первый пункт через Firefox, то после окна браузера произойдет принудительное обновление заметок\задач, что помогает иметь актуальный список.
Это все будет в новой версии, не знаю только, когда она выйдет.

Оставить комментарий

Вы можете использовать теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting


—

© Марк, Фрости, Рути, Доктор Зло и 545H, 2007-2011. Спасибо GOR и Onego.ru.
Ссылаемся, если копируем. Работает на WordPress.
Все права на торговые марки принадлежат их владельцам.


Лицензия Creative Commons