Как стать автором
Обновить

База данных GMail Offline. Экспорт

Время на прочтение2 мин
Количество просмотров4.2K
Здравствуй, Хабрасообщество!

Давно хотел вытащить историю джаббера из GMail (впринципе достаточно удобно, но хочется без дополнительных преград пользоваться)
Когда на глаза попался топик Скачиваем историю сообщений из GTalk'a себе на компьютер, я, было, возрадовался, но, узрев громоздкость и усилия, прилагаемые для извлечения, решил что игра не стоит свеч.

Поэтому решил пойти другим путем, и разобраться в Google Gears \ GMail Offline.


Подготовка


Первым делом, нам надо Поставить Gears

Залогиниваемся в GMail, идём в чаты и помечаем ярлыком (например export) нужные чат-сессии.
Далее, идём в Настройки Gmail Offline, выбираем Включить Gmail Офлайн для этого компьютера, жмём по ссылке Изменить настройки ярлыка и ставим Все напротив ярлыка export (все остальные можно выставить в Нет, чтобы не качать лишнего.
Дальше остаётся Сохранить изменения и подождать пока Gears синхронизирует нужные цепочки с локалхостом.

База


Пройдясь по директориям Firefox, я нашёл хранилище Google Gears.

Cуть такова, что письма и чаты лежат в файле
%username%@%servername%-GoogleMail@%servername%#database
где %servername% — обычно gmail.com, но для сервисов гугл для домена — будет вашим доменом соответственно.

Заметьте: файл может называться и ...#database[1] и [2] или вообще без [цифры], так что если чатов нет в одном файле, то надо будет попробовать со всеми (кроме тех, в чьем имени есть -b, -t, -u, это какая-то служебная информация, нас она не интересует)

Сам файл базы данных находится в %GearsDatabaseDir%/mail.google.com/http_80
где _80 может быть также и _443, если используется SSL, а %GearsDatabaseDir% для вашей платформы можно узнать здесь

Как оказалось, база лежит в формате SQLite. Дальше — проще. sqlite3, скачанный с офсайта помогает нам добраться до самой сути GMail Offline.

Выдёргиваем


Для начала проверим, есть ли там сообщения для нужного нам ярлыка:
sqlite3 -line "user@gmail.com-GoogleMail@gmail.com#database" "SELECT l.`Label` as `label`,COUNT(*) as messages FROM `Labels` l, Messages m, MessageLabels ml WHERE ml.`LabelId`=l.`LabelId` AND m.`rowid`=ml.`MessageId` AND l.`Label`='export'"

Получаем:
label = export
messages = 662

Итак, сообщения есть, можно начинать экспортировать.

Создадим заголовок (<html><body>) и «подвал» (</body></html>) будущего HTML файла чатов, и запустим:
sqlite3 -list -separator '\n\n' "user@gmail.com-GoogleMail@gmail.com#database" "SELECT '<h3>'|| datetime(m.`datems`/1000,'unixepoch','+3 hours') || '</h3>' || c.`c1Body` || '<br /><br />' FROM MessagesFT_content c, Messages m, MessageLabels ml, Labels l WHERE ml.`LabelId`=l.`labelId` AND c.`rowid`=ml.`MessageId` AND m.`MessageId`=c.`rowid` AND l.`Label`='export' ORDER BY m.`datems` ASC" > body.html

(+3 hours заменить на ваш часовой пояс)

А теперь осталось только «слить» файлы в один.
Под Windows:
copy /B header.tpl + body.html + footer.tpl history_export.html

(если не ставить /B то под winxp остаётся в конце какой то стрёмный символ. сopy его зачем-то ставит)

Bash:
cat header.tpl >> history_export.html
cat body.html>> history_export.html
cat footer.tpl >> history_export.html


Вот вкратце и всё. Можно ещё воспользоваться html2text, что, учитывая объем оформления (CSS не было использовано!) — по меньшей мере рационально.

_________
За инвайт спасибо Dreadatour
Теги:
Хабы:
Всего голосов 42: ↑37 и ↓5+32
Комментарии15

Публикации

Истории

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн