Восстанавливаем контакты 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. Может всё таки надо терять и разбивать телефоны. Завершать старые установки и программы, стремиться к новому. Может и к лучшему, что все номера телефонов удалились. Подождите, те кому вы нужны обязательно вам позвонят, а остальные... остальные - "ненужный старый хлам"