update script with argparse

This commit is contained in:
Yuxin Wu
2016-04-21 18:13:06 -04:00
parent 18ee4f78fe
commit 2bd26b6138
4 changed files with 50 additions and 33 deletions
+1 -2
View File
@@ -22,7 +22,7 @@ If it doesn't work, please leave an issue together with your phone/OS/wechat ver
+ [pysox](https://pypi.python.org/pypi/pysox/0.3.6.alpha)
+ [pysqlcipher](https://pypi.python.org/pypi/pysqlcipher)
+ numpy
+ python-csscompressor (suggested, optional)
+ csscompressor (suggested, optional)
+ adb and rooted android phone connected to a Linux/Mac OS.
+ Silk audio decoder (included; just run `./third-party/compile_silk.sh`)
+ gnu-sed
@@ -52,7 +52,6 @@ Note that commands involving `./android-interact.sh` are meant to be run on the
./decrypt-db.py <path to EnMicroMsg.db> <imei> <uin>
```
NOTE: you may need to try different ways to getting imei & uin,
because things behave differently on different phones.
+35 -24
View File
@@ -5,37 +5,48 @@
# Author: Yuxin Wu <[email protected]>
import sys
if len(sys.argv) != 6:
sys.exit("Usage: {0} <path to decrypted_database.db> <path to avatar.index> <path to resource> <name> <output html>".format(sys.argv[0]))
import argparse
from common.textutil import ensure_unicode
from wechat.parser import WeChatDBParser
from wechat.res import Resource
from wechat.render import HTMLRender
db_file = sys.argv[1]
avt_db = sys.argv[2]
resource_dir = sys.argv[3]
name = ensure_unicode(sys.argv[4])
output_file = sys.argv[5]
def get_args():
parser = argparse.ArgumentParser()
parser.add_argument('name', help='name of contact')
parser.add_argument('--output', help='output html file', default='output.html')
parser.add_argument('--db', default='decrypted.db', help='path to decrypted database')
parser.add_argument('--avt', default='avatar.index', help='path to avatar.index file')
parser.add_argument('--res', default='resource', help='reseource directory')
args = parser.parse_args()
return args
parser = WeChatDBParser(db_file)
res = Resource(resource_dir, avt_db)
if __name__ == '__main__':
args = get_args()
try:
msgs = parser.msgs_by_chat[name]
except:
sys.stderr.write(u"Valid Contacts: {}\n".format(u'\n'.join(parser.msgs_by_chat.keys())))
sys.stderr.write(u"Couldn't find that contact {}.".format(name));
sys.exit(1)
name = ensure_unicode(args.name)
output_file = args.output
render = HTMLRender(parser, res)
htmls = render.render_msgs(msgs)
parser = WeChatDBParser(args.db)
res = Resource(args.res, args.avt)
if len(htmls) == 1:
with open(output_file, 'w') as f:
print >> f, htmls[0].encode('utf-8')
else:
for idx, html in enumerate(htmls):
with open(output_file + '.{}'.format(idx), 'w') as f:
print >> f, html.encode('utf-8')
if name and name in parser.msgs_by_chat:
msgs = parser.msgs_by_chat[name]
else:
sys.stderr.write(u"Valid Contacts: {}\n".format(u'\n'.join(parser.msgs_by_chat.keys())))
sys.stderr.write(u"Couldn't find that contact {}.".format(name));
sys.exit(1)
print "Number of Messages: ", len(msgs)
assert len(msgs) > 0
render = HTMLRender(parser, res)
htmls = render.render_msgs(msgs)
if len(htmls) == 1:
with open(output_file, 'w') as f:
print >> f, htmls[0].encode('utf-8')
else:
for idx, html in enumerate(htmls):
with open(output_file + '.{}'.format(idx), 'w') as f:
print >> f, html.encode('utf-8')
+4 -1
View File
@@ -5,10 +5,13 @@
from wechat.parser import WeChatDBParser
import sys
if len(sys.argv) != 2:
print "Usage: {} db_file".format(sys.argv[0])
sys.exit(1)
db_file = sys.argv[1]
parser = WeChatDBParser(db_file)
chats = parser.msgs_by_chat.keys()
for k in chats:
print k.encode('utf-8'), parser.contacts_rev[k].encode('utf-8')
print k.encode('utf-8'), '\t', parser.contacts_rev[k].encode('utf-8')
+10 -6
View File
@@ -30,10 +30,10 @@ class AvatarReader(object):
try:
try:
pos, size = self.query_index(filename)
return self.read_img(pos, size)
except TypeError:
logger.warn("Avatar for {} not found in avatar database.".format(username))
return None
return self.read_img(pos, size)
except Exception as e:
raise
print e
@@ -47,11 +47,15 @@ class AvatarReader(object):
'avatar.block.' + '{:05d}'.format(file_idx))
# a 64-byte offset of each block file
start_pos = pos - file_idx * (2**32) + 64
with open(fname, 'rb') as f:
f.seek(start_pos)
data = f.read(size)
im = Image.open(cStringIO.StringIO(data))
return im
try:
with open(fname, 'rb') as f:
f.seek(start_pos)
data = f.read(size)
im = Image.open(cStringIO.StringIO(data))
return im
except IOError as e:
logger.warn("Cannot read avatar from {}: {}".format(fname, str(e)))
return None
def query_index(self, filename):
conn = sqlite3.connect(self.avt_db)