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:
- Открываем в браузере Консоль
- Передвигаем ползунок напротив Tasks API чтобы он стал зеленым с надписью ON
- На левой панели сайта переходим по ссылке “API Access”
- Создаем новое приложение (выбирайте 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 комментариев:
Все сделал, как написано, скрипт выдает вот:
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'
Задача в списке есть одна.
Gorch, у меня такое выдавало, когда были пустые списки.
Спасибо, полезный скрипт!
Sasha Shveik, у Вас заработал?
ага, пустые списки убрал.
но теперь, почему то число задач в иконке больше числа задач в гугле на 1. :(
т.е. у меня реально 1 задача, а на иконке вижу цифру 2.
а, все нормально, видимо пустая “невидимая” задача была.
Действительно, скрипт полезный, но не пойму почему не подошел CLIENT_SECRET полученный при первой генерации. У меня срабатывает только в том случае, если ввожу вновь получаемый CLIENT_SECRET в терминале каждый раз. По этому в автозагрузке не работает. Что не так , подскажите, пожалуйста.
Gorch, Гугл сам вставляет “невидимую” задачу, насчет этого надо быть внимательным :)
Alexander, у меня в автозагрузку тоже не сработало, но CLIENT_SECRET я не меняю. Выдает ли какую-нибудь ошибку в терминале?
545H, после перезагрузки выдавать ошибки перестал, но скрипт запускается и работает только с терминала, из автозагрузки нет. При этом, понятно, что при закрытии терминала процесс убивается и задачи на иконке исчезают.
Alexander, а в автозагрузке указываете просто путь до файла? Можно попробовать:
python путь_до_файлаПробовал и так
python /home/alexander/Загрузки/Crome_to_Unity/gtasks-cinnamon.py
и так
/home/alexander/Загрузки/Crome_to_Unity/gtasks-cinnamon.py
разницы нет. Запускается даже из Наутилуса просто по даблклику, в терминале – само собой. Только не в автозагрузке.
Alexander, тогда не знаю. У меня у самого не работает, подумаю на досуге.
После перелогина понятно дело через автозагрузку не запустился.
Попытался запустить в терминале, в итоге ошибка:
$ /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
Что делаю не так? Кейринг у меня беспарольный.
Да, и как сделать, чтобы приходило оповещение на почту о добавлении комментариев в этой статье?
Sasha Shveik, возможно, нет какой-то библиотеки (что-нибудь вроде python-keyring). Я раньше не писал на Питоне, я же сказал.
Про комментарии: никак. Добавьте эту идею в штуку “Оставить отзыв” слева :)
545H, отсутствие библиотеки возможно, но маловероятно, так как первый раз скрипт запустился и работал корректно. Ошибка произошла после того как я перезапустил сеанс. Хотя не исключаю что “sudo apt-get autoremove” и “sudo apt-get autoclean” что-то подтерли. В любом случае, пакеты указанные в статье установлены, я только что проверил.
Отзыв оставил, хотя я думаю, что после регистрации оповещения будут приходить.
Sasha Shveik, а по ссылке предложенной переходили? Код вставляли? Не знаю, у Alexander (см. выше) после перезагрузки тоже не работало, а потом как-то запустилось.
Зарегистрировались где?
У меня на запрос What is the verification code? не принимался код из CLIENT_SECRET, приходилось переходить по ссылке в терминале, получать там код и вставлять его в ответ на этот вопрос, тогда все работало. А после какого-то раза стала работать и так. Почему, не знаю. А что с автозагрузкой, без перемен ?
Have you authorized me? (y/n) y
What is the verification code?
You have successfully authenticated.
Если бы я не вставил код, то третью строку не получил бы.
Кликнул на “Оставьте свой отзыв”, затем кликнул на одной из идей. На открывшейся страничке вверху есть “Регистрация”, но сейчас посмотрев внимательно я понял что это другой ресурс.
Alexander, пока что не было времени, подумаю чуть позже. А Вы зарегистрировались в Консоли Гугла, создали приложение, добавили данные в скрипт? У меня не запрашивало в терминале вообще никаких данных.
Sasha Shveik, функция следить за комментариями будет. Над проблемой думаю.
Никто не знает, на N900 есть клиент для этого дела?
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– запроса нет.Все интересней, чем кажется.
Alexander, Sasha Shveik, нашел и устранил проблему. Как оказалось, дело в самом скрипте, а точнее, в файле tasks.dat, в котором он хранит некоторые данные. Получается, что скрипт не понимает, где этот файл (ищет в текущей папке, а надо в папке, где он лежит). Поэтому исправить можно так:
- откройте файл скрипта
- в 77-ой строке исправьте task.dat на полный путь до этого файла (например, у меня это ‘/home/alexander/.gtasks-cinnamon/tasks.dat’)
- в команде для запуска в “Запускаемых приложениях” укажите просто полный путь до файла (/home/alexander/.gtasks-cinnamon/gtasks-cinnamon.py). Естественно, у файла должны быть права на запуск.
Постараюсь летом выпустить новую версию с багфиксами.
545H, спасибо, я выполнил все указанное и заработало из автозагрузки. Теперь предложение которое лежит на поверхности. Я думаю, что надо, чтобы с иконки на панели Unity можно было запускать браузер, который по дефолту, с открытием страницы управления задачами Google или Google calendar. А так все хорошо и главное – полезно. Удачного плодотворного лета, аВтОр. :-)
Alexander, спасибо. Если хотите чтобы запускался браузер, то можно в desktop-файле убрать строки ниже
X-Ayatana-Desktop-Shortcuts=GoOnline(и саму строку тоже), а в секцию[Desktop Entry]добавить такое:Exec=chromium-browser --app="https://mail.google.com/tasks/canvas"(со своим именем и любимым браузером, конечно же).В новой версии можно сделать небольшое окошко для добавления новой задачи. Считаете ли Вы это нужным?
После перезагрузки из консоли скрипт успешно запускается. А вот из автозагрузки почему-то не запустился. В скрипте указан полный путь к tasks.dat и python-скрипт разумееется исполняемый.
Sasha Shveik, можно в “Запускаемых приложениях” попробовать написать “python полный_путь_к_файлу”.
545H, я думаю, что возможность добавления задач напрямую (а по сути с иконки запуска) только увеличит функциональность и юзабилити т.к. исчезнет необходимость в действиях связанных с открытием страницы браузера. Dот еще предложение сделать что-то подобное с Google-calendar а то ведь извечная тема – отсутствие нормальной синхронизации google-tasks.
Alexander, я тут посмотрел, баг с пустым списком невозможно воспроизвести в Google Tasks (сервис не дает удалить последнюю задачу списка).
Теперь скрипт показывает еще заметки из Tomboy и Gnote, если они есть в системе, на подходе GTG. В квиклисте сервисы разделены пунктами и при нажатии на пункт с Задачами Google открывается браузер, при клике на заметки Tomboy открывается Tomboy и т.д. Кроме того, если открывать первый пункт через Firefox, то после окна браузера произойдет принудительное обновление заметок\задач, что помогает иметь актуальный список.
Это все будет в новой версии, не знаю только, когда она выйдет.
Оставить комментарий