update script with argparse
This commit is contained in:
+35
-24
@@ -5,37 +5,48 @@
|
|||||||
# Author: Yuxin Wu <[email protected]>
|
# Author: Yuxin Wu <[email protected]>
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
if len(sys.argv) != 6:
|
import argparse
|
||||||
sys.exit("Usage: {0} <path to decoded_database.db> <path to avatar.index> <path to resource> <name> <output html>".format(sys.argv[0]))
|
|
||||||
|
|
||||||
from common.textutil import ensure_unicode
|
from common.textutil import ensure_unicode
|
||||||
from wechat.parser import WeChatDBParser
|
from wechat.parser import WeChatDBParser
|
||||||
from wechat.res import Resource
|
from wechat.res import Resource
|
||||||
from wechat.render import HTMLRender
|
from wechat.render import HTMLRender
|
||||||
|
|
||||||
db_file = sys.argv[1]
|
def get_args():
|
||||||
avt_db = sys.argv[2]
|
parser = argparse.ArgumentParser()
|
||||||
resource_dir = sys.argv[3]
|
parser.add_argument('name', help='name of contact')
|
||||||
name = ensure_unicode(sys.argv[4])
|
parser.add_argument('--output', help='output html file', default='output.html')
|
||||||
output_file = sys.argv[5]
|
parser.add_argument('--db', default='decoded.db', help='path to decoded 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)
|
if __name__ == '__main__':
|
||||||
res = Resource(resource_dir, avt_db)
|
args = get_args()
|
||||||
|
|
||||||
try:
|
name = ensure_unicode(args.name)
|
||||||
msgs = parser.msgs_by_chat[name]
|
output_file = args.output
|
||||||
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)
|
|
||||||
|
|
||||||
render = HTMLRender(parser, res)
|
parser = WeChatDBParser(args.db)
|
||||||
htmls = render.render_msgs(msgs)
|
res = Resource(args.res, args.avt)
|
||||||
|
|
||||||
if len(htmls) == 1:
|
if name and name in parser.msgs_by_chat:
|
||||||
with open(output_file, 'w') as f:
|
msgs = parser.msgs_by_chat[name]
|
||||||
print >> f, htmls[0].encode('utf-8')
|
else:
|
||||||
else:
|
sys.stderr.write(u"Valid Contacts: {}\n".format(u'\n'.join(parser.msgs_by_chat.keys())))
|
||||||
for idx, html in enumerate(htmls):
|
sys.stderr.write(u"Couldn't find that contact {}.".format(name));
|
||||||
with open(output_file + '.{}'.format(idx), 'w') as f:
|
sys.exit(1)
|
||||||
print >> f, html.encode('utf-8')
|
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
@@ -5,10 +5,13 @@
|
|||||||
|
|
||||||
from wechat.parser import WeChatDBParser
|
from wechat.parser import WeChatDBParser
|
||||||
import sys
|
import sys
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
print "Usage: {} db_file".format(sys.argv[0])
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
db_file = sys.argv[1]
|
db_file = sys.argv[1]
|
||||||
|
|
||||||
parser = WeChatDBParser(db_file)
|
parser = WeChatDBParser(db_file)
|
||||||
chats = parser.msgs_by_chat.keys()
|
chats = parser.msgs_by_chat.keys()
|
||||||
for k in chats:
|
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
@@ -30,10 +30,10 @@ class AvatarReader(object):
|
|||||||
try:
|
try:
|
||||||
try:
|
try:
|
||||||
pos, size = self.query_index(filename)
|
pos, size = self.query_index(filename)
|
||||||
|
return self.read_img(pos, size)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
logger.warn("Avatar for {} not found in avatar database.".format(username))
|
logger.warn("Avatar for {} not found in avatar database.".format(username))
|
||||||
return None
|
return None
|
||||||
return self.read_img(pos, size)
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise
|
raise
|
||||||
print e
|
print e
|
||||||
@@ -47,11 +47,15 @@ class AvatarReader(object):
|
|||||||
'avatar.block.' + '{:05d}'.format(file_idx))
|
'avatar.block.' + '{:05d}'.format(file_idx))
|
||||||
# a 64-byte offset of each block file
|
# a 64-byte offset of each block file
|
||||||
start_pos = pos - file_idx * (2**32) + 64
|
start_pos = pos - file_idx * (2**32) + 64
|
||||||
with open(fname, 'rb') as f:
|
try:
|
||||||
f.seek(start_pos)
|
with open(fname, 'rb') as f:
|
||||||
data = f.read(size)
|
f.seek(start_pos)
|
||||||
im = Image.open(cStringIO.StringIO(data))
|
data = f.read(size)
|
||||||
return im
|
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):
|
def query_index(self, filename):
|
||||||
conn = sqlite3.connect(self.avt_db)
|
conn = sqlite3.connect(self.avt_db)
|
||||||
|
|||||||
Reference in New Issue
Block a user