papilio

Записи с меткой «Google Apps»

Получение задач Google Tasks

Давненько я не писал в этот блог, хотя, конечно, не от того, что мне не о чем было писать или я перестал интересоваться web-разработкой и интернет-технологиями. Нет, скорее всего было просто лень :-)

Но чтобы эту лень побороть, надо пользоваться каким-нибудь планировщиком/календарём. А так как я полностью на продуктах Google, то неудивительно, что я пользуюсь Google Calendar (который замечательно синхронизируется как с системой, так и с телефоном) и теперь Google Tasks.

Итак, задача и проблема: мне необходимо вывести мои задачи Google Tasks прямо в консоли (это необходимо, например, чтобы потом повесить этот список задач прямо на мой рабочий стол, где уже есть Google Calendar). Как же это сделать, если пока нет Google Tasks API? Если нет, то нам придётся эмулировать работу браузера, чтобы получить список задач.

Для начала стоит выбрать верную версию сайта Google Tasks среди огромного множества (разные устройства, iGoogle, Gmail и т.п.). Я выбрал мобильную версию, так как можно напрямую обратиться к нужному списку:

  • https://mail.google.com/tasks/m для владельцев Google Accounts
  • https://mail.google.com/tasks/a/domain.com/m для пользователей Google Apps

Сначала я решил воспользоваться просто bash и написать скрипт. Но после того, как я довольно долго с этим промучался, я решил всё-таки писать на python, так как он есть у всех.

В итоге получился скрипт, который я немного прокомментирую чуть ниже (можно скачать отдельным файлом google_tasks.py):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#!/usr/bin/env python
 
"""
This is a python script for retrieving Google Tasks 
Usage: 
    -e or --email [email] 
        Your Google Account or Google Apps email 
    -p or --password [password] 
        Your password 
    -b or --bullet [bullet] 
        Bullet for tasks list. Default is '*'
 
Example:
    google_tasks.py -e bob@gmail.com -p yaroslavl -b --
 
Thank you Scott Hillman for the implementation of Google Authentication
http://everydayscripting.blogspot.com/2009/10/python-fixes-to-google-login-script.html
 
Evgeny Pavlov, http://evgeny.tel
"""
 
import urllib
import urllib2
import htmllib
import getpass
import re
import sys
import getopt
 
def unescape(text):
    """Removes HTML or XML character references 
       and entities from a text string
 
       From Fredrik Lundh
       http://effbot.org/zone/re-sub.htm#unescape-html
 
       Little bit modified
    """
    def fixup(m):
        text = m.group(0)
        if text[:2] == "&#":
            # Character reference
            try:
                if text[:3] == "&#x":
                    return unichr(int(text[3:-1], 16))
                else:
                    return unichr(int(text[2:-1]))
            except ValueError:
                print "Error with encoding HTML entities"
                pass
        else:
            # Named entity
            text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
        return text # leave as is
    return re.sub("&#?\w+;", fixup, text)
 
def main(argv):
    """ Get arguments: email, password and type of bullet """
 
    bullet = '* '
    email =  ''
    password = ''
 
    try:
        opts, args = getopt.getopt(argv, "he:p:b:", ["help", "email=", "password=", "bullet="]) 
    except getopt.GetoptError:
        usage()
        sys.exit(2)
    for opt, arg in opts:
        if opt in ("-h", "--help"):
            usage()
            sys.exit()
        elif opt in ("-e", "--email"):
            email = arg
        elif opt in ("-p", "--password"):
            password = arg
        elif opt in ("-b", "--bullet"):
            bullet = arg    
 
    return (email, password, bullet)
 
def usage():
    """ Help and the list of arguments for this script """
 
    print """This is a python script for retrieving Google Tasks 
Usage: 
    -e or --email [email] 
        Your Google Account or Google Apps email 
    -p or --password [password] 
        Your password 
    -b or --bullet [bullet] 
        Bullet for tasks list. Default is '*'
 
Example:
    google_tasks.py -e bob@gmail.com -p yaroslavl -b --
 
Evgeny Pavlov, http://evgeny.tel"""
 
if __name__ == "__main__":
    # Arguments
    (email, password, bullet) = main(sys.argv[1:])
 
    # Google Account or Google Apps
    email_split = email.split('@')
    try:
        email_domain = email_split[1]
    except:
        print 'Incorrect email address!\n'
        usage()
        sys.exit()
    if email_domain in ('googlemail.com', 'gmail.com', 'google.com'):
        google_apps = 0
    else:
        google_apps = 1
        email = email_split[0]
 
    # Initialization  
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
    urllib2.install_opener(opener)
 
    # Define URLs
    if google_apps:
        login_page_url = 'https://www.google.com/a/%s/ServiceLogin' % email_domain
        auth_url = 'https://www.google.com/a/%s/LoginAction2' % email_domain
        tasks_url = 'https://mail.google.com/tasks/a/%s/m' % email_domain
    else:
        login_page_url = 'https://www.google.com/accounts/ServiceLogin'
        auth_url = 'https://www.google.com/accounts/ServiceLoginAuth'
        tasks_url = 'https://mail.google.com/tasks/m'
 
    # 1. Load login page
    login_page_content = opener.open(login_page_url).read()
 
    # Find GALX value
    galx_match_obj = re.search(r'name="GALX"\s*value="([^"]+)"', login_page_content, re.IGNORECASE)
 
    galx = galx_match_obj.group(1) if galx_match_obj.group(1) is not None else ''
 
    # Set up login credentials
    login_params = urllib.urlencode( {
       'Email' : email,
       'Passwd' : password,
       'continue' : tasks_url,
       'GALX': galx
    })
 
    # 2. Login
    opener.open(auth_url, login_params)
 
    # 3. Open Tasks home page
    tasks_content = opener.open(tasks_url).read()
 
    # Check signing in
    key = re.search('create_tasks', tasks_content)
    if not key:
        print 'Check your credintals!'
        sys.exit()
 
    # Retrieve list ids
    tasks_content_split_obj = re.search(r'<select(.*?)select>', tasks_content, re.IGNORECASE)
    tasks_content_split = tasks_content_split_obj.group(1)
    listids = re.findall(r'[0-9]{20}:[0-9]:[0-9]', tasks_content_split)
 
    # 4. Fetch all lists
    for listid in listids:
        # List content
        list_content = opener.open(tasks_url + "?listid=%s" % listid).read()
 
        # Only tasks remain
        list_content_split_obj = re.search('(.*?)name="numa"', list_content, re.IGNORECASE | re.DOTALL)
        list_content_split = list_content_split_obj.group(1)
 
        # Get Tasks in
<tr></tr>
tasks_in_tr = re.findall(r'
<tr(.*?)tr>', list_content_split, re.IGNORECASE | re.DOTALL)
 
        # Work with this dirty tasks
        for task_in_tr in tasks_in_tr:
            # Retrieve task
            task_obj = re.search(r'
<td class="text">(.*?)</td>
', task_in_tr, re.IGNORECASE)
            task = task_obj.group(1)
 
            # Indent
            indent = len(re.findall(r'
<td class="checkbox"', task_in_tr)) - 1
 
            # HTML entities
            task = unescape(task)
            task = task.strip()
 
            # 5. At last output
            if task  != '': 
                print '  ' * indent, bullet, task

Скрипт выводит список задач Google Tasks в довольно приятном виде.

Как же работает этот скрипт? Всё довольно просто: для того чтобы пройти аутентификацию Google, нужны адрес электронной почты и пароль. При этом Google проверяет, как происходит вход, поэтому каждый раз генерирует специальное значение GALX, которое затем сверяет. Но обо всём (почти обо всём по порядку):

  • 31-56, функция unescape (). Необходима для конвертации т.н. HTML entities, которые присутствуют в мобильной версии Google Tasks. Переводит #&123; в нормальные символы. Реализацию подсмотрел на W3C.
  • 59-80, функция main () нам нужна для того, чтобы прочесть аргументы, переданные в командной строке. Идея из онлайн-книги Dive Into Python.
  • 106-118, определение, каким является аккаунт — Google Accounts или Google Apps. Происходит путём банальной проверки домена.
  • 134-151, аутентификация Google как раз с использованием GALX. Кроме того, необходимо использовать cookies. Идея блога Every Day Scripting. У меня получалось реализовать и с помощью wget. Если кому-то интересно, то могу поделиться.
  • А дальше происходит анализ HTML и поиск задач.

Чтобы воспользоваться скриптом, надо его просто положить в нужное вам место, сделать исполняемым (chown +x) и запускать со следущими параметрами:

google_tasks.py -e bob@gmail.com -p yaroslavl

Кроме того, можно менять оформление задач с помощью ключа -b: по-умолчанию стоит звёзточка.

Метки: , , , ,

Включение синхронизации с мобильными устройствами для Google Apps

Сегодня уже две записи, относящихся Google — думаю, что много. Тем не менее, в предыдущем посте я писал о том, что можно объединять контакты в адресной книге Google, а также синхронизировать их со своим мобильным телефоном.

Но, после того как я попробовал синхронизировать моё устройство Windows Mobile, у меня ничего не получилось. Оказывается, для тех, кто пользуется Службами Google в своём домене (Google Apps), надо самостоятельно включать такую возможность в панели управления.

Итак, чтобы включить возможность синхронизации мобильных устройств, надо зайти в панель управления, выбрать пункт Mobile (у меня английская версия):

Пункт Mobile в настройке

Пункт Mobile в настройке

И включить возможность синхронизации:

Включение синхронизации с мобильными устройствами

Включение синхронизации с мобильными устройствами

Теперь всё должно работать, если, конечно, настроить свой телефон. Спасибо блогу Google Apps.

Метки: , , , , , , ,

Google Short Links

Этой осенью Google включил Labs в Apps не только для своей почты, но и вообще во всём сервисе. Теперь там появляются новые интересные сервисы от различных разработчиков. В качестве примера я расскажу о Google Shortlinks.

Чтобы включить что-нибудь из Labs в Google Apps надо сначала, конечно, включить английский (US) интерфейс, а затем перейти по ссылке добавление новых сервисов (на этой же странице можно подключить Google App Engine или, например, недавно там появились контакты):

Добавление нового сервиса в Google Apps

Добавление нового сервиса в Google Apps

Затем нажать на ссылку See more services from Google Labs:

See more services from Google Labs

See more services from Google Labs

А уже там можно выбрать нужный сервис. Их пока всего три: Moderator, Short Links и Code Review:

Google Labs

Google Labs

Итак, мы включаем Short Links, указываем нужный нам адрес, прописываем всё в DNS и… а для чего нужен этот сервис? Это похоже на сервисы, подобные TinyURL: указываем длинную ссылку, а нам дают короткую. В принципе, это и есть полное описание. Кстати, Short Links написан на python и расположен на Google App Engine.

Google Short Links

Google Short Links

Однако, есть ряд преимуществ и существенных отличий:

  • Собственный домен для коротких ссылок.
  • Учёт количества переходов по ссылке (можно использовать для анализа чего-либо).
  • Личные ссылки (для удобства, что-то вроде быстрого набора).

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

Я пользуюсь. Удобная замена TinyURL :)

Метки: , , , , , , , , , ,

Google Адреса

Одним из наиболее заметным нововведением Gmail 2.0 стала улучшенная адресная книга, с лучшим поиском и более удобным интерфейсом:

Google Адреса

Google Адреса

Можно заметить, что адресная книга открывается не сразу, а всё из-за того, что расположена она во фрейме iframe.

Google недавно обновил отдельную страницу для адресной книги, добавив при этом свой логотип. К сожалению, адрес страницы не очень-то легко запоминаемый: http://mail.google.com/mail/contacts/ui/ContactManager.

Очень удобно иногда пользоваться такой адресной книгой. Кстати, если вы пользуетесь Google Apps (Службы Google), то адрес такой страницы уже немного другой: https://mail.google.com/a/ваш_домен/contacts/ui/ContactManager

Источник новости — Google Contacts от Google Operating System.

Метки: , , , , , ,

Google App Engine открыт теперь для всех

Блог Google System сообщил о том, что теперь Google App Engine (GAE) открыт для всех разработчиков. GAE позволяет создавать практически любые web-приложения с лёгким масштабированием.

Google App Engine

Бесплатно Google предоставляет 500 Mb свободного места и процессорной мощности на пять миллионов просмотров страниц в месяц. Скоро (или уже?) появятся и платные услуги:

$0.10 — $0.12 per CPU core-hour
$0.15 — $0.18 per GB-month of storage
$0.11 — $0.13 per GB outgoing bandwidth
$0.09 — $0.11 per GB incoming bandwidth

— что очень похоже на Amazon, о котором я недавно писал.

Я уже активировал себе GAE. Большой плюс для тех, кто пользуется Google Apps (Службы Google): можно привязать GAE к своему домену.

Google App Engine in Google Apps

Я уже придумал, что сделаю — это, скорее всего, будет что-то связанное с проектом Face Detection. Писать же пока можно только на питоне, который я совершенно не знаю, но от этого ещё более интересно что-то делать.

Можно использовать и фреймворк Django. Нашёл интересные статьи для быстрого старта:

Хоть Google и обещает сделать поддержку и других языков, но чем питон плох? Буду изучать!

Метки: , , , , , ,

Настройте SPF запись для своего домена

Оказывается, что Google может отключить ваш аккаунт в Службах Google (Google Apps) из-за, например, спама, маскирующегося под ваш адрес (то есть по сути от вашего имени рассылается спам другим).

Всё это легко исправить, если настроить Sender Policy Framework для вашего домена. В справке Google написаны все инструкции по настройке SPF:

Записи Sender Policy Framework (SPF) позволяют владельцам доменов указывать, какие хосты имеют право отправлять электронную почту от имени их доменов, затрудняя подделку адресов отправителей. Мы настоятельно рекомендуем Вам публиковать записи SPF для своего домена, так как они помогают бороться со спамом.

Чтобы задать запись SPF для домена, опубликуйте следующую запись ТХТ в ресурсе DNS: v=spf1 include:aspmx.googlemail.com ~all.

Просто добавьте TXT запись

v=spf1 include:aspmx.googlemail.com ~all

— это можно сделать в управление зоной вашего домена.

Google SPF

Ссылки по теме:

Метки: , , , , ,

Gmail App для Google Apps

Многие знают, что Gmail позволяет пользователям проверять почту любыми способами: это и через обычный браузер, и через почтовые клиенты, и через мобильный браузер. Кроме этого существует замечательное приложение для мобильных телефонов (java): Gmail App. С помощью него намного удобнее работать с почтой с телефона: небольшой объём трафика, возможность просмотра фотографий и изображений, документов Microsoft Word и файлов PDF.

Однако это всё было до недавнего времени доступно только пользователям Gmail, а те, кто пользовался почтой Google в своём домене (Google Apps), были лишены такой возможности. Конечно, были способы с подменами версий, но они не всегда срабатывали.

Итак, если вы хотите пользоваться приложением Gmail Apps для Служб Google, то просто перейдите с браузера своего мобильного телефона на сайт m.google.com/a/ и следуйте инструкциям. Если же не получается скачать Mail by Google (так называется это приложение), то можно скачать из моего блога: MailByGoogle.jar.

Выглядит приложение немного по-другому.

Gmail App для Google Apps

— другая цветовая палитра.

Цепочки

— есть поддержка цепочек.

Контакты

— и поддержка контактов с функцией быстрого поиска. Также мне понравилось, что, если в контакте записан номер сотового телефона, то можно осуществить звонок.

Метки: , , , ,

SRV-записи для GTalk в Google Apps

Для того, чтобы плавно перейти из ICQ в Jabber, я решил настроить свой GTalk с обычным icq-транспортом.

Про этапы настройки достаточно много рассказано в интернете: надо просто соединиться с GTalk через какой-нибудь Jabber-клиент (например, Psi), а потом в нём добавить ICQ-транспорт (например, icq.jabber.org.ru).

У меня GTalk «висит» на Google Apps (в собственном домене). Однако, попытавшись просмотреть Service Discovery в Psi, у меня ничего не получилось увидеть:

Обнаружение сервисов в Psi

Немного поискав в интернете, я нашёл решение этой проблемы: всё дело оказалось в SRV-записях DNS.

В справочной службе Google написано следующее:

Хотя мы объединены через федерацию с рядом других служб, некоторые из них в настоящий момент недоступны в сети Google Talk, и ваши пользователи не смогут общаться в чате с их абонентами.

Если требуется предоставить пользователям возможность общаться в чате с людьми, подключенными к сети Google Talk через объединенные в федерацию сети, то необходимо изменить записи служб (SRV). Для того чтобы пользователи могли общаться в чате с другими пользователям Служб Google для вашего домена, изменять записи SRV не требуется.

То есть для нормальной работы необходимо настроить SRV. Запись SRV нужна, чтобы указать сервер для обработки комбинации сервис/протокол/имя домена. Например, эта запись помогает соединиться с SIP пользователем, так же как MX запись помогает доставить электронную почту на сервер адресата.

Я всё настроил, как было написано в справке, однако ничего не получилось. Оказалось, что они указали не полный набор SRV-записей. Я нашёл, что надо указывать:

_xmpp-server._tcp.gmail.com. SRV 5 0 5269 xmpp-server.l.google.com.
_xmpp-server._tcp.gmail.com. SRV 20 0 5269 xmpp-server1.l.google.com.
_xmpp-server._tcp.gmail.com. SRV 20 0 5269 xmpp-server2.l.google.com.
_xmpp-server._tcp.gmail.com. SRV 20 0 5269 xmpp-server3.l.google.com.
_xmpp-server._tcp.gmail.com. SRV 20 0 5269 xmpp-server4.l.google.com.
_jabber._tcp.gmail.com. SRV 5 0 5269 xmpp-server.l.google.com.
_jabber._tcp.gmail.com. SRV 20 0 5269 xmpp-server1.l.google.com.
_jabber._tcp.gmail.com. SRV 20 0 5269 xmpp-server2.l.google.com.
_jabber._tcp.gmail.com. SRV 20 0 5269 xmpp-server3.l.google.com.
_jabber._tcp.gmail.com. SRV 20 0 5269 xmpp-server4.l.google.com.
_xmpp-client._tcp.gmail.com. SRV 5 0 5222 talk.l.google.com.
_xmpp-client._tcp.gmail.com. SRV 20 0 5222 talk1.l.google.com.
_xmpp-client._tcp.gmail.com. SRV 20 0 5222 talk2.l.google.com.
_xmpp-client._tcp.gmail.com. SRV 20 0 5222 talk3.l.google.com.
_xmpp-client._tcp.gmail.com. SRV 20 0 5222 talk4.l.google.com.

Только вместо gmail.com необходимо указать свой домен. После этих настроек у меня всё заработало:

Записи SRV надо настраивать в управлении зоной своего DNS. Правда менять SRV можно не у всех хостеров.

Метки: , , , , ,

Миграция на Google Apps

Совсем вроде недавно я писал про то, как перешёл с ретро-почты mail.ru на инновационный GMail, а теперь я перешёл и с него на него же, но в новой обёртке — Google Apps. А теперь поподробнее.

Напомню, как была устроена моя схема по получению почты. Кто-то отправлял мне письмо на адрес с мои доменом eunix.ru. Сначала письмо приходило на сервер, где хостится мой домен. На этом сервере происходило перенаправление на Яндекс.Спамооборона, где уже затем всё приходило на ящик на GMail. Так как на GMail можно настроить, с какого адреса отправлять сообщения, то всё было прозрачно для остальных: мне писали на мой адрес и я писал со своего адреса, хотя фактически пользовался GMail. Всё работало замечательно, но тем не менее было несколько минусов:

  • Слишком много промежуточных узлов — письмо могло идти и пять, и двадцать минут.
  • Из-за ограничений в SMTP-серверах как моего хостера, так и Яндекса, письма не могли быть слишком большими. Я не знаю точных значений, но отправленное мне письмо размером более 20 мегабайт не приходило.

Я решил эти проблемы, совершив переход на Google Apps.

Что такое Google Apps (или в русском варианте Службы Google)? Это сервисы и службы Google в собственном домене. То есть почта, личная страница, календарь, документы и т.п. могут находится в собственном домене. Именно это мне и нужно было.

При регистрации я выбрал бесплатный вариант, который ничем не отличается от бесплатной почты GMail, и указал, что количество пользователей будет один. А далее мне надо было совершить миграцию моей старой почты с GMail на новый ящик. Поискав в интернете, я нашёл отличный сервис, который встраивается в начальную страницу Google — гаджет gXFER от компании LimitNone. Надо указать всего лишь откуда и куда совершить миграцию. Система сама всё настраивает и сама совершает миграцию почты с одного аккаунта Google на другой. Кроме переноса почты создаются и фильтры, которые могут создавать метки.

Google Apps migration

Система перенесла мне почту за полтора дня. Технически это осуществляется простой настройкой сборщика POP3 на новом аккаунте, только система автоматически выбирает, что именно собирать, так как письма могут находится под разными метками. Конечно, перенос осуществлялся долго, хотя почты у меня всего лишь на 670 мегабайт.

Далее, чтобы почта приходила туда, куда надо, я настроил MX-записи DNS у хостера (это может быть и не у хостера, а у продавца доменных имён, а вообще это находится там, где вы держите DNS-записи), указав MX-сервера Google. То есть фактически показал, куда следует отправлять мою почту.

Настройка MX

Чтобы ещё и адрес входа в web-интерфейс был интересным, я настроил и CNAME:

Настройка CNAME

После этого у меня появилось несколько адресов, связанных со службами Google:

  • start.eunix.ru — стартовая страница Google (обычный iGoogle)
  • mail.eunix.ru — вход на почту
  • docs.eunix.ru — документы Google
  • calendar.eunix.ru — календарь Google
  • и чат GTalk с адресом моей почты (JID в терминологии Jabber)

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

GMail на Google Apps

Информацию о работе с Google Apps можно найти в справке Google, где всё по-русски написано и объяснено, в том числе и про настройку DNS.

Метки: , , , , , ,