Parcourir la source

various bug fixes

ppwwyyxx il y a 11 ans
Parent
commit
9cb981749a
7 fichiers modifiés avec 100 ajouts et 15 suppressions
  1. 70 0
      android-interact.sh
  2. 6 4
      decrypt_db.sh
  3. 11 2
      lib/msg.py
  4. 3 3
      lib/parser.py
  5. 6 2
      lib/render.py
  6. 2 1
      lib/res.py
  7. 2 3
      plot_num_msg_by_time.py

+ 70 - 0
android-interact.sh

@@ -0,0 +1,70 @@
+#!/bin/bash -e
+# File: android-interact.sh
+# Date: Thu Dec 25 00:25:07 2014 +0800
+# Author: Yuxin Wu <[email protected]>
+
+# Please check that your path is the same, since this might be differnt on devices
+RES_DIR="/mnt/sdcard/tencent/MicroMsg"
+MM_DIR="/data/data/com.tencent.mm"
+
+echo "Starting rooted adb server..."
+adb root
+
+if [[ $1 == "uin" ]]; then
+	adb pull $MM_DIR/shared_prefs/system_config_prefs.xml 2>/dev/null
+	uin=$(grep 'default_uin' system_config_prefs.xml | grep -o 'value="[0-9]*' | cut -c 8-)
+	[[ -n $uin ]] || {
+		echo "Failed to get wechat uin. You can try other methods, or report a bug."
+		exit 1
+	}
+	rm system_config_prefs.xml
+	echo "Got wechat uin: $uin"
+elif [[ $1 == "imei" ]]; then
+	imei=$(adb shell dumpsys iphonesubinfo | grep 'Device ID' | grep -o '[0-9]*')
+	[[ -n $imei ]] || {
+		echo "Failed to get imei. You can try other methods, or report a bug."
+		exit 1
+	}
+	echo "Got imei: $imei"
+elif [[ $1 == "db" || $1 == "res" ]]; then
+	echo "Looking for user dir name..."
+	userList=$(adb ls $RES_DIR | cut -f 4 -d ' ' \
+		| awk '{if (length() == 32) print}')
+	numUser=$(echo $userList | wc -l)
+	# choose the first user.
+	chooseUser=$(echo $userList | head -n1)
+	[[ -n $chooseUser ]] || {
+		echo "Could not find user. Please check whether your resource dir is $RES_DIR"
+		exit 1
+	}
+	echo "Found $numUser user(s). User chosen: $chooseUser"
+
+	if [[ $1 == "res" ]]; then
+		echo "Pulling resources... this might take a long time..."
+		mkdir resource
+		cd resource
+		adb pull $RES_DIR/$chooseUser/image2
+		adb pull $RES_DIR/$chooseUser/voice2
+		adb pull $RES_DIR/$chooseUser/emoji
+		adb pull $RES_DIR/$chooseUser/avatar
+		[[ -d image2 && -d voice2 && -d emoji && -d avatar ]] && {
+			echo "Resource pulled."
+			echo "Total size: $(du -sh $chooseUser | cut -f1)"
+		} || {
+			echo "Failed to download resource directory: $RES_DIR/$chooseUser"
+			exit 1
+		}
+	else
+		echo "Pulling database file..."
+		adb pull $MM_DIR/MicroMsg/$chooseUser/EnMicroMsg.db
+		[[ -f EnMicroMsg.db ]] && \
+			echo "File successfully downloaded to EnMicroMsg.db" || {
+			echo "Failed to pull database from adb"
+			exit 1
+		}
+	fi
+else
+	echo "Usage: $0 <imei|uin|db|res>"
+	exit 1
+fi
+

+ 6 - 4
decrypt_db.sh

@@ -1,6 +1,6 @@
 #!/bin/bash -e
 # File: decrypt_db.sh
-# Date: Sun Nov 23 16:46:51 2014 +0800
+# Date: Thu Dec 25 00:30:10 2014 +0800
 # Author: Yuxin Wu <[email protected]>
 
 MMSGDB=$1
@@ -13,11 +13,13 @@ if [[ -z "$1" || -z "$2" || -z "$3" ]]; then
 fi
 
 KEY=$(echo -n "$imei$uin" | md5sum | cut -b 1-7)
+echo "KEY: $KEY"
 
-LD_LIBRARY_PATH=./lib ./lib/sqlcipher $MMSGDB << EOF
+export LD_LIBRARY_PATH=./lib
+./lib/sqlcipher $MMSGDB << EOF
 PRAGMA key='$KEY';
 PRAGMA cipher_use_hmac = off;
-ATTACH DATABASE "decoded_database.db" AS decoded_database KEY "";
+ATTACH DATABASE "decoded_database.db" AS decoded_db KEY "";
 SELECT sqlcipher_export("decoded_db");
-DETACH DATABASE decoded_database;
+DETACH DATABASE decoded_db;
 EOF

+ 11 - 2
lib/msg.py

@@ -1,11 +1,13 @@
 #!/usr/bin/env python2
 # -*- coding: UTF-8 -*-
 # File: msg.py
-# Date: Wed Dec 24 22:00:42 2014 +0800
+# Date: Thu Dec 25 09:56:24 2014 +0800
 # Author: Yuxin Wu <[email protected]>
 
+import re
 from datetime import datetime
 from pyquery import PyQuery
+
 from .utils import ensure_bin_str, ensure_unicode
 
 TYPE_MSG = 1
@@ -66,7 +68,14 @@ class WeChatMsg(object):
         elif self.type == TYPE_VIDEO:
             return "VIDEO FILE"
         elif self.type == TYPE_NAMECARD:
-            pq = PyQuery(self.content)
+            try:
+                pq = PyQuery(self.content)
+            except ValueError:
+                # pq doesn't support xml
+                pat = re.compile('<msg.*<\/msg>', re.DOTALL)
+                msg = pat.search(self.content).group()
+                pq = PyQuery(msg)
+
             msg = pq('msg').attr
             name = msg['nickname']
             if not name:

+ 3 - 3
lib/parser.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python2
 # -*- coding: UTF-8 -*-
 # File: parser.py
-# Date: Mon Dec 22 22:14:18 2014 +0800
+# Date: Thu Dec 25 00:34:35 2014 +0800
 # Author: Yuxin Wu <[email protected]>
 
 import sqlite3
@@ -32,7 +32,7 @@ class WeChatDBParser(object):
         self.msgs_by_talker = defaultdict(list)
         self.emojis = {}
         self.internal_emojis = {}
-        self.parse()
+        self._parse()
 
     def _parse_contact(self):
         contacts = self.cc.execute(
@@ -105,7 +105,7 @@ SELECT {} FROM message
             self.internal_emojis[md5] = name
 
 
-    def parse(self):
+    def _parse(self):
         self._parse_userinfo()
         self._parse_contact()
         self._parse_msg()

+ 6 - 2
lib/render.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python2
 # -*- coding: UTF-8 -*-
 # File: render.py
-# Date: Tue Dec 23 00:01:11 2014 +0800
+# Date: Thu Dec 25 10:01:58 2014 +0800
 # Author: Yuxin Wu <[email protected]>
 
 import os
@@ -92,8 +92,12 @@ class HTMLRender(object):
         elif msg.type == TYPE_IMG:
             # imgPath was original THUMBNAIL_DIRPATH://th_xxxxxxxxx
             imgpath = msg.imgPath.split('_')[-1]
+            if not imgpath:
+                logger.warn('No imgpath in an image message. Perhaps a bug in wechat.')
+                return fallback()
             bigimgpath = self.parser.imginfo.get(msg.msgSvrId)
-            fnames = [k for k in [imgpath, bigimgpath] if k is not None]
+            fnames = [k for k in [imgpath, bigimgpath] if k]
+            assert len(fnames) > 0, msg.msg_str()
             bigimg, smallimg = self.res.get_img(fnames)
             if not smallimg:
                 logger.warn("No image thumbnail found for {}".format(imgpath))

+ 2 - 1
lib/res.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python2
 # -*- coding: UTF-8 -*-
 # File: res.py
-# Date: Mon Dec 22 16:52:56 2014 +0800
+# Date: Thu Dec 25 10:04:29 2014 +0800
 # Author: Yuxin Wu <[email protected]>
 
 import glob
@@ -127,6 +127,7 @@ class Resource(object):
 
     def get_img(self, fnames):
         """ return two base64 jpg string"""
+        fnames = [k for k in fnames if k]   # filter out empty string
         big_file, small_file = self._get_img_file(fnames)
 
         def get_jpg_b64(img_file):

+ 2 - 3
plot_num_msg_by_time.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python2
 # -*- coding: UTF-8 -*-
 # File: plot_num_msg_by_time.py
-# Date: Sat Nov 22 22:32:50 2014 +0800
+# Date: Thu Dec 25 00:35:57 2014 +0800
 # Author: Yuxin Wu <[email protected]>
 
 from lib.parser import WeChatDBParser
@@ -17,10 +17,9 @@ if len(sys.argv) != 3:
 
 db_file = sys.argv[1]
 name = ensure_unicode(sys.argv[2])
-every_k_days = 2
+every_k_days = 3
 
 parser = WeChatDBParser(db_file)
-parser.parse()
 msgs = parser.msgs_by_talker[name]
 times = [x.createTime for x in msgs]
 start_time = times[0]