Как и Skype — Linux-клиент Viber хранит данные в локальной SQLite базе:
$ ls -l ~/.ViberPC/38096***26/ | grep db -rw-r--r-- 1 setevoy setevoy 38912 Jun 30 15:30 data.db -rw-r--r-- 1 setevoy setevoy 32768 Jul 10 10:38 data.db-shm -rw-r--r-- 1 setevoy setevoy 1048032 Jul 10 10:38 data.db-wal -rw-r--r-- 1 setevoy setevoy 5072896 Jul 10 09:59 viber.db -rw-r--r-- 1 setevoy setevoy 32768 Jul 10 10:15 viber.db-shm -rw-r--r-- 1 setevoy setevoy 2329736 Jul 10 10:15 viber.db-wal
История чатов лежит в базе viber.db
.
Задача — бекапить по крону чат с одним контактом, и записывать его в текстовый файл.
Содержание
SQLite
Сначала — проверяем вручную, потом добавим скрипт.
Подключаемся к базе:
Таблицы тут:
Нас интересует eventinfo
, получаем её описание:
И Contact
:
Находим пользователя и ID:
Теперь, используя этот ID — находим все сообщения пользователя:
Либо выводим только последние 2 записи:
Либо сообщения только за сегодня:
Python — скрипт бекапа
И последним шагом — небольшой python
-скрипт для бекапа чатов с этим контактом:
#!/usr/bin/env python import os import sys import sqlite3 import datetime # phone number to find path # i.e. /home/setevoy/.ViberPC/380968889900 if len(sys.argv) < 2: print('ERROR: specify your cell num as first argument.') exit(1) # some globals db_name = 'viber.db' dbpath = '/home/setevoy/.ViberPC/' contact_name = "Имя" back_path = '/home/setevoy/Backups/ViberChats' def get_mid(): """Get contact's MID""" cur = conn.cursor() mid = cur.execute("""select name, mid from contact where name='{}';""".format(contact_name)) for i in mid: return(i[1]) def get_todays_history(mid): """Select all messages for today from Contact's MID""" cur = conn.cursor() history_today = cur.execute("""select datetime(timestamp, 'unixepoch'), chattoken, body \ from eventinfo where chattoken like '{mid}%' and datetime(timestamp, 'unixepoch') like "{day}%" \ order by timestamp""".format(mid=mid, day=today)); return history_today def save_history(): """Save all todays messages to /home/setevoy/Backups/ViberChats/Name_datetime""" mid = get_mid() back_file = contact_name + "_" + today if not os.path.isdir(back_path): print('WARNING: o {} directory found, creating.').format(back_path) os.mkdir(back_path) else: print("OK: {} found.".format(back_path)) os.chdir(back_path) with open(back_file, 'w') as bf: for mes in get_todays_history(mid): data = "{}\n".format(mes) bf.write(data) if __name__ == "__main__": my_num = sys.argv[1] # Create database connection, conn = sqlite3.connect(os.path.join(dbpath, my_num, db_name)) # 2017_07_10 today = datetime.datetime.now().strftime('%Y_%m_%d') save_history()
Скрипт можно взять тут>>> (с небольшим изменением — Имя контакта передаётся вторым аргументом).
Его выполнение:
Проверяем:
Содержимое:
Последним шагом — добавляем задачу в крон:
0 0 * * * /home/setevoy/Work/RTFM/rtfm/14657/viber_backup.py 38096*****26 Имя
Готово.
Каталог ~/Backups
у меня бекапится в AWS S3 с помощью другой утилиты — myBackup.
Из недостатков — смайлики в текстовый файл сохранить проблематично, поэтому они будут None.