various bug fixes
This commit is contained in:
Executable
+70
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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):
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user