Локальное хранилище
Сохраняйте историю WhatsApp, запрашивайте старые сообщения с телефона и проверяйте полноту данных.
wa сохраняет ваши сообщения WhatsApp на вашем компьютере, а также все прочитанные ответы оттуда. Эта страница предназначена для тех случаев, когда вы хотите, чтобы сохраненная история была актуальной: для ее поиска, чтобы ваш агент мог ответить без подключения или экспортировать чат в файл.
Прочитав его, вы узнаете, что и где сохраняет wa, как запросить на телефоне более старую историю, как поддерживать актуальность локального хранилища, пока вас нет, как ее экспортировать и создавать резервные копии, а также как проверять ее работоспособность.
Термины, используемые на этой странице:
- Локальное хранилище (также называемое архивом): один файл базы данных SQLite на этом компьютере, в котором хранятся чаты, сообщения и люди, которых видел
wa. Каждое чтение, поиск и экспорт ответов из него, не спрашивая WhatsApp. - Отправка истории: копия ваших последних чатов, которую телефон отправляет один раз, через несколько секунд после установления связи (linking).
- Охват: какие участки истории чата хранятся в локальном хранилище без пробелов.
serve: процессwa, который остается на связи и сохраняет новые сообщения, изменения и удаления по мере их возникновения.
Откуда берется история
В WhatsApp нет запроса на «чаты». Локальную базу данных заполняют три вещи, и ничего больше:
- Отправка истории сразу после связывания.
wa <profile> session startиsetupоставляют соединение открытым и сохраняют его, пока телефон не замолчит в течение 45 секунд. serve, пока он работает: новые сообщения, изменения, удаления и реакции, а также отправленные вами сообщения. При редактировании сохраняется время сообщения, ответ и реакции; только редактирование сообщения, которого нет в локальном хранилище, сохраняется со временем редактирования. Чат, который вы читаете на телефоне, получает счетчик непрочитанных 0, и каждое новое сообщение от кого-то еще добавляет один. Архивация, отключение звука (с его завершением) и пометка чата непрочитанным на телефоне сохраняются; закрепление, удаление или очистка чата — нет.messages sync <chat>: старые сообщения одного чата, заданные с вашего телефона (ниже).
Таким образом, в чате хранится то, что телефон отправил и что пришло, пока работал serve. Сообщение, которое пришло, пока ничего не было подключено, может все равно прийти, когда serve запустится снова.
Старая история с вашего телефона
WhatsApp не хранит копии ваших чатов на своих серверах: единственная полная копия находится на вашем телефоне. Так и нет загрузки, только запрос на телефон: "отправьте мне 50 сообщений этого чата перед этим". wa отсчитывает от самого старого сообщения чата, который уже хранится в локальном хранилище, поэтому чат, о котором в локальном хранилище ничего нет, не может быть задан.
Сначала откройте WhatsApp на телефоне. Телефон отвечает, пока приложение открыто; в фоновом режиме он сохраняет запрос и ответы, когда вы в следующий раз откроете его. Запрос, на который он не отвечает в течение 25 секунд, завершается с ошибкой timeout; поздний ответ все равно приходит, и работающий serve сохраняет его, поэтому ничего не теряется. Пустой ответ означает, что чат начинается здесь.
wa personal messages sync <chat> отправляет этот запрос, страница за страницей, с интервалом не менее 2 секунд, пока не достигнет --limit или начала чата. Когда телефон отправляет короткую страницу, wa запрашивает оставшуюся часть еще один или два раза с интервалом в одну секунду. Он запрашивает один чат за раз: --all отказано, так как у WhatsApp нет списка чатов для просмотра.
Что можно сделать
| Задача | Команда |
|---|---|
| Посмотрите, какая часть каждого чата сохраняется | wa personal store status |
| Постоянно поддерживать актуальность локального хранилища | wa personal server start, wa personal server install |
| Читать чаты | wa personal messages list <chat>, никогда не подключается |
| Экспортируйте чат в строки JSON или Markdown | wa personal store export <chat> --output <file> |
| Подготовить сообщения для агентского брифа | wa personal messages evidence <chat> |
| Проверка, резервное копирование и восстановление локального хранилища | wa personal store check, wa personal store backup, wa personal store restore |
Что он хранит
- Передача истории с телефона и то, что слышат
serveиwatch: сообщения, изменения, удаления и реакции. Последняя реакция каждого человека сохраняется, поэтому в сообщении показано, сколько людей отреагировало на каждый смайлик и какой из них ваш. Отмененная реакция отбрасывается, и более старый толчок никогда не возвращает реакцию, изменившуюся с тех пор. Ваши реакции с телефона сохраняются; тот, который вы отправляете с помощьюreactions add, попадает в WhatsApp, но не сохраняется. - Сообщения, которые вы отправляете с помощью
wa. - Независимо от того, получил ли другой человек и прочитал ваше сообщение в индивидуальном чате:
deliveryстановитсяdelivered, когда оно доходит до его телефона, иread, когда он его открывает (проигранная голосовая заметка засчитывается). Оно движется только вперед. Это происходит из квитанцийserve,watchи любых других команд, а также из истории push. В сообщениях группы их нет: WhatsApp сообщает о группе по одному человеку за раз.waне отправляет для этого собственного уведомления о прочтении. - Звонок вам, который
serveилиwatchслышит, как сообщение в чате звонящего или в группе: "Входящий голосовой вызов" во время звонка, затем, когда он заканчивается, "Голосовой вызов" (ответил, также на телефоне), "Отклоненный голосовой вызов" (тоже на телефоне) или "Пропущенный голосовой вызов" (раздался звонок, или абонент повесил трубку) вверх первым, как показывает телефон). Вызов, который поступил, когдаwaне был подключен и окончание которого WhatsApp не отправляет повторно, сохраняется как пропущенный. Звонок, который завершился по неизвестнойwaпричине, читается как «Голосовой вызов» безoutcome. Вызов помечен"action": "call"вprovider_metadata, сvideo,outcomeи длиной в секундах только тогда, когдаwaуслышал и ответ, и конец; ответ на звонок по телефону не имеет никакого значения. Групповой вызов сохраняется только во время звонка. Звонки, которые вы совершаете с телефона, а также звонки, сделанные до подключенияwa, не сохраняются. - Чаты и люди, как их называет WhatsApp: человек по идентификатору
…@lid, группа по идентификатору…@g.us.
Он сохраняет текст каждого прочитанного сообщения. Для фотографии, голосовой заметки или файла сохраняется его имя, размер и тип, а также ключи, которые WhatsApp нужны для повторного получения (messages download), а не сам файл; ключи никогда не появляются в ответе. Сообщения, сохраненные до обработки файлов wa, не имеют ни одного файла, а также не содержат фото или видео для однократного просмотра (вложения файлов). Магазин доступен для чтения только вашему пользователю и не зашифрован (security).Это один файл для каждой аккаунта и каждого интерфейса командной строки мессенджера, построенный на одной и той же библиотеке, например tg и max:
~/.local/share/WireCat/wirecat.db # Linux and macOS; MESSAGING_STORE moves itwa personal session end отключает устройство и оставляет локальное хранилище без изменений.
Сколько хранится
wa personal store status # per chat: messages stored, the oldest and newest, the stretches held completelywa personal store status "Book club" # one chatwa personal store status [email protected] # one chat, by its idУчасток, «удерживаемый полностью», представляет собой серию сообщений без перерыва. Разрыв между историческим толчком и днем начала serve остается разрывом.
Поддержание актуальности: serve
wa personal serve остается на связи до тех пор, пока его не остановят, и сохраняет каждое новое сообщение, редактирование, удаление и реакцию. На каждый профиль запускается один serve. Ничто не начинается для вас.
Пока работает serve, он поддерживает одно соединение устройства, поэтому отправка, редактирование или реакция на один и тот же профиль проходят через serve и используют это соединение (одно соединение на устройство). Чтения никогда не подключаются, поэтому они работают рядом с ним. Чтение без serve предупреждает, что локальное хранилище может быть устаревшей.
wa personal watch печатает новые сообщения по мере их поступления. Пока serve работает, он прослушивает serve; без serve он сам держит соединение.
На заднем плане
wa personal server start # start serve in the background; answers once it listenswa personal server status # whether it runs, since when, who started itwa personal server logs -n 50 # its latest log lineswa personal server stopwa personal server restartКак услуга
Чтобы он работал при входе в систему, установите его как пользовательскую службу: пользовательский модуль systemd в Linux, агент launchd в macOS.
wa personal server install # writes the unit for this profile; starts nothingwa personal server start # starts it — through the unit, now that there is onewa personal server statusВ Linux systemctl --user enable с именем устройства заставляет его запускаться при каждом входе в систему. В macOS агент входит в ~/Library/LaunchAgents/.
- Устройство работает под управлением
nodeиwa, которые его установили. Установите его снова после перемещения, например, после смены версии Node. - Он получает профиль и переменные
WA_*_DIRиMESSAGING_STOREоболочки, в которой выполнялсяserver install, и ничего больше. - Проверьте это один раз после
server start:wa personal server logs. wa personal server uninstallудаляет блок. Останови это первым.wa upgradeперезапускает работающий сервер, поэтому старая версия не продолжает работать.
Поиск
wa personal search messages находит сохраненные сообщения по словам, отправителю, чату, дате и вашим собственным тегам. Поиск — это руководство с сохраненными поисковыми запросами и счетчиками. Пустой ответ означает «нет в этом хранилище», а не «никогда не отправлялось».
Экспорт
wa personal store export "Book club" --jsonl > book-club.jsonl # one message per line, oldest firstwa personal store export "Book club" --json > book-club.json # { "items": [...] }wa personal store export "Book club" --format markdown > book-club.md # a transcript: a heading per daywa personal store export "Book club" --output book-club.jsonl --since-time 7d # the last week, a file only you readЭкспорт записывает только то, что хранится в локальном хранилище, и никогда не запрашивает WhatsApp. Сначала проверьте wa personal store status.--output <file> записывает строки JSON или расшифровку с --format markdown в новый файл, который можете прочитать только вы, и печатает, куда они пошли и сколько сообщений он содержит. Он никогда не перезаписывает файл. --since-time занимает время ISO 8601 или 30m, 2h, 1d назад.
В папку, и только то, что изменилось
wa personal store export "Book club" "Work" --output-dir ~/wa-export # a JSON-lines file per chat, and manifest.jsonwa personal store export --include group --output-dir ~/wa-groups # every stored groupwa personal store export --all --output-dir ~/wa-all # every stored chat of this accountЗапустите его еще раз в той же папке, и он добавит только то, что изменилось с момента последнего запуска: новые сообщения, изменения (также старые сообщения) и удаления. Удаленное сообщение записывается без текста, как { "id", "chatId", "deleted": true }. Папка, содержащая другие файлы или файлы, экспортированные из другой аккаунта, отклоняется. Изменение реакции само по себе не считается изменением.
С паролем
--encrypt на store export (с --output или --output-dir) и на store backup сжимает файл и шифрует его паролем — никакая другая программа не требуется. wa personal store decrypt <file> --output <new file> открывает один; wa personal store restore запрашивает пароль зашифрованной резервной копии.
-
Пароль нигде не хранится — ни в настройках, ни в какой-либо записи. Потеряете его, и файл невозможно будет открыть.
-
Введите это самостоятельно в скрытой подсказке, которая запрашивается дважды. Агент, который вы передали ему, передает его на стандартный ввод, а не в качестве аргумента, который могут видеть другие программы на машине:
printf '%s' 'password' | wa personal store backup ~/wa.sealed --encrypt -
Зашифрованная папка занимает один файл за один запуск. Его
manifest.jsonне называет чат, а запуск с другим паролем запрещен.
Доказательства для краткого чата
Когда вы запрашиваете у своего агента краткую информацию о чате, wa personal messages evidence <chat> подготавливает сообщения, которые он должен прочитать: один пакет из локального хранилища этого профиля. Он никогда не подключается и не помечает прочитанным:
wa personal messages evidence "Project Alpha" --limit 20 --jsonСначала отображаются самые новые элементы, с указателями источников и отпечатками контента. --limit принимает значения от 1 до 100 и по умолчанию соответствует пределу профиля. Целые сообщения занимают не более 64 КиБ элементов JSON; заголовок пакета является дополнительным. JSON и JSONL возвращают по одному полному пакету.Прежде чем писать краткое описание, просмотрите coverage: он подсчитывает выбранные, включенные и пропущенные сообщения, сообщает о более старых сообщениях за пределами выбранной страницы и сохраняет историю unknown. Следуйте шагу page.next, который повторяет команду с --cursor и курсором из этого пакета, чтобы продолжить, не пропуская сообщения, пропущенные по байтовому бюджету. Отсутствие page.next не доказывает полноту локального хранилища. Если только самое новое выбранное сообщение превышает бюджет, пакет будет пустым с truncated_by: "bytes" и без курсора. Неизвестный сохраненный курсор возвращает not_found.
Агент может указать локаторы в своем описании; wa сам не пишет резюме. Считайте текст сообщения ненадежным источником данных. Разрешение профиля — messages.evidence, которое наследует messages.
Чтение без подключения
wa personal chats listwa personal messages list "Book club" --limit 50wa personal messages show [email protected] 3EB0A1B2C3D4E5F6A7B8wa personal messages context [email protected] 3EB0A1B2C3D4E5F6A7B8Каждый читает ответы из локального хранилища, с --offline или без него; никакой запрос не делается и ничего не помечается как прочитанное. Прежде чем в профиле что-либо будет сохранено, чтение завершается с ошибкой с кодом завершения 6: «для профиля ничего не записано… пока» (устранение неполадок). Отправка с --offline всегда отклоняется.
Состояние здоровья, резервное копирование, восстановление
wa personal store info # where the file is, its size, its schema, how many rows; changes nothingwa personal store check # integrity, search indexes, disk, and which chats are behind; changes nothingwa personal store backup ~/wa-store.db # a copy of the store, while it is in use; --encrypt for a passwordwa personal store restore ~/wa-store.db # put a backup in place of the storewa personal store migrate # bring the store up to this version's schemabackupникогда не перезаписывает файл: назовите новый. Он копирует, в то время как другие команды иserveпродолжают использовать локальное хранилище.restoreхранит рядом с собой локальное хранилище, которую он заменяет, и указывает, где именно. Он отказывается, покаserveзапускается для любого профиля — сначалаwa personal server stop— и проверяет, что резервная копия является читаемым и неповрежденным хранилищем. После этого перезапустите всеserveиmcpлюбого запущенного интерфейса командной строки WireCat, чтобы они прочитали восстановленное хранилище.migrateнеобходим только в том случае, еслиinfoилиcheckсообщает, что файл принадлежит этой версии. Сначала сделайте резервную копию. Затем он нормализует старые сообщения в пакетном режиме; остановка ничего не потеряет.- Из WhatsApp ничего не возвращается. Сообщение, потерянное из локального хранилища, не может быть получено снова; сохраняйте резервную копию.
Ремонт и обслуживание индекса
wa personal store migrate строит незавершенные индексы; wa personal store rebuild восстанавливает их. store info и store check показывают, готовы ли индекс слова и индекс основы слова. Поиск использует основы (часть слова, форма которой остается неизменной) для поиска форм слов; exact: и --exact выбирают точные формы.
Стеммеры хранилища имеют общую настройку: wa config set searchStemmers.latin english,spanish (по умолчанию) и searchStemmers.cyrillic russian; none отключает один. Запустите store rebuild по вашему выбору. Этот параметр влияет на каждый интерфейс командной строки WireCat и каждый профиль; процесс, заблокированный профилем, не может его изменить.
wa personal store repair --dry-run --json выполняет предварительный просмотр структурного ремонта и откатывает его. store repair применяет его без удаления данных: несовпадающие таблицы сохраняются как копии, а оставшиеся там строки или столбцы именуются в ответе. Проверьте копии перед удалением одной из них с помощью store copies delete <exact name>. Перед восстановлением остановите процессы, использующие локальное хранилище.
Магазин и другие версии
У макета хранилища есть версия. Более новая версия wa или другой интерфейс командной строки WireCat может обновить файл; более старый wa продолжает работать с ним до тех пор, пока позволяют изменения. Если этого не происходит, каждая команда, открывающая локальное хранилище, говорит:
the message store was written by a newer version (schema N, needs at least M; this one speaks K) — upgrade this toolОбновите wa, tg и max вместе, чтобы они использовали одно и то же хранилище.
Далее
- Поиск: найдите то, что хранится в локальном хранилище.
- Рецепты: поиск и экспорт в повседневной работе вашего агента.
- Безопасность: что локальное хранилище означает для конфиденциальности ваших сообщений.
Сохраняйте независимые копии СМИ
Используйте независимый медиа-архив, если файлы должны пережить удаленные сообщения или ссылки для скачивания с истекшим сроком действия. Он хранит байты в выбранной вами папке, а в манифесте записываются идентификаторы, размер и контрольная сумма каждого файла SHA-256. Спросите своего агента: «Создайте резервную копию файлов из группы «Пример» в моем медиа-архиве, затем проверьте копии».
WhatsApp архивирует только уже полученные сообщения в локальную историю. Оставьте wa personal serve включенным, чтобы получать новые сообщения. Для серверной копии с истекшим сроком действия может потребоваться повторная загрузка телефона, что может привести к сбою; нет никакой гарантированной гарантии сохранения.
Сохраните все доступные чаты или повторите --chat, чтобы выбрать несколько. --since-time включает сообщения с временной меткой ISO или после нее с часовым поясом:
wa personal attachments download ~/media-archive --chat "Example group" --since-time 2026-10-01T00:00:00Z --timeout 6h
wa personal attachments check ~/media-archive --offline --jsonРезультат сообщает о сохраненных файлах, проверенных существующих копиях и посещенных чатах. При повторном запуске проверяется каждая существующая копия и загружаются недостающие идентификационные данные. Файлы имеют идентификационные имена .bin; их манифесты идентифицируют чат, сообщение и позицию вложения. В манифесте не сохраняется URL-адрес загрузки, медиа-ключ или исходное имя файла. Эти независимые копии не регистрируются как сохраняемые пути в хранилище сообщений; используйте обычный messages download для файлов, которые вы хотите найти с помощью attachments show или извлечения текста.
Вырезанный запуск сохраняет завершенные файлы. Запустите ту же команду еще раз: прерванный файл перезапускается с нулевого байта, поскольку потоки сообщений не предоставляют валидаторов, необходимых для безопасного добавления. Неудачная загрузка останавливается с ошибкой; недоступный файл не считается сохраненным. Отсутствие или изменение заархивированного файла приводит к сбою проверки с ненулевым кодом завершения и дальнейшему архивированию. Выберите новое место назначения; существующие файлы никогда не перезаписываются. complete: true охватывает историю, доступную выбранному читателю, а не доказательство того, что все старые исходные файлы все еще существуют.
Ежедневное резервное копирование в Linux
Ежедневное резервное копирование отключено до тех пор, пока вы не установите и не запустите пользовательский таймер systemd. Установка ничего не начинается:
wa personal attachments jobs install ~/media-archive --chat "Example group" --at 03:00 --timezone UTC
wa personal attachments jobs start ~/media-archive
wa personal attachments jobs status ~/media-archiveТаймер запускается с использованием захваченного исполняемого файла, местоположения профиля и файла, шестичасового тайм-аута и разрешений только для владельца. По умолчанию — 03:00 UTC; --timezone Europe/Madrid выбирает местный часовой пояс. Конфигурация пользовательской службы вашей системы определяет, будет ли она работать, когда вы вышли из системы; пропущенные запуски учитываются при следующем запуске таймера. macOS и Windows могут запустить команду загрузки вручную.
wa personal attachments jobs stop ~/media-archive
wa personal attachments jobs uninstall ~/media-archiveСтоп предотвращает будущие запуски; уже запущенная загрузка завершается. Для удаления требуется отключенный неактивный таймер и неактивная служба, а архив сохраняется. Используйте для этих команд один и тот же профиль и место назначения. Чтобы изменить расписание или исполняемый файл, остановите работу, удалите и установите снова; отредактированные файлы модулей сохраняются.
После резервного копирования attachments check должен сообщить, что каждый файл действителен. Для поиска текста из обычных загрузок перейдите к вложенным файлам.
Переместите старые изображения в другой архив
Чтобы сохранить размер активной папки, переместите изображения старше выбранной даты сообщения в другой проверенный архив. Используйте другой диск, чтобы освободить место на исходном диске. Сначала предварительный просмотр:
wa personal attachments move ~/media-archive /mnt/archive/older-images --before-time 2026-10-01T00:00:00Z --dry-run
wa personal attachments move ~/media-archive /mnt/archive/older-images --before-time 2026-10-01T00:00:00Z --timeout 6h
wa personal attachments check ~/media-archive --offlineДля обрезки используется дата сообщения, а не дата загрузки, и исключаются изображения точно в момент обрезки. Фотографии и файлы с изображением MIME-типа перемещаются; другие файлы остаются. Место назначения копируется и проверяется перед удалением локальных байтов изображения. Небольшие записи о перемещении остаются в исходной папке, поэтому проверки следуют за копиями, и при последующих загрузках они не извлекаются снова. Ни с одним мессенджером не связываются.
Держите другой архив доступным по его записанному пути. Если он находится в автономном режиме или изменяется копия, проверки завершаются неудачей и загрузка прекращается вместо автоматического копирования файлов. Повторите прерванное движение, чтобы завершить его. Изображения из более ранних архивов черновиков без даты сообщения остаются на месте и учитываются как undated; complete: false означает, что эти изображения нельзя выбрать по возрасту. Время модификации файла никогда не используется в качестве замены. Предварительный просмотр сообщает о количестве и байтах без создания папки назначения.