Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get all messages from Whatsapp

I'm trying to implement an app that will show in a textview all the messages received from Whatsapp. Is there any way to do it? Is it possible to extract all the messages from Whatsapp?

like image 311
user1141833 Avatar asked Jan 13 '12 20:01

user1141833


People also ask

How can I see all conversations on WhatsApp?

From the WhatsApp home screen, tap “Chats” at the top, then in the Chats screen listing all your conversations, swipe down from the top of the screen to reveal the hidden Search bar.


2 Answers

Whatsapp store all messages in an encrypted database (pyCrypt) which is very easy to decipher using Python.

You can fetch this database easily on Android, iPhone, Blackberry and dump it into html file. Here are complete instructions: Read, Extract WhatsApp Messages backup on Android, iPhone, Blackberry

Disclaimer: I researched and wrote this extensive guide.

like image 52
Taranfx Avatar answered Sep 17 '22 09:09

Taranfx


Working Android Code: (No root required)

Once you have access to the dbcrypt5 file , here is the android code to decrypt it:

private byte[] key = { (byte) 141, 75, 21, 92, (byte) 201, (byte) 255,         (byte) 129, (byte) 229, (byte) 203, (byte) 246, (byte) 250, 120,         25, 54, 106, 62, (byte) 198, 33, (byte) 166, 86, 65, 108,         (byte) 215, (byte) 147 };  private final byte[] iv = { 0x1E, 0x39, (byte) 0xF3, 0x69, (byte) 0xE9, 0xD,         (byte) 0xB3, 0x3A, (byte) 0xA7, 0x3B, 0x44, 0x2B, (byte) 0xBB,         (byte) 0xB6, (byte) 0xB0, (byte) 0xB9 };    long start = System.currentTimeMillis();      // create paths     backupPath = Environment.getExternalStorageDirectory()             .getAbsolutePath() + "/WhatsApp/Databases/msgstore.db.crypt5";     outputPath = Environment.getExternalStorageDirectory()             .getAbsolutePath() + "/WhatsApp/Databases/msgstore.db.decrypt";      File backup = new File(backupPath);      // check if file exists / is accessible     if (!backup.isFile()) {         Log.e(TAG, "Backup file not found! Path: " + backupPath);         return;     }      // acquire account name     AccountManager manager = AccountManager.get(this);     Account[] accounts = manager.getAccountsByType("com.google");      if (accounts.length == 0) {         Log.e(TAG, "Unable to fetch account!");         return;     }      String account = accounts[0].name;      try {         // calculate md5 hash over account name         MessageDigest message = MessageDigest.getInstance("MD5");         message.update(account.getBytes());         byte[] md5 = message.digest();          // generate key for decryption         for (int i = 0; i < 24; i++)             key[i] ^= md5[i & 0xF];          // read encrypted byte stream         byte[] data = new byte[(int) backup.length()];         DataInputStream reader = new DataInputStream(new FileInputStream(                 backup));         reader.readFully(data);         reader.close();          // create output writer         File output = new File(outputPath);         DataOutputStream writer = new DataOutputStream(                 new FileOutputStream(output));          // decrypt file         Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");         SecretKeySpec secret = new SecretKeySpec(key, "AES");         IvParameterSpec vector = new IvParameterSpec(iv);         cipher.init(Cipher.DECRYPT_MODE, secret, vector);         writer.write(cipher.update(data));         writer.write(cipher.doFinal());         writer.close();     } catch (NoSuchAlgorithmException e) {         Log.e(TAG, "Could not acquire hash algorithm!", e);         return;     } catch (IOException e) {         Log.e(TAG, "Error accessing file!", e);         return;     } catch (Exception e) {         Log.e(TAG, "Something went wrong during the encryption!", e);         return;     }      long end = System.currentTimeMillis();      Log.i(TAG, "Success! It took " + (end - start) + "ms"); 
like image 30
amalBit Avatar answered Sep 21 '22 09:09

amalBit