Le fichier que vous avez trouvé est une base de données SQLite et vous avez besoin d'une application qui peut lire les bases de données SQLite. Vous avez de nombreuses options - recherchez dans le Mac App Store pour SQLite (ou similaire) ou utilisez la commande Terminal sqlite3
.
Mais une base de données SQLite est intimidante pour un utilisateur novice, même si elle est parmi les plus simples des bases de données relationnelles. Une "base de données relationnelle" organise les données dans une ou plusieurs tables (ou "relations") de lignes et de colonnes. La puissance (et la complexité) des bases de données relationnelles réside dans la connexion des données dans deux tables ou plus via des relations.
Pour comprendre une base de données SQLite, vous avez besoin de :
- Une application - j'utilise "SQLPro for SQLite" depuis l'Apple App Store. Sa page web est SQLitePro.
- Une requête pour extraire les données que vous souhaitez. J'ai "triché" et en ai trouvé une ici Requête SQL pour chat.
Étapes pour lire chat.db :
- Faites une copie de la base de données - j'ai copié la mienne sur le Bureau.
- Exécutez votre application et ouvrez chat.db.
- Choisissez l'onglet de requête.
- Entrez cette requête :
Copiez et collez
sélectionnez
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
de
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
où
-- try to eliminate duplicates due to non-unique message.cache_roomnames/chat.room_name
(h2.service is null or m.service = h2.service)
ordre par m.date desc;
- Exécutez la requête.
Je peux alors voir tous mes messages (j'ai regroupé certaines colonnes pour masquer partiellement mon contenu) :
![Base de données de chat]()
Vous pouvez utiliser différentes applications - j'ai utilisé dbHarbour (gratuit, je pense).
Ou vous pouvez le faire dans Terminal avec quelques commandes incroyablement détaillées et pointilleuses / impitoyables envers même une seule faute de frappe :
gilby@Beth/Users/gilby/Desktop% sqlite3 chat.db
Version SQLite 3.32.3 2020-06-18 14:16:19
Entrez ".help" pour obtenir des indices d'utilisation.
sqlite> .mode csv
sqlite> .output chat.csv
sqlite> sélect <<<< Il suffit de copier et coller la requête ci-dessus
...> 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
...>
...> de
...> 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
...>
...> où
...> -- try to eliminate duplicates due to non-unique message.cache_roomnames/chat.room_name
...> (h2.service is null or m.service = h2.service)
...>
...> ordre par m.date desc; <<<< Appuyez sur Entrée
sqlite>
Les commandes mode et output font en sorte que la sortie aille dans un fichier CSV que vous pouvez ouvrir dans un tableur. La requête est exactement la même qu'auparavant.
C'est une plongée assez profonde dans SQLite. Bonne chance.
ÉDITION IMPORTANTE:
Pour iOS16/macOS13, il y a quelques changements dans chat.db pour prendre en charge les nouvelles fonctionnalités de Messages. Bien que le SQL ci-dessus s'exécute correctement, il ne montre pas le texte du message pour les nouveaux messages.
Lire : https://stackoverflow.com/questions/74579463/how-to-decode-message-summary-info-in-macos-messages-chat-db et https://stackoverflow.com/questions/72646565/in-the-new-macos-13-chat-db-where-is-the-text-from-edited-messages-stored qui nous disent que le texte du message est maintenant dans message_summary_info
.
Voici une explication du point de vue d'un spécialiste en criminalistique : Ce que les enquêteurs numériques doivent savoir
Pour l'instant, les changements nécessaires sont hors de ma portée de compétences ! Si quelqu'un a une solution, veuillez l'ajouter à cette réponse.