Anleitung Wie man WhatsApp-Chats desselben Kontaktes nach geänderter Handynummer wieder zu einem verschmelzen kann

Kreacher

Kreacher

Fortgeschrittenes Mitglied
89
Einleitung
Wer kennt es nicht? Ein WhatsApp-Kontakt hat plötzlich eine neue Handynummer und es schreibt euch eine vorerst unbekannte, nicht eingespeicherte Nummer an mit "Hey, ich bin XYZ, das ist fortan meine neue Handynummer, bitte einspeichern..."
Die meisten werden die neue Handynummer dann einfach einspeichern, was bleibt denn schon auch groß anderes übrig?! Schließlich bleibt die Person dahinter ja derselbe Kontakt wie vorher, hat eben nur eine neue Nummer.

Für WhatsApp allerdings, bleibt die Person nicht derselbe Kontakt wie vorher. WhatsApp kann nicht wissen, dass die neue Handynummer ein alter Kontakt von euch ist, der nur seine Nr. gewechselt hat. Für WhatsApp ist dies ein völlig neuer, fremder Kontakt und es legt deswegen dann auch in seiner Datenbank einen komplett neuen Chat unter dieser neuen Nummer an.

Für manche reicht das dann - eventuell wollte man sowieso mal die alten Chats ausmisten, also perfekt für einen neuen, leeren Chat-Neustart.
Andere wiederum finden das suboptimal - sie hätten gerne auch bei einer neuen Nummer des Kontakts gerne da weitergeschrieben, wo der alte Chat aufgehört hat und in ihrer Chatliste (je nach Häufigkeit des Nummernwechsels eines Kontakts) dann nicht zig verschiedene "alte" Chats von ein und demselben Kontakt, chronologisch dann total auseinandergerupft...
Die Frage ist: kann man Chats von verschiedenen Handynummern (von ein und derselben Person dahinter) so miteinander vereinen, dass am Ende wieder ein chronologischer, kompletter Chat herauskommt bzw. man einfach dort weiterschreibt, wo der alte Chat aufgehört hat?

Die Antwort: Ja! Wenn auch mit ein paar Hindernissen.
Da ich mich seit ca. einem 3/4 Jahr aus persönlichen Gründen massiv mit dem Aufbau und der Struktur von WhatsApp's Datenbank beschäftigt habe und eigentlich dabei primär ein anderes Ziel verfolgt habe (nämlich das Verschmelzen von unterschiedlichen Chatverläufen/Backups aus verschiedenen Zeitpunkten (und spoiler: auch DAS ist möglich!)), bin ich auf dieses Phänomen hier eher durch Zufall gestoßen, finde es aber nichtsdestotrotz ein nützliches Tool, das ich mittlerweile selber bei mir angewendet habe, um die Nummernwechsel einiger Kontakte allesamt im jeweils neusten Chat zu vereinen. Im Folgenden werde ich darlegen, wie dies möglich ist.

Voraussetzungen
Für so ein Vorhaben ist es notwendig, Zugriff auf WhatsApp's System-Datenbank zu haben, denn dort müssen die Änderungen vorgenommen werden. Diese Betriebsdatenbank ist leider nur zugänglich, wenn man ein Smartphone/Handy in Nutzung hat, welches ROOT-Rechte hat. Denn die Datenbank von WhatsApp befindet sich im Root-Bereich unter:

root/data/data/com.whatsapp/databases/msgstore.db

Aber keine Sorge! Ihr müsst jetzt nicht euer aktuelles Smartphone "rooten" und damit Garantie und Funktionalität riskieren. Es reicht schon aus, wenn man für dieses Vorhaben ein älteres, Garantie-abgelaufenes Smartphone "missbraucht" und dafür rootet - ich habe z.B. ein altes Samsung Galaxy S7 Edge dafür genommen. Gerootet, dann meinen aktuellen WhatsApp-Account draufgespielt und schon kann's losgehen. Wenn am Ende alles abgeschlossen ist, kann man dann sein modifiziertes WhatsApp einfach wieder auf sein aktuelles Smartphone rüberziehen.

Wie man genau rootet, beschreibe ich hier jetzt nicht. Da gibt's in diesem Forum (oder auch anderswo) sicherlich gute Anleitungen dafür.

Vorgehen
Um die System-Datenbank von WhatsApp erst einmal öffnen und anzeigen zu können (ich empfehle hierbei unbedingt das Arbeiten mit einem Computer - nicht vom Handy selbst, wobei dies wohl auch möglich wäre), benötigt man eine Software, mit welcher man Datenbanken im Format *db öffnen kann. Ich verwende hierfür das kostenlose "DB Browser for SQLite"

Damit öffnet man nun also die auf den PC aus dem obigen Root-Verzeichnis gezogene msgstore.db-Datenbank von WhatsApp. Wer sich mit SQL bzw. Datenbanken auskennt, hat es dementsprechend leicht(er) - für mich als informatik-ferne Person war dies dementsprechend alles erstmal Neuland und sehr verwirrend. Mit der Zeit versteht man aber mehr und mehr.

Das folgende Grundverständnis bezüglich WhatsApp-Chats ist aber wichtig, wenn man verschiedene Chats miteinander verschmelzen möchte:

Angenommen, euer Kontakt A hat die Handynummer 1234. Sobald ihr diesen Kontakt in euer Handy-Adressbuch einspeichert (selbst wenn ihr damit nie einen WhatsApp-Chat startet), greift WhatsApp auf diese Daten zu und legt in seiner Datenbank in der Tabelle JID (= Job Identifier) die jeweilige Handynummer unter einer sog. JID-ID in der Spalte "User" ab.
Das sieht in der WA-Datenbank dann so aus:

jid.jpg

Die Nummer beginnt (für deutsche Kontakte) also immer mit dem Ländercode "49", gefolgt von der Handynummer. Jeder Kontakt im Adressbuch, ob er nun für WhatsApp relevant ist oder nicht (folglich also auch Festnetznummern oder 0800er-Nummern) bekommt in der WhatsApp-Datenbank eine JID-ID zugeordnet.

Eröffnet ihr nun einen Chat in WhatsApp mit einer bestimmten Nummer, erstellt WhatsApp in der Tabelle "Chat" eine ID, die diesen Chat exakt identifiziert, z.B. 50. Damit der Chat mit der _ID 50 aber auch einer Handynummer zugeordnet werden kann, verweist der Chat mit der _ID 50 in der Chat-Tabelle auch auf die jeweilige jid-row-ID in der JID-Tabelle. Wir sehen also, dass der Chat mit der chat_row_id=50 einer jid_row_id=29 zugeordnet ist. Will man jetzt wissen, welche Handynummer sich hinter der jid_row_id=29 verbirgt, muss man wieder zurück in die obige JID-Tabelle und dort unter der _ID=29 nachschauen. Dort ist dann die jeweilige Handynummer gelistet.

chat.jpg

Dieses Basis-Wissen reicht jetzt eigentlich schon aus, um verschiedene Chats miteinander verschmelzen zu lassen.

Wir nehmen nun also an, euer Kontakt hatte die alte Handynummer "12345", nun aber die Handynummer gewechselt und fortan ist seine neue Nummer "67890".

Wir suchen nun also in der Datenbank in der JID-Tabelle nach der alten Handynummer "12345" und finden diese meinetwegen verknüpft mit der jid_row_id=100.
In der Chat-Tabelle schauen wir nach, welche chat_row_id mit der jid_row_id=100 verknüpft ist und stellen dann fest, es ist die 55.

Also:
Alte Handynummer 12345
Chat_row_ID = 55
JID_row_ID = 100.

Nun schauen wir nach, was die neue Handynummer des selben Kontakts ist und stellen meinetwegen fest:
Neue Handynummer 67890
Chat_row_ID = 1050
JID_row_ID = 370

Jetzt haben wir alle Daten, die wir zum Verschmelzen benötigen. Wir wollen nun also erreichen, dass der alte Chat mit der nicht mehr benutzten alten Handynummer Teil des neuen Chats der neuen Handynummer wird. Dafür gaukeln wir WhatsApp vor, dass auch der alte Chat unter der alten Handynummer schon seit jeher von der neuen Handynummer "erzeugt" wurde, indem wir einfach die Chat-row-id und die JID-row-ID ersetzen.

Sprich:
der alte Chat mit der ursprünglichen chat_row_ID = 55 bekommt nun ebenfalls die Chat_row_ID = 1050 des neuen Chats und die JID_row_ID = 100 des alten Chats bekommt nun auch die JID_row_ID = 370 des neuen Chats. Der alte Chat wurde sozusagen fortan einfach von der "neuen" Handynummer erzeugt und gliedert sich somit nahtlos an den Beginn des neuen Chats an.

Dies ist mit Hilfe des folgenden SQL-basierten Bash-Scripts möglich, das die notwendigen Änderungen in der WA-Datenbank vornimmt (Der Pfad zur Datenbank, also hier im Code dir= [...], gibt an, dass meine Datenbank der Einfachheit halber auf der ersten Ebene des Handys liegt, also nirgendwo in irgendeinem Unterordner, sondern direkt auf der ersten Ebene, wo auch der DCIM, Music, Download-Order ist: /storage/emulated/0/msgstore.db):

Bash:
dir="/storage/emulated/0/msgstore.db"

#Alte Chat-row-ID löschen
sqlite3 "$dir" "delete from chat where _id in (55);"

#Alte JID-Row-ID löschen
sqlite3 "$dir" "delete from jid where _id in (100)"

#Änderungen auf sämtliche Tabellen anwenden
tbls=($(sqlite3 $dir ".tables"))

for tbl in "${tbls[@]}"; do
columns=($(sqlite3 "$dir" "select name from pragma_table_info('$tbl');"))
for column in "${columns[@]}"; do

if [[ "$column" == *"chat_row_id"* || "$column" == *"jid_row_id"* ]]; then

#Chat_Row_ID abändern
if [[ "$column" == *"chat_row_id"* ]]; then
sqlite3 "$dir" "update $tbl set $column=1050 where $column=55;"

#JID_Row_ID abändern
elif [[ "$column" == *"jid_row_id"* ]]; then
sqlite3 "$dir" "update $tbl set $column=370 where $column=100;"
fi
fi
done
done

Zur Ausführung dieses Bash-Scripts verwende ich die Handy-App "Termux". Das jeweilige Bash-Script samt der zu bearbeitenden Datenbank müssen beide also auf dem Handy abgelegt werden. Sicherlich wäre auch eine Bearbeitung am PC machbar; da Termux aber linux-basiert ist, wäre das unter Windows nicht ohne Weiteres so einfach möglich, deswegen habe ich in dem Fall Windows nur dafür verwendet, mithilfe des SQLite-Programms oben die Datenbanken zu öffnen und anzuschauen - die eigentliche Bearbeitung bzw. Ausführen des Scripts läuft dann aber mit Hilfe von Termux auf dem Handy.

Damit wurde der alte Chat unter der alten Handynummer nahtlos in den nun aktuellen Chat unter der neuen Handynummer eingefügt. Für WhatsApp sieht es fortan so aus, als wäre der alte Chat niemals unter der alten Handynummer erzeugt worden, sondern schon immer von der neuen, nun aktuellen Handynummer. Alle Medien (Bilder, Videos, Sprachnachrichten, etc.) des alten Chats sind daher unverändert übernommen in den neuen Chat.

Die nun modifizierte WhatsApp-Datenbank muss abschließend nun noch im System-Verzeichnis oben (root/data/data/com.whatsapp/databases/) mit der dortigen alten msgstore.db ersetzt bzw. überschrieben werden, danach kann man WhatsApp einfach normal öffnen und die Änderungen sind in der Chatliste sofort sichtbar. Dafür müssen vorher aber unbedingt noch die dort ebenfalls befindlichen 2 Cache-Dateien namens msgstore.db-shm & msgstore.db-wal gelöscht werden, die WhatsApp während des Betriebs und Zugriffs auf die System-Datenbank anlegt. Werden diese 2 nicht gelöscht, kommt es nach dem Ersetzen der alten System-Datenbank mit der Neuen beim Öffnen von WA direkt zum Absturz, da die Cache-Dateien noch auf die alte Datenbank referieren und nicht auf die nun modifizierte:

Screenshot_20240827-141426_File Manager +.jpg

Um das Ganze jetzt wieder auf euer aktuelles, nicht-gerootetes Handy zu bringen, erzeugt ihr einfach ein stinknormales, lokales Chat-Backup, kopiert dieses auf das neue Handy und lasst es dort von WhatsApp wiederherstellen. Et Voila.
 
Zuletzt bearbeitet:
Bearbeitet von: kruemelgirl - Grund: Beitrag bearbeitet. Gruß kruemelgirl
  • Danke
Reaktionen: qwoka, Wolfgang253 und jandroid
PS:
Anbei noch ein paar Screenshots, wie das Ganze dann in der Praxis aussieht:

Hier ein Screenshot eines neuen Chats. Erkennbar u.a. auch daran, dass seit April 2016 neue Chats mit einer WhatsApp-Systemnachricht bezüglich der Ende-zu-Ende-Verschlüsselung markiert werden - zusätzlich hat mich der Kontakt schriftlich darauf hingewiesen, dass dies nun seine neue Nummer sei:

Screenshot_20240828-105742.png

Und hier nun das Ergebnis nach dem Zusammenfügen mithilfe des obigen Scripts:
Hinweis:
Die WhatsApp-Systemnachricht wird durch das Script nicht automatisch entfernt. Wer diese (wie ich hier) für einen maximal nahtlosen Übergang entfernt haben möchte, kann diese in der Datenbank-Tabelle "system_message" für diesen bestimmten Chat entfernen mithilfe eines zusätzlichen einfachen SQL-Commands.

Screenshot_20240828-110159_WhatsApp.jpg

Man sieht also, dass sich der alte Chat nahtlos an den Chat mit der nun neuen Nummer anfügt, indem alle Nachrichten des alten Chats VOR den Beginn des eigentlichen neuen Chats angegliedert werden.

Der jeweilige Kontakt bekommt davon logischerweise nichts mit, auch ändert sich für ihn in seinem WhatsApp selbstverständlich nichts. Die Änderungen sind allein nur für eure eigene Datenbank sichtbar und werden auch nicht mit dem WhatsApp-Server oder anderen Kontakten synchronisiert. Auf ähnliche Weise werden auch die Chats der anderen Kontakte nicht gelöscht, nur weil ihr eure eigenen Chatverläufe löscht (es sei denn, man wählt beim Löschen "für alle Seiten" aus - diese Funktion gibt's aber ohnehin erst seit Kurzem).

-------------------------------------
Auf ähnliche Art und Weise wie oben kann man nun auch in die andere Richtung verfahren: angenommen, ihr selber hattet mal in der Vergangenheit eine andere Nummer und habt diese Chats der alten Nummer noch in einem alten WA-Account. Wer nun diese alten Chats rüberziehen möchte auf seine aktuelle Nummer, kann in ähnlicher Weise (nicht komplett identisch) vorgehen und statt die JID und Chat-row-ID seiner Kontakte, dieses Mal einfach seine eigene JID-row-ID so abändern, dass die Chats der alten Handynummer nun mit eurer neuen übereinstimmen. Das Bash-Script unterscheidet sich dabei aber etwas, da man ein wenig anders vorgehen muss (Eine genaue Anleitung hierfür kann ich bei Bedarf / Wunsch auch mal erstellen).

Zusammengefasst lässt sich aber nun also festhalten: es ist eigentlich so ziemlich alles möglich an Chat-Bearbeitung, sofern man weiß, wie, wo und womit man an der Datenbank ansetzen muss. Auch das Zusammenfügen von zeitlich verschiedenen Backups / Chatständen ist auf ähnliche Weise, aber mit Hilfe eines wesentlich komplexeren Bash-Scripts möglich.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: qwoka, Wolfgang253, Herman und eine weitere Person
Kreacher schrieb:
falls gewünscht, kann dieser Thread auch gerne angepinnt werden.
Ich habe deine Anleitung nun oben angepinnt. Mit den Anleitungen finde ich eine sehr gute Sache, da gerade bei WhatsApp immer wieder die gleichen Fragen aufkommen.
Bisher ist ja nur diese Anleitung vorhanden (die auch als solche deklariert ist). Wenn es mehr werden, müssen wir sehen, wie wir mit dem Anpinnen umgehen. 😉
 
  • Danke
Reaktionen: Kreacher
jandroid schrieb:
Mit den Anleitungen finde ich eine sehr gute Sache, da gerade bei WhatsApp immer wieder die gleichen Fragen aufkommen.

Wenn ich Zeit habe, schreibe ich gerne noch mehr. Beispielsweise gibt's auch für das (zumindest auf Reddit häufig) nachgefragte Problem bezüglich der nicht richtig downgeloadeten Medien in Chats, obwohl die Dateien im Medienordner sind, eine simple Lösung mithilfe eines ein-zeiligen SQL-Codes für die Datenbank. Dieses Problem hatte ich selber sehr lange, bis ich in der Datenbank dann zufällig auf die Lösung gestoßen bin:

1724838949125.png
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Wolfgang253 und jandroid

Ähnliche Themen

dommas135
Antworten
10
Aufrufe
356
Kreacher
Kreacher
M
Antworten
5
Aufrufe
227
jannux
jannux
Hangul
Antworten
9
Aufrufe
364
Hangul
Hangul
Zurück
Oben Unten