Vous pouvez joindre la table des poignées à la table des messages.
select date, id, text
from message
left join handle
on message.handle_id = handle.ROWID
Toutefois, cela ne fournit que le numéro de téléphone ou l'adresse électronique de l'Apple ID. Cela est dû au fait que chat.db ne stocke pas les noms des contacts - ceux-ci sont recherchés à la volée par Messages.
Vous pouvez joindre la base de données du carnet d'adresses et effectuer une requête joignant les tables des deux bases de données pour obtenir les informations dont vous avez besoin.
-
Démarrer une session sqlite3. Ouvrez le Terminal et exécutez
sqlite3
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
-
Déterminez la base de données des contacts à utiliser. Les contacts peuvent provenir de plusieurs sources. Dans mon cas, tous mes contacts sont sur iCloud, il est donc facile de choisir la plus grande base de données. Allez à
~/Library/Application Support/AddressBook/Sources
et trouver le dossier ayant la plus grande taille, ou bien parcourir le dossier des métadonnées de chaque dossier en utilisant QuickLook pour trouver des contacts dans la base de données.
-
Une fois que vous avez trouvé le dossier dans Sources contenant les contacts que vous souhaitez, obtenez le chemin d'accès à la base de données. Cliquez avec le bouton droit de la souris sur AddressBook-v22.abcddb
dans le dossier contenant vos contacts, maintenez enfoncé et sélectionnez "Copier "AddressBook-v22.abcddb" comme nom de chemin".
-
Dans le Terminal de sqlite3, exécutez ce qui suit :
attach "/Users/yourusername/Library/Messages/chat.db" as cdb;
attach "<paste your path>" as adb;
Remplacez 'yourusername' dans la première commande et collez le chemin que vous avez copié dans la seconde.
-
Exécutez ce SQL. Copiez et collez toutes ces lignes.
select date, id, ZFIRSTNAME || ' ' || ZLASTNAME, text
from cdb.message
left join cdb.handle
on message.handle_id = handle.ROWID
left join adb.ZABCDPHONENUMBER
on replace(substr(handle.id, 4), ' ', '')
like '%' || substr(replace(ZABCDPHONENUMBER.ZFULLNUMBER, ' ', ''), 2)
left join adb.ZABCDRECORD
on ZABCDPHONENUMBER.ZOWNER = ZABCDRECORD.Z_PK;
Notez que ce SQL contient quelques chiffres magiques.
-
substr(handle.id, 4)
suppose que les numéros de téléphone de Messages commencent par un code de pays sous la forme d'un plus suivi de 2 chiffres.
-
substr(replace(…), 2)
suppose que les numéros de téléphone des contacts commencent par un 0.
Il s'agit du format international standard. Il devra être adapté pour les États-Unis.
-
Vous devriez obtenir une sortie ressemblant à :
datetimestamp|+441234567890|First Last|Lorem ipsum dolor sit amet