10 votos

¿Cómo (específicamente) leo un archivo chat.db?

Como todos los que usan la aplicación Mensajes de Apple, tengo un archivo chat.db. Me gustaría leer el archivo pero nada parece dar los resultados esperados.

Esto es lo que he probado hasta ahora:

  • El enfoque CLI de cd a ~/Libray/Messages seguido de open chat.db fue de las mejores en cuanto a que se encontró algo y se intentó abrir el archivo. Por desgracia, no funcionó como se esperaba.

    enter image description here

  • Como ahora tenía el navegador de bases de datos para SQLite abierto, intenté abrir el archivo a través de la guía de esa aplicación, pero como la carpeta está oculta, no se mostró.

    enter image description here

¿Alguien ha tenido éxito con esto? Ciertamente no puedo ser la primera persona que lo ha intentado y he visto en otros lugares que el esquema también puede ser un problema.

0 votos

Mostrar archivos ocultos con MAYÚSCULAS-COMANDO-PERÍODO. Creo que fie IS una base de datos sqllite por lo que debería funcionar.

0 votos

Gracias por la rápida respuesta. Pero eso realmente no hace nada diferente que el enfoque CLI. Y tienes razón en que se trata de una base de datos SQLite.

0 votos

Es una base de datos SQLite y puedes abrirla con una aplicación SQLite. Hay muchas en la App Store. Pero necesitas a alguien que te proporcione una "consulta" que presente los datos de forma significativa. Mis habilidades están un poco oxidadas (y nunca fueron buenas) de lo contrario haría una respuesta con una consulta adecuada. Tal vez alguien... Y haz SIEMPRE una copia de la base de datos antes de jugar con ella.

8voto

user43889 Puntos 266

El archivo que has encontrado es una base de datos SQLite y necesitas una aplicación que pueda leer bases de datos SQLite. Tienes muchas opciones: busca SQLite (o algo similar) en la Mac App Store o utiliza el comando Terminal sqlite3 .

Pero una base de datos SQLite no es sencilla. Es una serie de tablas interrelacionadas. Las conexiones entre las tablas definen las relaciones y de ahí el término "base de datos relacional". SQLite es tal vez la más sencilla de las bases de datos relacionales SQL, pero aun así resulta intimidante para el usuario novel.

Para dar sentido a una base de datos SQLite se necesita:

  1. Una aplicación - Yo uso "SQLPro for SQLite" de la Apple App Store. Su página web es SQLitePro
  2. Una consulta para extraer los datos que desea. He hecho "trampa" y he encontrado una aquí Consulta SQL para el chat .

Pasos para leer chat.db:

  1. Haz una copia de la base de datos - yo copié la mía en el Escritorio.
  2. Ejecuta tu aplicación y abre el chat.db.
  3. elija la pestaña de consulta.
  4. Introduzca esta consulta:

Copiar y pegar

select
 m.rowid
,coalesce(m.cache_roomnames, h.id) ThreadId
,m.is_from_me IsFromMe
,case when m.is_from_me = 1 then m.account
 else h.id end as FromPhoneNumber
,case when m.is_from_me = 0 then m.account
 else coalesce(h2.id, h.id) end as ToPhoneNumber
,m.service Service

/*,datetime(m.date + 978307200, 'unixepoch', 'localtime') as TextDate -- date stored as ticks since 2001-01-01 */
,datetime((m.date / 1000000000) + 978307200, 'unixepoch', 'localtime') as TextDate /* after iOS11 date needs to be / 1000000000 */

,m.text MessageText

,c.display_name RoomName

from
message as m
left join handle as h on m.handle_id = h.rowid
left join chat as c on m.cache_roomnames = c.room_name /* note: chat.room_name is not unique, this may cause one-to-many join */
left join chat_handle_join as ch on c.rowid = ch.chat_id
left join handle as h2 on ch.handle_id = h2.rowid

where
-- try to eliminate duplicates due to non-unique message.cache_roomnames/chat.room_name
(h2.service is null or m.service = h2.service)

order by m.date desc;
  1. Ejecuta la consulta.

Así puedo ver todos mis mensajes (he aplastado algunas de las columnas para ocultar parcialmente mi contenido):

Chat database

Puedes usar diferentes aplicaciones - yo he usado dbHarbour (gratis, creo).

O puedes hacerlo en el Terminal con unos simples comandos:

gilby@Beth/Users/gilby/Desktop% sqlite3 chat.db
SQLite version 3.32.3 2020-06-18 14:16:19
Enter ".help" for usage hints.
sqlite> .mode csv
sqlite> .output chat.csv
sqlite> select   <<<< Just copy and paste the query from above
   ...>  m.rowid
   ...> ,coalesce(m.cache_roomnames, h.id) ThreadId
   ...> ,m.is_from_me IsFromMe
   ...> ,case when m.is_from_me = 1 then m.account
   ...>  else h.id end as FromPhoneNumber
   ...> ,case when m.is_from_me = 0 then m.account
   ...>  else coalesce(h2.id, h.id) end as ToPhoneNumber
   ...> ,m.service Service
   ...>
   ...> /*,datetime(m.date + 978307200, 'unixepoch', 'localtime') as TextDate -- date stored as ticks since 2001-01-01 */
   ...> ,datetime((m.date / 1000000000) + 978307200, 'unixepoch', 'localtime') as TextDate /* after iOS11 date needs to be / 1000000000 */
   ...>
   ...> ,m.text MessageText
   ...>
   ...> ,c.display_name RoomName
   ...>
   ...> from
   ...> message as m
   ...> left join handle as h on m.handle_id = h.rowid
   ...> left join chat as c on m.cache_roomnames = c.room_name /* note: chat.room_name is not unique, this may cause one-to-many join */
   ...> left join chat_handle_join as ch on c.rowid = ch.chat_id
   ...> left join handle as h2 on ch.handle_id = h2.rowid
   ...>
   ...> where
   ...> -- try to eliminate duplicates due to non-unique message.cache_roomnames/chat.room_name
   ...> (h2.service is null or m.service = h2.service)
   ...>
   ...> order by m.date desc;      <<<< Press Return
sqlite>

Los comandos de modo y salida se encargan de que la salida vaya a un archivo CSV que se puede abrir en una hoja de cálculo. La consulta es exactamente igual que antes.

Es una inmersión bastante profunda en SQLite. Mucha suerte.

0 votos

Eso funciona como se describe y creo que puedo seguir desde aquí. Gracias.

0 votos

@hrokr Genial. ¡Clasificarlo también me ha venido bien!

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X