Как прочитать историю сообщений и контакты из базы данных Viber для ПК в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Интеграция популярных мессенджеров с учетными системами 1С позволяет автоматизировать работу с клиентами, сохранять историю переписки и анализировать активность коммуникаций. В данной статье мы разберем, как получить доступ к локальной базе данных Viber для Windows, проанализируем структуру ее таблиц и научимся извлекать сообщения с привязкой к конкретным контактам и группам.

Поиск и подготовка файла базы данных

Для начала выясним, где Viber хранит свои данные. На платформе Windows база данных представляет собой файл формата SQLite format 3. Обычно он располагается в каталоге пользователя. Путь к файлу можно определить по следующему шаблону:

%USERPROFILE%\AppData\Roaming\ViberPC\%номер_телефона%\viber.db

Где %номер_телефона% — это папка, названная по вашему номеру, зарегистрированному в приложении. Прежде чем приступать к чтению данных из 1С, важно учитывать технический нюанс: если Viber запущен, файл базы может быть заблокирован. Рассмотрим варианты решения этой проблемы:

  1. Закрытие приложения: Самый простой способ, исключающий ошибки блокировки.
  2. Копирование файла: Перед чтением создадим временную копию файла viber.db средствами 1С (используя команду КопироватьФайл()) и будем работать уже с этой копией.
  3. Режим ReadOnly: При использовании внешних драйверов (например, SQLite ODBC Driver), можно попробовать открыть соединение в режиме "только чтение".

Также стоит обратить внимание на наличие в папке файлов с расширениями .db-wal и .db-shm. Это файлы журналов транзакций (Write-Ahead Logging). Для корректного чтения последних данных крайне желательно, чтобы эти файлы находились рядом с основным файлом базы при копировании.

Анализ структуры таблиц SQLite

Чтобы успешно извлечь данные, нам необходимо понимать, как они связаны между собой. Проанализируем основные таблицы, которые используются в Viber PC для хранения переписки:

1. Таблица Messages: Здесь хранится непосредственно текст и метаданные сообщений. Основные поля:

2. Таблица Events: Служит связующим звеном между сообщениями, чатами и контактами. Поля:

3. Таблица Contact: Содержит информацию о пользователях. Поля:

Выясним причину, по которой нельзя сразу получить номер телефона из таблицы Messages: в ней просто нет прямого поля Number. Связь строится через Events.EventID = Messages.EventID, а затем Events.ContactID = Contact.ContactID.

Реализация запроса для получения сообщений

Разберем по шагам, как составить SQL-запрос, который выберет все сообщения от конкретного контакта, отфильтрованные по номеру телефона. Проанализируем следующую структуру запроса:


SELECT 
    Contact.Name, 
    Contact.Number, 
    Messages.Body, 
    Events.TimeStamp
FROM 
    Messages
JOIN 
    Events ON Messages.EventID = Events.EventID
JOIN 
    Contact ON Events.ContactID = Contact.ContactID
WHERE 
    Contact.Number = '+79991234567'
ORDER BY 
    Events.TimeStamp DESC

Этот запрос позволяет получить историю переписки в хронологическом порядке. Если вам нужно получить список всех доступных таблиц для анализа структуры из 1С, можно воспользоваться системным запросом:

SELECT * FROM sqlite_master WHERE type = 'table'

Работа с групповыми чатами и участниками

Часто возникает задача получить список всех участников группового чата. Посмотрим на таблицу ChatRelation. Вопреки распространенному мнению, что там хранятся только модераторы, в актуальных версиях базы именно она связывает ChatID и ContactID для всех участников.

Рассмотрим пример запроса для получения списка имен участников конкретной группы:


SELECT 
    Contact.Name, 
    Contact.Number
FROM 
    ChatRelation
JOIN 
    Contact ON ChatRelation.ContactID = Contact.ContactID
WHERE 
    ChatRelation.ChatID = 123 -- Идентификатор нужного чата

Тип чата можно определить в таблице ChatInfo через поле ChatType (обычно значение 2 соответствует групповому чату, а 1 — личной переписке).

Преобразование времени TimeStamp в формат 1С

Viber хранит время в формате Unix Timestamp (миллисекунды). В 1С дата представляет собой количество секунд с начала нашей эры. Выясним, как выполнить конвертацию.

Поскольку TimeStamp в viber.db обычно указан в миллисекундах, сначала разделим его на 1000. Полученное число секунд нужно прибавить к дате "1970-01-01 00:00:00". Рассмотрим пример функции на языке 1С:


Функция ПреобразоватьUnixВремя(Знач Т_Unix)
    БазоваяДата = Дата(1970, 1, 1, 0, 0, 0);
    // Делим на 1000, так как Viber хранит миллисекунды
    Возврат БазоваяДата + (Т_Unix / 1000); 
КонецФункции

Важный момент: не забудьте про часовой пояс. Unix Time всегда хранится в UTC, поэтому к результату может потребоваться добавить смещение вашего региона.

Техническая реализация подключения в 1С

Для выполнения SQL-запросов к SQLite из 1С обычно используется механизм COMОбъект с драйвером ADODB. Разберем примерный алгоритм подключения:

  1. Установите SQLite ODBC Driver в операционной системе.
  2. В коде 1С создайте соединение ADODB.Connection.
  3. Укажите строку подключения, содержащую путь к файлу viber.db.

Пример кода инициализации соединения:


ПутьКБазе = "C:\Users\Admin\AppData\Roaming\ViberPC\79991234567\viber.db";
СтрокаПодключения = "Driver={SQLite3 ODBC Driver};Database=" + ПутьКБазе + ";StepAPI=0;SyncPragma=NORMAL;NoWCHAR=1;Timeout=100000;";

Соединение = Новый COMОбъект("ADODB.Connection");
Попытка
    Соединение.Open(СтрокаПодключения);
    // Далее выполняем запрос через Соединение.Execute()
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;

Дополнительные возможности

Проанализируем другие полезные таблицы, которые могут пригодиться при интеграции:

Используя приведенные выше инструкции и структуру запросов, вы сможете построить полноценную систему мониторинга или архивации сообщений Viber непосредственно внутри вашей базы 1С.

← На главную