Блог Синявского
  • Разделы
  • Метки
  • Все статьи

Восстанавливаем контакты Android через Viber Ubuntu

1

Восстанавливаем контакты Android через Viber Ubuntu

Телефон сломался, все контакты были потеряны. Но на компьютере был установлен Viber. Я стал думать, как можно контакты из Viber на Ubuntu восстановить в новый телефон. И это получилось.

Оказалось, что все контакты Viber для Ubuntu храняться в файле:

/home/<user_name>/ViberPC/<phone_number>/viber.db

Прежде, чем устанавливать на новый телефон Viber необходимо спасти этот файл, скопировав куда-либо, так как там храняться все контакты из телефонной книги и переписка.

viber.db - это на самом деле файл базы данных sqlite. Для того, чтобы его прочитать необходимо установить sqlitebrowser.

$ sudo apt-get install sqlitebrowser

Открываем с поморщью этой программы файл viber.db

$ sqlitebrowser viber.db

Дальше в поле выполнение SQL необходимо выполнить запрос:

SELECT FirstName, Number
FROM ContactRelation
INNER JOIN Contact
ON Contact.ContactID = ContactRelation.ContactID;

или

SELECT FirstName, Number
FROM Contact,ContactRelation
WHERE Contact.ContactID=ContactRelation.ContactID;

Экспорт и загрузка данных

Так же эти данные можно экспортировать в CSV. По идее я хотел CSV загрузить в Google Контакты. Но у меня не получилось CSV импортировать в Google контакты из-за незнания формата CSV, наименование полей и т.п. Опытнаым путем я выяснил только, что файл должен быть обязательно в кодировке win-1251. Таким образом у меня остался второй вариант .vcf - формат обмена визитными карточками vСard. Их кстати можно загрузить непосредственно в телефон.

Пример vCard:

BEGIN:VCARD
VERSION:2.1
FN:Иванов Иван Иванович
N:Иванов;Иван;Иванович
TEL;HOME;VOICE:79991234567
END:VCARD

Программа на Python для преобразования в vCard

Поскольку в Python есть стандарнтная библиотека для работы с sqlite, все очень просто:

#!/usr/bin/python
import sys
import sqlite3

def convert(file):
    con = sqlite3.connect(file)
    cur = con.cursor()
    cur.execute('''SELECT FirstName, Number FROM
ContactRelation
INNER JOIN
Contact
ON Contact.ContactID = ContactRelation.ContactID''')
    with open('contacts.vcf', 'w') as vc:
        for row in cur:
            vc.write(('BEGIN:VCARD\n').encode('utf8'))
            vc.write(('VERSION:2.1\n').encode('utf8'))
            vc.write(('FN:' + row[0]+'\n').encode('utf8'))
            vc.write(('N:' + row[0].replace(' ', ';')+'\n').encode('utf8'))
            vc.write(('TEL;HOME;VOICE:' + row[1]+'\n').encode('utf8'))
            vc.write(('END:VCARD\n').encode('utf8'))
    con.close()

def main(args):
    if len(args) != 2:
        print "Usage:"
        print args[0] + " filename"
        return

    convert(args[1])

if __name__ == '__main__':
    main(sys.argv)

В качестве аргумента передаем viber.db. Запускаем:

python main.py viber.db

получаем файл contacts.vcf, который можно импортировать в Google контакты или в телефон.

Программа с модулем vobject

К тому же есть дополнительный модуль для работы с vCard vobject.

Создадим виртуальное окужение:

$ mkdir contacts && cd contacts
$ virtualenv -ppython2.7 env && source env/bin/activate
(env) $ pip install vobject
(env) $ nano main.py
#!env/bin/python
import sys
import sqlite3
import vobject

def convert(file):
    con = sqlite3.connect(file)
    cur = con.cursor()
    cur.execute('''SELECT FirstName, Number FROM
ContactRelation
INNER JOIN
Contact
ON Contact.ContactID = ContactRelation.ContactID''')
    with open('contacts.vc', 'w') as vc:
        for row in cur:
            card = vobject.vCard()
            attr = card.add('fn')
            attr.value = row[0]
            name_list = ['']*3
            values = row[0].split(' ')
            for i, item in enumerate(name_list):
                try:
                    name_list[i] = values[i]
                except IndexError:
                    break

            attr = card.add('n')
            attr.value = vobject.vcard.Name(
                family=name_list[0],
                given=name_list[1],
                additional=name_list[2]
            )

            attr = card.add('tel')
            attr.value = row[1]
            attr.type_param = 'cell'
            vc.write(card.serialize())
    con.close()

def main(args):
    if len(args) != 2:
        print "Usage:"
        print args[0] + " filename"
        return

    convert(args[1])

if __name__ == '__main__':
    main(sys.argv)

Работает точно так же, как и предыдущий вариант.

P.S. Может всё таки надо терять и разбивать телефоны. Завершать старые установки и программы, стремиться к новому. Может и к лучшему, что все номера телефонов удалились. Подождите, те кому вы нужны обязательно вам позвонят, а остальные... остальные - "ненужный старый хлам"



  • ← сюда
  • туда →

comments powered by Disqus

Опубликовано

10.11.2016

Обновление

05.05.2022

Категории

ubuntu

Тэги

  • example 16
  • python 30
  • ubuntu 36
  • vcard 1
  • viber 1

Всегда на связи

  • Блог Синявского - Ничего не переносить на завтра, это тоже проблема с прокастинацией?
  • © Алексей Синявский, по лицензии CC BY-SA если не указано иное.
  • С использованием Pelican. Тема: Elegant от Talha Mansoor