def generate_product_bcp(self): conn = unity_c37r.create_connection(self.cache_db) cmds = sql.SQLiteCommand(conn) cmds.CommandText = ''' select * from tb_product ''' reader = cmds.ExecuteReader() while reader.Read(): pdt = ProductInfo() pdt.set_value_with_idx(pdt.app_code, self.app_code) pdt.set_value_with_idx(pdt.colltection_target_id, self.colltection_target_id) pdt.set_value_with_idx(pdt.account_id, unity_c37r.c_sharp_get_string(reader, 0)) tp = unity_c37r.c_sharp_get_string(reader, 1) pdt.set_value_with_idx(pdt.source, '0%s' %tp) pdt.set_value_with_idx(pdt.product_id, unity_c37r.c_sharp_get_string(reader, 2)) pdt.set_value_with_idx(pdt.product_name, unity_c37r.c_sharp_get_string(reader, 3)) pdt.set_value_with_idx(pdt.price, unity_c37r.c_sharp_get_string(reader, 4)) t = unity_c37r.c_sharp_get_long(reader, 5) if t is not 0: pdt.set_value_with_idx(pdt.create_time, t) pdt.set_value_with_idx(pdt.description, unity_c37r.c_sharp_get_string(reader, 6)) pdt.set_value_with_idx(pdt.url, unity_c37r.c_sharp_get_string(reader, 7)) pdt.set_value_with_idx(pdt.shop_id, unity_c37r.c_sharp_get_string(reader, 8)) pdt.set_value_with_idx(pdt.delete_status, unity_c37r.c_sharp_get_long(reader, 9)) unity_c37r.execute_query(self.cmd, TBL_BCP_INSERT_PRODUCT, pdt.get_values()) reader.Close() cmds.Dispose() conn.Close()
def __generate_file_transfer_model(self): self.cmd.CommandText = ''' select * from tb_transfer ''' reader = self.cmd.ExecuteReader() ft = NDFileTransfer() models = [] while reader.Read(): fts = Cloud.FileTransfer() self.set_model_value( fts.OwnerUserID, unity_c37r.c_sharp_get_string(reader, ft.account)) self.set_model_value( fts.FileName, unity_c37r.c_sharp_get_string(reader, ft.file_name)) self.set_model_value( fts.FileSize, unity_c37r.c_sharp_get_long(reader, ft.file_size)) self.set_model_value( fts.HashCode, unity_c37r.c_sharp_get_string(reader, ft.hash_code)) # self.set_model_value(fts.Url, unity_c37r.c_sharp_get_string(reader, ft.url)) uri = unity_c37r.c_sharp_get_string(reader, ft.url) uri = unity_c37r.get_c_sharp_uri(uri) self.set_model_value(fts.Url, uri) self.set_model_value( fts.LocalPath, unity_c37r.c_sharp_get_string(reader, ft.local_path)) self.set_model_value( fts.TorrentName, unity_c37r.c_sharp_get_string(reader, ft.torrent_name)) st = unity_c37r.c_sharp_get_long(reader, ft.status) if st == NDFileProcessing: self.set_model_value(fts.Status, Cloud.FileTransferStatus.UnFinished) elif st == NDFileDone: self.set_model_value(fts.Status, Cloud.FileTransferStatus.Finish) else: self.set_model_value(fts.Status, Cloud.FileTransferStatus.None) isd = unity_c37r.c_sharp_get_long(reader, ft.is_download) if isd == 1: self.set_model_value(fts.IsDownload, True) else: self.set_model_value(fts.IsDownload, False) self.set_model_value( fts.BeginTime, unity_c37r.get_c_sharp_ts( unity_c37r.c_sharp_try_get_time(reader, ft.begin_time))) self.set_model_value( fts.EndTime, unity_c37r.get_c_sharp_ts( unity_c37r.c_sharp_try_get_time(reader, ft.end_time))) self.set_model_value( fts.CachedSize, unity_c37r.c_sharp_get_long(reader, ft.cached_size)) models.append(fts) reader.Close() return models
def generate_bcp_account(self): conn = unity_c37r.create_connection(self.cache_db + '.IM') cmds = sql.SQLiteCommand(conn) cmds.CommandText = ''' select * from account ''' reader = cmds.ExecuteReader() while reader.Read(): a = AccountInfo() #a.colltection_target_id = self.colltection_target_id a.set_value_with_idx(a.colltection_target_id, self.colltection_target_id) a.set_value_with_idx(a.app_code, self.app_code) a.set_value_with_idx(a.account_id, unity_c37r.c_sharp_get_string(reader, 0)) a.set_value_with_idx(a.nick, unity_c37r.c_sharp_get_string(reader, 1)) a.set_value_with_idx(a.account, unity_c37r.c_sharp_get_string(reader, 2)) a.set_value_with_idx(a.password, unity_c37r.c_sharp_get_string(reader, 3)) pic = unity_c37r.c_sharp_get_string(reader, 4) pic = os.path.join(self.mnt, pic) if os.path.exists(pic): #a.set_value_with_idx(os.path.join(self.app_code, )) ppath,pname = os.path.split(pic) a.set_value_with_idx(a.photo, self.app_code + '/' + pname) pass # copy file... a.set_value_with_idx(a.telephone, unity_c37r.c_sharp_get_string(reader, 5)) gender = unity_c37r.c_sharp_get_long(reader, 6) rg = '0' if gender == 0: rg = '0' elif gender == 1: rg = '1' elif gender == 2: rg = '2' elif gender == 9: rg = '9' a.set_value_with_idx(a.sex_code, rg) a.set_value_with_idx(a.age, unity_c37r.c_sharp_get_long(reader, 7)) #a.set_value_with_idx(a.country_code, unity_c37r.c_sharp_get_string(reader, 8)) # NOT SUPPORT RIGHT NOW!!!! a.set_value_with_idx(a.city, unity_c37r.c_sharp_get_string(reader, 9)) #a.set_value_with_idx(a.signature, unity_c37r.c_sharp_get_string(reader, )) a.set_value_with_idx(a.address, unity_c37r.c_sharp_get_string(reader, 12)) a.set_value_with_idx(a.birth, unity_c37r.c_sharp_get_string(reader, 13)) a.set_value_with_idx(a.signature, unity_c37r.c_sharp_get_string(reader, 14)) d = unity_c37r.c_sharp_get_string(reader, 15) a.set_value_with_idx(a.signature, d) # not support delete time unity_c37r.execute_query(self.cmd, TBL_BCP_INSERT_ACCOUNT, a.get_values()) self.db_commit() reader.Close() cmds.Dispose() conn.Close()
def db_check(self, app_v): if not os.path.exists(self.cache) or not os.path.exists(self.cache + '.im'): self.need_parse = True return conns = unity_c37r.create_connection(self.cache) cmd = sql.SQLiteCommand(conns) try: eb_checked = False eb_app_checked = False cmd.CommandText = ''' select version_value from tb_version where version_key = '{}' '''.format(EB_VERSION_KEY) reader = None reader = cmd.ExecuteReader() if reader.Read(): res = unity_c37r.c_sharp_get_long(reader, 0) if res == EB_VERSION_VALUE: eb_checked = True cmd.Dispose() cmd.CommandText = ''' select version_value from tb_version where version_key = '{}' '''.format(EB_APP_VERSION_KEY) reader = cmd.ExecuteReader() if reader.Read(): res = unity_c37r.c_sharp_get_long(reader, 0) if res == app_v: eb_app_checked = True cmd.Dispose() reader.Close() conns.Close() conns = None reader = None if not ( eb_checked and eb_app_checked): self.need_parse = True n_parse = self.im.need_parse(self.cache + '.im', EB_VERSION_VALUE) if n_parse: self.need_parse = True return self.need_parse = False except Exception as e: traceback.print_exc() if reader is not None: reader.Close() if conns is not None: cmd.Dispose() conns.Close() self.log.m_err('check db failed, please try again!') self.log.m_err(e.message) self.need_parse = True return
def parse_search(self, ac): db_node = self.node.GetByPath('Library/edge_compute.db') if db_node is None: return path = unity_c37r.check_sqlite_maturity(db_node, self.cache) conn = unity_c37r.create_connection(path) cmd = sql.SQLiteCommand(conn) cmd.CommandText = ''' select args,create_time from usertrack where owner_id = {} and page_name = 'Page_SearchItemList' '''.format(ac.uid) reader = cmd.ExecuteReader() while reader.Read(): if canceller.IsCancellationRequested: cmd.Dispose() conn.Close() self.im.db_close() raise IOError('E') s = model_im.Search() s.account_id = ac.uid m_str = unity_c37r.c_sharp_get_string(reader, 0) try: #s.key = re.search('keyword=(.*?),', m_str, re.I | re.M).group(1) match = re.search('keyword=(.*?),', m_str, re.I | re.M) if match is None: continue s.key = match.group(1) except: self.log.m_err('error string:{}'.format(m_str)) continue s.create_time = unity_c37r.c_sharp_get_long(reader, 1) / 1000 self.im.db_insert_table_search(s) self.im.db_commit() cmd.Dispose() conn.Close()
def parse_sys_ver_1141(self): #if the sys ime does not contain zh.db if self.version & 0x1 == 0: return sql_node = self.node.GetByPath('DynamicPhraseLexicon_zh_Hans.db') db = unity_c37r.create_connection_tentatively(sql_node, True) cmd = sql.SQLiteCommand(db) cmd.CommandText = ''' select Reading, Surface, Seed from Words ''' reader = cmd.ExecuteReader() while reader.Read(): pharse = unity_c37r.c_sharp_get_blob(reader, 0) pharse = pharse.decode('utf_16_le', 'ignore') # => TODO:add pharse to sqlite bts = unity_c37r.c_sharp_get_blob(reader, 1) idx = 0 words = '' while idx < len(bts): m_string = r'\u%02x%02x' % (bts[idx + 1], bts[idx] ) # => note little ending try: m_string = m_string.decode('unicode_escape') except: idx += 2 continue words += m_string idx += 2 kw = IMEKeyword() kw.set_value_with_idx(kw.key_word, words) times = unity_c37r.c_sharp_get_long(reader, 2) kw.set_value_with_idx(kw.times, times) self.ime.db_insert_key(kw) self.ime.db_commit()
def get_models(self): models = list() conn = unity_c37r.create_connection(self.cache_db, True) cmd = sql.SQLiteCommand(conn) cmd.CommandText = ''' select * from WA_MFORENSICS_120100 ''' reader = cmd.ExecuteReader() a = IMEAccount() while reader.Read(): am = Common.User() am.ID.Value = unity_c37r.c_sharp_get_string(reader, a.account) am.Name.Value = unity_c37r.c_sharp_get_string(reader, a.nick) photo = unity_c37r.c_sharp_get_string(reader, a.photo) photo = unity_c37r.get_c_sharp_uri(photo) am.PhotoUris.Add(photo) # reserved gender sex = unity_c37r.c_sharp_get_string(reader, a.gender_code) models.append(am) reader.Close() cmd.CommandText = ''' select * from WA_MFORENSICS_120200 ''' reader = cmd.ExecuteReader() b = IMEKeyword() while reader.Read(): kw = InputMethod.WordFrequency() kw.KeyWord.Value = unity_c37r.c_sharp_get_string( reader, b.key_word) kw.Count.Value = unity_c37r.c_sharp_get_long(reader, b.times) models.append(kw) reader.Close() cmd.Dispose() conn.Close() return models
def before_check(bcp_path, bcp_db): r_bcp_db = os.path.join(bcp_path, bcp_db) if not os.path.exists(r_bcp_db): return True try: conn = unity_c37r.create_connection(r_bcp_db) cmd = sql.SQLiteCommand(conn) cmd.CommandText = ''' select * from tb_version where vkey = '{}' '''.format(EB_VERSION_KEY) reader = cmd.ExecuteReader() if reader.Read(): value = unity_c37r.c_sharp_get_long(reader, 0) reader.Close() cmd.Dispose() conn.Close() if value != EB_VERSION_VALUE: return True else: return False else: reader.Close() cmd.Dispose() conn.Close() return True except: traceback.print_exc() reader.Close() cmd.Dispose() conn.Close() return False
def generate_deal_bcp(self): conn = unity_c37r.create_connection(self.cache_db + '.IM') cmds = sql.SQLiteCommand(conn) cmds.CommandText = ''' select * from deal ''' reader = cmds.ExecuteReader() res = dict() while reader.Read(): deal = DealInfo() deal.set_value_with_idx(deal.colltection_target_id, self.colltection_target_id) deal.set_value_with_idx(deal.app_code, self.app_code) deal.set_value_with_idx(deal.deal_id, unity_c37r.c_sharp_get_string(reader, 0)) try: deal.set_value_with_idx(deal.money, unity_c37r.c_sharp_get_real(reader, 2)) except: deal.set_value_with_idx(deal.money, 0) deal.set_value_with_idx(deal.description, unity_c37r.c_sharp_get_string(reader, 3)) t = unity_c37r.c_sharp_get_long(reader, 6) if t != 0: deal.set_value_with_idx(deal.time, t) pass unity_c37r.execute_query(self.cmd, TBL_BCP_INSERT_DEAL, deal.get_values()) # status... not supported right now # type ... not suppoted right now reader.Close() cmds.Dispose() conn.Close()
def __generate_account(self): connection = unity_c37r.create_connection(self.cache_db + ".IM", True) command = sql.SQLiteCommand(connection) command.CommandText = ''' select * from account ''' reader = command.ExecuteReader() while reader.Read(): a = NDBCPACCOUNT() a.set_value_with_idx(a.account_id, unity_c37r.c_sharp_get_string(reader, 0)) a.set_value_with_idx(a.account, a.get_value_with_idx(a.account_id)) a.set_value_with_idx(a.nick, unity_c37r.c_sharp_get_string(reader, 1)) a.set_value_with_idx(a.password, unity_c37r.c_sharp_get_string(reader, 3)) photo = unity_c37r.c_sharp_get_string(reader, 4) photo = os.path.join(self.mnt, photo) if os.path.exists(photo): pass # ===>copy file fix that else: a.set_value_with_idx(a.photo, photo) a.set_value_with_idx(a.telephone, unity_c37r.c_sharp_get_string(reader, 5)) a.set_value_with_idx(a.email, unity_c37r.c_sharp_get_string(reader, 6)) gender = unity_c37r.c_sharp_get_long(reader, 7) gender = '0%d' % gender a.set_value_with_idx(a.gender, gender) a.set_value_with_idx(a.age, unity_c37r.c_sharp_get_long(reader, 8)) a.set_value_with_idx(a.city, unity_c37r.c_sharp_get_string(reader, 11)) a.set_value_with_idx(a.address, unity_c37r.c_sharp_get_string(reader, 12)) a.set_value_with_idx(a.birthday, unity_c37r.c_sharp_get_string(reader, 13)) a.set_value_with_idx(a.signature, unity_c37r.c_sharp_get_string(reader, 14)) a.set_value_with_idx(a.delete_status, unity_c37r.c_sharp_get_string(reader, 15)) a.set_value_with_idx(a.collect_id, self.cid) a.set_value_with_idx(a.app_type, self.app_type) self.db_insert_account(a) self.db_commit() reader.Close() command.Dispose() connection.Close()
def __get_product_models(self): self.ccmd.CommandText = ''' select * from tb_product ''' models = [] reader = self.ccmd.ExecuteReader() while reader.Read(): p = EC.Product() if unity_c37r.c_sharp_get_string(reader, 0) is not '': p.OwnerUserID.Value = unity_c37r.c_sharp_get_string(reader, 0) if unity_c37r.c_sharp_get_string(reader, 1) is not "": tp = unity_c37r.c_sharp_get_string(reader, 1) if tp == EB_PRODUCT_UNKWON: p.From.Value = u'未知来源' elif tp == EB_PRODCUT_BUIED: p.From.Value = u'已购买的商品' elif tp == EB_PRODUCT_BROWSE: p.From.Value = u'浏览或系统推荐的商品' elif tp == EB_PRODUCT_FAVORITE: p.From.Value = u'收藏夹' elif tp == EB_PRODUCT_SHOPCART: p.From.Value = u'购物车' elif tp == EB_PRODUCT_OTHER: p.From.Value = u'未知来源' if unity_c37r.c_sharp_get_string(reader, 2) is not '': p.ProductId.Value = unity_c37r.c_sharp_get_string(reader, 2) if unity_c37r.c_sharp_get_string(reader, 3): p.ProductName.Value = unity_c37r.c_sharp_get_string(reader, 3) if unity_c37r.c_sharp_get_string(reader, 4) is not "": p.Price.Value = str(unity_c37r.c_sharp_get_string(reader, 4)) else: p.Price.Value = u"价格未知" if unity_c37r.c_sharp_get_long(reader, 5) is not 0: p.Timestamp.Value = unity_c37r.get_c_sharp_ts(unity_c37r.c_sharp_get_long(reader, 5)) if unity_c37r.c_sharp_get_string(reader, 6): p.Description.Value = unity_c37r.c_sharp_get_string(reader, 6) if unity_c37r.c_sharp_get_string(reader, 7): p.Url.Value = unity_c37r.get_c_sharp_uri(unity_c37r.c_sharp_get_string(reader, 7)) if unity_c37r.c_sharp_get_string(reader, 8): p.ShopId.Value = unity_c37r.c_sharp_get_string(reader, 8) models.append(p) reader.Close() #self.ccmd.Dispose() return models
def __generate_file_basic_model(self): self.cmd.CommandText = ''' select * from tbl_filelist ''' reader = self.cmd.ExecuteReader() f = NDFileList() models = [] while reader.Read(): fb = Cloud.FileBasic() fb.OwnerUserID.Value = unity_c37r.c_sharp_get_string( reader, f.account) fb.FileName.Value = unity_c37r.c_sharp_get_string( reader, f.file_name) fb.FileSize.Value = unity_c37r.c_sharp_get_long( reader, f.file_size) fb.HashCode.Value = unity_c37r.c_sharp_get_string( reader, f.file_hash) self.set_model_value( fb.FileSize, unity_c37r.c_sharp_get_long(reader, f.file_size)) # self.set_model_value(fb.Url, unity_c37r.c_sharp_get_string(reader, f.url)) m_str = unity_c37r.c_sharp_get_string(reader, f.url) self.set_model_value(fb.Url, unity_c37r.get_c_sharp_uri(m_str)) self.set_model_value( fb.ServerPath, unity_c37r.c_sharp_get_string(reader, f.server_path)) tp = unity_c37r.c_sharp_get_long(reader, f.file_type) if tp == 0: self.set_model_value(fb.Type, Cloud.FileBasicType.None) elif tp == 1: self.set_model_value(fb.Type, Cloud.FileBasicType.Txt) elif tp == 2: self.set_model_value(fb.Type, Cloud.FileBasicType.Image) elif tp == 3: self.set_model_value(fb.Type, Cloud.FileBasicType.Audio) elif tp == 4: self.set_model_value(fb.Type, Cloud.FileBasicType.Video) elif tp == 5: self.set_model_value(fb.Type, Cloud.FileBasicType.Document) else: self.set_model_value(fb.Type, Cloud.FileBasicType.Other) models.append(fb) reader.Close() return models
def __get_trading_models(self): self.__prepare_contact() self.ccmd.CommandText = ''' select * from tb_deal ''' reader = self.ccmd.ExecuteReader() models = [] while reader.Read(): t = EC.Trading() if unity_c37r.c_sharp_get_string(reader, 0) is not '': t.OwnerUserID.Value = unity_c37r.c_sharp_get_string(reader, 0) if unity_c37r.c_sharp_get_string(reader, 1) is not '': uid = unity_c37r.c_sharp_get_string(reader, 1) usr = Common.UserIntro() usr.ID.Value = uid if not self.contact.__contains__(uid): usr.Name.Value = u'未知联系人' else: usr.Name.Value = self.contact[uid].nick usr.Photo.Value = unity_c37r.get_c_sharp_uri(self.contact[uid].photo) t.Party.Value = usr if unity_c37r.c_sharp_get_long(reader, 2) is not None: tp = unity_c37r.c_sharp_get_long(reader, 2) if tp == EBDEAL_TYPE_REC: t.Type.Value = EC.TradingType.Conllection elif tp == EBDEAL_TYPE_SEND: t.Type.Value = EC.TradingType.Payment elif tp == EBDEAL_TYPE_OTHER: t.Type.Value = EC.TradingType.None if unity_c37r.c_sharp_get_real(reader, 3) is not 0.0: t.Money.Value = str(unity_c37r.c_sharp_get_real(reader, 3)) if unity_c37r.c_sharp_get_long(reader, 4) is not None: tp = unity_c37r.c_sharp_get_long(reader, 4) if tp == TRADE_STATUS_CLOSE: t.Status.Value = EC.TradingStatus.Close elif tp == TRADE_STATUS_FINISHED: t.Status.Value = EC.TradingStatus.Finish elif tp == TRADE_STATUS_PROCESSING: t.Status.Value = EC.TradingStatus.Unfinish elif tp == TRADE_STATUS_UNKWON: t.Status.Value = EC.TradingStatus.None if unity_c37r.c_sharp_get_long(reader, 5) is not 0: t.StartTime.Value = unity_c37r.get_c_sharp_ts(unity_c37r.c_sharp_get_long(reader, 5)) if unity_c37r.c_sharp_get_long(reader, 6) is not 0: t.EndTime.Value = unity_c37r.get_c_sharp_ts(unity_c37r.c_sharp_get_long(reader, 6)) if unity_c37r.c_sharp_get_string(reader, 8) is not '': t.Description.Value = unity_c37r.c_sharp_get_string(reader, 8) if unity_c37r.c_sharp_get_string(reader, 9): t.Content.Value = unity_c37r.c_sharp_get_string(reader, 9) models.append(t) reader.Close() #self.ccmd.Dispose() return models
def __get_log_models(self): self.ccmd.CommandText = ''' select * from tb_log ''' reader = self.ccmd.ExecuteReader() models = [] while reader.Read(): log = EC.ECLog() log.ID.Value = random.randint(0, 0xfffffff) if unity_c37r.c_sharp_get_string(reader, 1) is not '': log.Description.Value = unity_c37r.c_sharp_get_string(reader, 1) if unity_c37r.c_sharp_get_string(reader, 2) is not '': log.Content.Value = unity_c37r.c_sharp_get_string(reader, 2) if unity_c37r.c_sharp_get_long(reader, 3) is not None: log.Result.Value = unity_c37r.c_sharp_get_long(reader, 3) if unity_c37r.c_sharp_get_long(reader, 4) is not 0: log.Timestamp.Value = unity_c37r.get_c_sharp_ts(unity_c37r.c_sharp_get_long(reader, 4)) models.append(log) reader.Close() #self.ccmd.Dispose() return models
def __generate_transfer(self): connection = unity_c37r.create_connection(self.cache_db) cmd = sql.SQLiteCommand(connection) cmd.CommandText = ''' select * from tb_transfer ''' fts = NDFileTransfer() reader = cmd.ExecuteReader() while reader.Read(): t = NDBCPTRANSFER() t.set_value_with_idx( t.account_id, unity_c37r.c_sharp_get_string(reader, fts.account)) t.set_value_with_idx( t.file_name, unity_c37r.c_sharp_get_string(reader, fts.file_name)) t.set_value_with_idx( t.file_size, unity_c37r.c_sharp_get_long(reader, fts.file_size)) t.set_value_with_idx( t.hash, unity_c37r.c_sharp_get_string(reader, fts.hash_code)) t.set_value_with_idx( t.server_path, unity_c37r.c_sharp_get_string(reader, fts.server_path)) t.set_value_with_idx( t.file_path, unity_c37r.c_sharp_get_string(reader, fts.local_path)) t.set_value_with_idx( t.url, unity_c37r.c_sharp_get_string(reader, fts.url)) t.set_value_with_idx( t.torrent, unity_c37r.c_sharp_get_string(reader, fts.torrent_name)) t.set_value_with_idx( t.status, unity_c37r.c_sharp_get_long(reader, fts.status)) t.set_value_with_idx( t.action_type, unity_c37r.c_sharp_get_long(reader, fts.is_download)) t.set_value_with_idx( t.begin_time, unity_c37r.c_sharp_get_long(reader, fts.begin_time)) t.set_value_with_idx( t.end_time, unity_c37r.c_sharp_get_long(reader, fts.end_time)) t.set_value_with_idx( t.cached_size, unity_c37r.c_sharp_get_long(reader, fts.cached_size)) t.set_value_with_idx( t.delete_status, unity_c37r.c_sharp_get_long(reader, fts.deleted)) t.set_value_with_idx(t.collect_id, self.cid) t.set_value_with_idx(t.app_type, self.app_type) self.db_insert_transfer(t) self.db_commit() reader.Close() cmd.Dispose() connection.Close()
def checkout(db_name, app_version): res = 0x0 try: conn = unity_c37r.create_connection(db_name) cmd = sql.SQLiteCommand(conn) cmd.CommandText = ''' select * from tbl_version where v_key = '{}' '''.format(NDDBVersionKey) reader = cmd.ExecuteReader() if reader.Read(): v = unity_c37r.c_sharp_get_long(reader, 1) if v == NDDBVersionValue: res |= 0x1 reader.Close() cmd.CommandText = ''' select * from tbl_version where v_key = '{}' '''.format(NDDBApplicationVersionKey) reader = cmd.ExecuteReader() if reader.Read(): v = unity_c37r.c_sharp_get_long(reader, 1) if v == app_version: res |= 0x2 reader.Close() r = model_im.IM.need_parse(db_name + '.IM', NDDBVersionValue) if not r: res |= 0x4 cmd.Dispose() conn.Close() except: conn.Close() res = 0x0 if res != 0x7: try: os.remove(db_name) os.remove(db_name + '.IM') return True except: raise IOError("中间数据库被占用,无法继续分析") return False
def parse_feed(self, account_id): db_node = self.node.GetByPath('feed60_{}'.format(account_id)) if db_node is None: return conn = unity_c37r.create_connection_tentatively(db_node, True) cmd = SQLiteCommand(conn) # 以下列类型全部为numeric类型,但是插入的各种类型都有 # fid, time, content, location(name), sender id # sqlite 在数据管理方面是动态类型的,使用了更普遍的动态类型系统,sqlite中,值的类型和值本身是有关系的,与容器无关 # 大型数据库则使用更为刚性和静态的类型语言 cmd.CommandText = ''' select _id, field3, field55, field59, field10 from commonfeed ''' reader = cmd.ExecuteReader() while reader.Read(): feed = model_im.Feed() feed.account_id = account_id feed.deleted = 0 feed.source = db_node.AbsolutePath content = json.loads(unity_c37r.c_sharp_get_string(reader, 2)) feed.content = content.get('text') feed.send_time = unity_c37r.c_sharp_try_get_time(reader, 1) / 1000 feed.sender_id = unity_c37r.c_sharp_get_long(reader, 4) feed.deleted = 0 feed.insert_db(self.im) self.im.db_commit() reader.Close() cmd.Dispose() conn.Close() #recovery db = SQLiteParser.Database.FromNode(db_node) ts = SQLiteParser.TableSignature('commonfeed') SQLiteParser.Tools.AddSignatureToTable(ts, "field55", SQLiteParser.FieldType.Text, SQLiteParser.FieldConstraints.NotNull) for rec in db.ReadTableDeletedRecords(ts, False): feed = model_im.Feed() feed.account_id = account_id feed.deleted = 1 content = unity_c37r.try_get_rec_value(rec, "field55", "") try: js = json.loads(content) feed.content = js.get('text') except: feed.content = content feed.send_time = unity_c37r.try_get_rec_value(rec, "field3", 0) / 1000 feed.sender_id = unity_c37r.try_get_rec_value(rec, "field10", 0) feed.insert_db(self.im) self.im.db_commit()
def generate_shop_bcp(self): conn = unity_c37r.create_connection(self.cache_db) cmds = sql.SQLiteCommand(conn) cmds.CommandText = ''' select * from tb_shop ''' reader = cmds.ExecuteReader() while reader.Read(): s = ShopInfo() s.set_value_with_idx(s.colltection_target_id, self.colltection_target_id) s.set_value_with_idx(s.app_code, self.app_code) s.set_value_with_idx(s.account_id, unity_c37r.c_sharp_get_string(reader, 0)) s.set_value_with_idx(s.shop_id, unity_c37r.c_sharp_get_string(reader, 1)) s.set_value_with_idx(s.shop_name, unity_c37r.c_sharp_get_string(reader, 2)) s.set_value_with_idx(s.boss_id, unity_c37r.c_sharp_get_string(reader, 3)) s.set_value_with_idx(s.boss_account, unity_c37r.c_sharp_get_string(reader, 4)) s.set_value_with_idx(s.boss_nick, unity_c37r.c_sharp_get_string(reader, 5)) s.set_value_with_idx(s.delete_status, unity_c37r.c_sharp_get_long(reader, 6)) unity_c37r.execute_query(self.cmd, TBL_BCP_INSERT_SHOP, s.get_values()) reader.Close() cmds.Dispose() conn.Close()
def __generate_file_list(self): connection = unity_c37r.create_connection(self.cache_db) cmd = sql.SQLiteCommand(connection) cmd.CommandText = ''' select * from tbl_filelist ''' ftl = NDFileList() reader = cmd.ExecuteReader() while reader.Read(): fl = NDBCPFILELIST() fl.set_value_with_idx( fl.account_id, unity_c37r.c_sharp_get_string(reader, ftl.account)) fl.set_value_with_idx(fl.app_type, self.app_type) fl.set_value_with_idx(fl.collect_id, self.cid) fl.set_value_with_idx( fl.file_name, unity_c37r.c_sharp_get_string(reader, ftl.file_name)) fl.set_value_with_idx( fl.hash, unity_c37r.c_sharp_get_string(reader, ftl.file_hash)) fl.set_value_with_idx( fl.file_size, unity_c37r.c_sharp_get_long(reader, ftl.file_size)) fl.set_value_with_idx( fl.server_path, unity_c37r.c_sharp_get_string(reader, ftl.server_path)) fl.set_value_with_idx( fl.create_time, unity_c37r.c_sharp_get_long(reader, ftl.create_time)) fl.set_value_with_idx( fl.update_time, unity_c37r.c_sharp_get_long(reader, ftl.update_time)) fl.set_value_with_idx( fl.cached_time, unity_c37r.c_sharp_get_long(reader, ftl.cache_time)) fl.set_value_with_idx( fl.delete_status, unity_c37r.c_sharp_get_long(reader, ftl.deleted)) self.db_insert_file_list(fl) ftl = NDFileShared() reader.Close() cmd.CommandText = ''' select * from tb_shared ''' reader = cmd.ExecuteReader() while reader.Read(): fl = NDBCPFILELIST() fl.set_value_with_idx(fl.app_type, self.app_type) fl.set_value_with_idx(fl.collect_id, self.cid) fl.set_value_with_idx( fl.account_id, unity_c37r.c_sharp_get_string(reader, ftl.account)) fl.set_value_with_idx( fl.file_name, unity_c37r.c_sharp_get_string(reader, ftl.file_name)) fl.set_value_with_idx( fl.file_size, unity_c37r.c_sharp_get_long(reader, ftl.file_size)) fl.set_value_with_idx( fl.url, unity_c37r.c_sharp_get_string(reader, ftl.url)) fl.set_value_with_idx( fl.create_time, unity_c37r.c_sharp_get_long(reader, ftl.create_time)) fl.set_value_with_idx( fl.update_time, unity_c37r.c_sharp_get_long(reader, ftl.update_time)) fl.set_value_with_idx( fl.cached_time, unity_c37r.c_sharp_get_long(reader, ftl.send_time)) fl.set_value_with_idx( fl.server_path, unity_c37r.c_sharp_get_string(reader, ftl.server_path)) self.db_insert_file_list(fl) self.db_commit() reader.Close() cmd.Dispose() connection.Close()
def parse_avfs(self, ac): #ac = TbAccount() db_node = self.avfs_message_dict.get(str(ac.uid)) if db_node is None: return path = unity_c37r.check_sqlite_maturity(db_node, self.cache) conn = unity_c37r.create_connection_tentatively(path) cmd = sql.SQLiteCommand(conn) if ac.is_from_avfs: cmd.CommandText = ''' select name, extInfo, deleteStatus, signature, avatarURL, displayName, targetId from MPMProfileim_cc where targetId = {} '''.format(ac.uid) reader = cmd.ExecuteReader() if reader.Read(): a = model_im.Account() a.account_id = unity_c37r.c_sharp_get_string(reader, 6) a.nickname = unity_c37r.c_sharp_get_string(reader, 0) a.username = a.nickname a.signature = unity_c37r.c_sharp_get_string(reader, 3) a.photo = unity_c37r.c_sharp_get_string(reader, 4) self.im.db_insert_table_account(a) reader.Close() cmd.CommandText = ''' select name, extInfo, deleteStatus, signature, avatarURL, displayName, targetId from MPMProfileim_cc where targetId != {} '''.format(ac.uid) reader = cmd.ExecuteReader() f_dict = dict() while reader.Read(): f = model_im.Friend() f.nickname = unity_c37r.c_sharp_get_string(reader, 0) f.account_id = ac.uid f.friend_id = unity_c37r.c_sharp_get_string(reader, 6) f.signature = unity_c37r.c_sharp_get_string(reader, 3) f.remark = f.nickname f.deleted = unity_c37r.c_sharp_get_long(reader, 2) f.photo = unity_c37r.c_sharp_get_string(reader, 4) f_dict[f.friend_id] = f self.eb.im.db_insert_table_friend(f) reader.Close() cmd.CommandText = ''' select name, displayName, targetId, avatarURL from MPMProfileim_bc where name != '{}' '''.format(ac.tb_id) reader = cmd.ExecuteReader() #TODO add pic/tb_id when parse avfs message dict while reader.Read(): f = model_im.Friend() f.account_id = ac.uid f.nickname = unity_c37r.c_sharp_get_string(reader, 0) f.friend_id = unity_c37r.c_sharp_get_string(reader, 2) f.remark = unity_c37r.c_sharp_get_string(reader, 1) f.photo = unity_c37r.c_sharp_get_string(reader, 3) f_dict[f.friend_id] = f self.eb.im.db_insert_table_friend(f) reader.Close() #c2c messages cmd.CommandText = ''' select convTargetId, messageID, summary, senderId, receiverId, messageTime from MPMessageim_cc ''' reader = cmd.ExecuteReader() while reader.Read(): m = model_im.Message() m.account_id = ac.uid m.sender_id = unity_c37r.c_sharp_get_string(reader, 3) m.is_sender = 1 if unity_c37r.c_sharp_get_string( reader, 4) == m.sender_id else 0 m.msg_id = unity_c37r.c_sharp_get_string(reader, 1) m.talker_id = unity_c37r.c_sharp_get_string(reader, 0) m.content = unity_c37r.c_sharp_get_string(reader, 2) m.send_time = unity_c37r.c_sharp_get_long(reader, 5) / 1000 m.talker_name = f_dict[m.talker_id].nickname m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT self.im.db_insert_table_message(m) reader.Close() #b2c messages cmd.CommandText = ''' select convTargetId, messageID, summary, senderId, receiverId, messageTime from MPMessageim_bc ''' reader = cmd.ExecuteReader() while reader.Read(): m = model_im.Message() m.account_id = ac.uid m.sender_id = unity_c37r.c_sharp_get_string(reader, 3) m.talker_id = unity_c37r.c_sharp_get_string(reader, 0) m.is_sender = 0 if m.sender_id.__contains__(m.talker_id) else 1 if m.is_sender == 1: m.sender_id = ac.uid # 如果是自己发的,则替换对应的ID m.send_time = unity_c37r.c_sharp_get_long(reader, 5) / 1000 m.talker_name = f_dict[m.talker_id].nickname m.content = unity_c37r.c_sharp_get_string(reader, 2) m.msg_id = unity_c37r.c_sharp_get_string(reader, 1) m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT self.im.db_insert_table_message(m) reader.Close() cmd.Dispose() conn.Close() self.im.db_commit()
def parse(self, ac): #ac = TbAccount() self.parse_avfs(ac) db_node = self.node.GetByPath('Library/Caches/amps3_{}.db'.format( ac.uid)) if db_node is None: self.log.m_print('get db node failed, parse exists!') return #path = db_node.PathWithMountPoint #update sqlite-checking. path = unity_c37r.check_sqlite_maturity(db_node, self.cache) conn = unity_c37r.create_connection(path) cmd = sql.SQLiteCommand(conn) cmd.CommandText = ''' select ZDISPLAYNAME, ZHEADPIC, ZMOBILEPHONE, ZNICK from ZAMPUSER where ZTAOBAOID = {} '''.format(ac.uid) reader = cmd.ExecuteReader() image_cache_path = os.path.join( self.node.PathWithMountPoint, 'Library/Caches/YWDiskCache/ImageCache') if reader.Read(): a = model_im.Account() a.account_id = ac.uid a.nickname = unity_c37r.c_sharp_get_string(reader, 3) a.username = unity_c37r.c_sharp_get_string(reader, 0) ac.tb_id = a.username a.telephone = unity_c37r.c_sharp_get_string(reader, 2) pic = unity_c37r.c_sharp_get_string(reader, 1) hash_code = unity_c37r.md5(pic) if os.path.exists(os.path.join(image_cache_path, hash_code)): a.photo = 'Library/Cache/YWDiskCache/YWDiskCache/ImageCache/{}'.format( hash_code) else: a.photo = pic self.im.db_insert_table_account(a) cmd.Dispose() cmd.CommandText = ''' select ZDISPLAYNAME, ZHEADPIC, ZMOBILEPHONE, ZNICK, ZTAOBAOID, ZSIGNATURE from ZAMPUSER where ZTAOBAOID != {} '''.format(ac.uid) reader = cmd.ExecuteReader() f_dict = dict() while reader.Read(): if canceller.IsCancellationRequested: cmd.Dispose() conn.Close() self.im.db_close() raise IOError('E') f = model_im.Friend() f.account_id = ac.uid # Fix error try: f.friend_id = int(unity_c37r.c_sharp_get_string(reader, 4)) except Exception as e: self.log.m_err('error account id: %s' % unity_c37r.c_sharp_get_string(reader, 4)) f.friend_id = random.randint(0, 0xffffffff) # 产生假ID f.nickname = unity_c37r.c_sharp_get_string(reader, 3) f.remark = unity_c37r.c_sharp_get_string(reader, 0) f.telephone = unity_c37r.c_sharp_get_string(reader, 2) f.signature = unity_c37r.c_sharp_get_string(reader, 5) pic = unity_c37r.c_sharp_get_string(reader, 1) hash_code = unity_c37r.md5(pic) if os.path.exists(os.path.join(image_cache_path, hash_code)): f.photo = 'Library/Cache/YWDiskCache/ImageCache/{}'.format( hash_code) else: f.photo = pic f_dict[f.remark] = f cmd.Dispose() conn.Close() conn = None cmd = None # 用户行为分析 可以说很详细了 if ac.tb_id is None: reader = None else: log_node = self.node.GetByPath( 'Library/Caches/StructuredLogs/cntaobao{}.db'.format(ac.tb_id)) if log_node is None: reader = None else: #update sqlite connection pth = unity_c37r.check_sqlite_maturity(log_node, self.cache) conn = unity_c37r.create_connection(pth) cmd = sql.SQLiteCommand(conn) cmd.CommandText = ''' select id, operation_id, record, logtime, result from Record ''' reader = cmd.ExecuteReader() while reader is not None and reader.Read(): if canceller.IsCancellationRequested: cmd.Dispose() conn.Close() raise IOError('E') try: logs = model_eb.EBLog() m_str = unity_c37r.c_sharp_get_string(reader, 1) m_sl = m_str.split('|') sender = m_sl[1] reciever = m_sl[2] if reciever == 'wwLogin': sender = re.search(r'\(null\)(.*)', sender, re.I | re.M).group(1) desc = '''{} try to login'''.format(sender) logs.set_value_with_idx(logs.description, desc) else: sender = re.search('cnhhupan(.*)', sender, re.I | re.M).group(1) reciever = re.search('cnhhupan(.*)', reciever, re.I | re.M).group(1) desc = '''{} try to send message to {}'''.format( sender, reciever) logs.set_value_with_idx(logs.description, desc) m_str = unity_c37r.c_sharp_get_string(reader, 2) js = json.loads(m_str) content = js.get('title') logs.set_value_with_idx(logs.content, content) log_time = unity_c37r.c_sharp_get_long(reader, 3) / 1000 logs.set_value_with_idx(logs.time, log_time) result = unity_c37r.c_sharp_get_long(reader, 4) logs.set_value_with_idx(logs.result, result) self.eb.db_insert_table_log(logs.get_value()) except Exception as e: traceback.print_exc() self.log.m_print(e) self.log.m_err('detect wrong string format: {}'.format(m_str)) if conn is not None: cmd.Dispose() conn.Close() cmd = None conn = None #l = unity_c37r.search_for_certain(self.node, 'Library/Caches/YWDB/WXOPENIMSDKDB(.*)/message.db$') u = self.message_dict.get(ac.tb_id) if u is None: self.log.m_print('no %s chat info!' % ac.tb_id) return conn = unity_c37r.create_connection(u) cmd = sql.SQLiteCommand(conn) cmd.CommandText = ''' select ZDISPLAYNAME, ZEMAIL, ZGENDER, ZTBNICK, ZPHONE_NUM from ZWWPERSON ''' reader = cmd.ExecuteReader() while reader.Read(): if canceller.IsCancellationRequested: cmd.Dispose() conn.Close() self.im.db_close() raise IOError('e') user_name = unity_c37r.c_sharp_get_string(reader, 0) if f_dict.__contains__(user_name): pass else: f = model_im.Friend() f.account_id = ac.uid f.nickname = unity_c37r.c_sharp_get_string(reader, 3) f.remark = unity_c37r.c_sharp_get_string(reader, 0) f.friend_id = random.randint(0, 0xffffffff) # 产生假ID f_dict[f.remark] = f for k in f_dict: self.im.db_insert_table_friend(f_dict[k]) cmd.Dispose() cmd.CommandText = ''' select ZMESSAGEID, ZTYPE, ZTIME, ZCONTENT, ZRECEIVERID, ZSENDERID from ZWWMESSAGE ''' reader = cmd.ExecuteReader() # 最好将talker_name之类的设置全面,因为淘宝的id管理比较混乱。 # 原则上淘宝账号、支付宝账号、闲鱼账号、天猫账号、阿里巴巴账号等通用,但是实际上他们在进行管理时 # 各自采用不同的ID管理方式。导致这边筛选很尴尬 idx = 0 while reader.Read(): if canceller.IsCancellationRequested: cmd.Dispose() conn.Close() self.im.db_close() raise IOError('e') m = model_im.Message() m.account_id = ac.uid sender = unity_c37r.c_sharp_get_blob(reader, 5).decode( 'utf-8' ) #struct.unpack('i', unity_c37r.c_sharp_get_blob(reader, 5)) reciever = unity_c37r.c_sharp_get_blob(reader, 4).decode( 'utf-8' ) #struct.unpack('i', unity_c37r.c_sharp_get_blob(reader, 4)) try: sender = re.search("cnhhupan(.*)", sender, re.I | re.M).group(1) reciever = re.search("cnhhupan(.*)", reciever, re.I | re.M).group(1) except: try: if sender.__contains__('alichn'): sender = re.search('cnalichn(.*)', sender, re.I | re.M).group(1) else: reciever = re.search('cnalichn(.*)', reciever, re.I | re.M).group(1) except: self.log.m_print("sender:{} rec:{}".format( sender, reciever)) if sender.__contains__(':'): sender = sender.split(':')[0] if reciever.__contains__(':'): reciever = reciever.split(':')[0] if sender == ac.tb_id: m.is_sender = 1 if not f_dict.__contains__(reciever): self.log.m_print("no such reciever friend:%s" % reciever) continue m.talker_id = f_dict[reciever].friend_id m.sender_id = ac.uid elif f_dict.__contains__(sender): m.is_sender = 0 m.talker_id = f_dict[sender].friend_id m.sender_id = f_dict[sender].friend_id elif f_dict.__contains__(sender): #类似于hqxuelang:服务助手 这种有时候就不在表中 m.is_sender = 0 m.talker_id = f_dict[sender].friend_id m.sender_id = f_dict[sender].friend_id else: self.log.m_print('find unchecked friend:%s' % sender) f = self.create_fake_friend(ac, sender) f_dict[sender] = f m.talker_id = f_dict[sender].friend_id m.sender_id = f_dict[sender].friend_id m.msg_id = unity_c37r.c_sharp_get_long(reader, 0) tp = unity_c37r.c_sharp_get_long(reader, 1) tm = unity_c37r.c_sharp_try_get_time(reader, 2) m.send_time = unity_c37r.format_mac_timestamp(tm) m_str = unity_c37r.c_sharp_get_blob(reader, 3) if m_str is not None: m_str = m_str.decode('utf-8') else: self.log.m_print('find useless data, skipped!') m_str = '' if tp == 0 or tp == 5: m.content = m_str m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT elif tp == 1: m.content = m_str m.media_path = m_str m.type = model_im.MESSAGE_CONTENT_TYPE_IMAGE elif tp == 2: m.content = m_str m.media_path = m_str m.type = model_im.MESSAGE_CONTENT_TYPE_VOICE elif tp == 8: m.content = 'empty message' m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT elif tp == 65: try: js = json.loads(m_str) # 这里有子类型号 # 实际上是属于千牛发送的自动排列的消息内容 sub_tp = js.get('template').get('id') sub_string = js.get('template').get('data').get('text') # f = open('D:/webs/{}.xml'.format(random.randint(0, 0xffffffff)), 'w+') # if sub_string is not None: # f.write(sub_string) # f.close() if sub_tp == 20002: m.type = model_im.MESSAGE_CONTENT_TYPE_ATTACHMENT deal = model_im.Deal() trade = model_eb.EBDeal() alter_string = js.get('header').get('degrade').get( 'alternative') if alter_string.__contains__(':'): deal.deal_id = alter_string.split(':')[1] m.extra_id = deal.deal_id deal.description = '''title:{}\ncontent:{}'''.format( js.get('header').get('title'), js.get('header').get('degrade').get('alternative')) trade.set_value_with_idx(trade.desc, deal.description) deal.type = model_im.DEAL_TYPE_RECEIPT # may fix it later trade.set_value_with_idx(trade.deal_type, model_eb.TRADE_PAY) #trade.set_value_with_idx(trade.status, model_eb.EBDEAL) self.im.db_insert_table_deal(deal) self.eb.db_insert_table_deal(trade.get_value()) elif sub_tp == 20013: # 快速入口 m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT label_list = js.get('template').get('data').get( 'alist') content = '' for l in label_list: content += '%s\n' % l.get('label') m.content = content elif sub_tp is None: m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT m.content = '''title:{}\ncontent:{}'''.format( js.get('header').get('title'), js.get('degrade').get('alternative')) except Exception as e: self.log.m_err( 'detect wrong message content:{}\nidx:{}'.format( m_str, idx)) m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT m.content = u'解析失败,原始内容:' + m_str elif tp == 112: js = json.loads(m_str) m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT m.content = js.get('title') elif tp == 113: js = json.loads(m_str) m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT m.content = '''file message name:{}, size:{}'''.format( js.get('nodeName'), js.get('nodeSize')) elif tp == 241: js = json.loads(m_str) js = json.loads(js.get('datas')) m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT m.content = '''[product info]name:{}\nprice:{}\nsales:{}\npic:{}'''.format( js.get('name'), js.get('priceAsString'), js.get('salesCount'), js.get('picUrl')) else: self.log.m_print('detect unspport type:{}, index:{}'.format( tp, idx)) self.log.m_print('raw string: %s' % m_str) m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT m.content = '''[unsupport type message] raw string:%s''' % m_str self.im.db_insert_table_message(m) idx += 1 self.im.db_commit()
def parse(self, account_folder): f_node = self.node.GetByPath('Documents/{}/netdisk.sqlite'.format(account_folder)) if f_node is None: return conn = unity_c37r.create_connection_tentatively(f_node) cmd = sql.SQLiteCommand(conn) cmd.CommandText = ''' select uk, user_name, avatar_url from feed_userlist ''' reader = cmd.ExecuteReader() current_account = None if reader.Read(): a = model_im.Account() a.account_id = unity_c37r.c_sharp_get_string(reader, 0) current_account = a.account_id a.username = unity_c37r.c_sharp_get_string(reader, 1) a.nickname = a.username a.photo = unity_c37r.c_sharp_get_string(reader, 2) self.nd.im.db_insert_table_account(a) else: raise IOError('[BAIDU NETDISK] E: NO ACCOUNT INFORMATION!') reader.Close() cmd.CommandText = ''' select fid, server_full_path, file_name, file_size, file_md5, ctime, mtime, atime from cachefilelist ''' reader = cmd.ExecuteReader() while reader.Read(): f = model_nd.NDFileList() f.set_value_with_idx(f.account, current_account) f.set_value_with_idx(f.file_name, unity_c37r.c_sharp_get_string(reader, 2)) f.set_value_with_idx(f.server_path, unity_c37r.c_sharp_get_string(reader, 1)) f.set_value_with_idx(f.create_time, unity_c37r.c_sharp_try_get_time(reader, 5)) f.set_value_with_idx(f.update_time, unity_c37r.c_sharp_try_get_time(reader, 6)) f.set_value_with_idx(f.cache_time, unity_c37r.c_sharp_try_get_time(reader, 7)) f.set_value_with_idx(f.file_hash, unity_c37r.c_sharp_get_string(reader, 4)) f.set_value_with_idx(f.file_size, unity_c37r.c_sharp_get_long(reader, 3)) self.nd.db_insert_filelist(f.get_values()) reader.Close() self.nd.db_commit() cmd.CommandText = ''' select file_name, server_full_path, file_size, blocklistmd5, trans_type, trans_status, ctime, mtime, atime, downloadlink, thumburl from transfilelist ''' reader = cmd.ExecuteReader() while reader.Read(): f = model_nd.NDFileTransfer() f.set_value_with_idx(f.account, current_account) f.set_value_with_idx(f.file_name, unity_c37r.c_sharp_get_string(reader, 0)) f.set_value_with_idx(f.server_path, unity_c37r.c_sharp_get_string(reader, 1)) f.set_value_with_idx(f.file_size, unity_c37r.c_sharp_get_long(reader, 2)) f.set_value_with_idx(f.hash_code, unity_c37r.c_sharp_get_string(reader, 3)) f.set_value_with_idx(f.is_download, 1) st = unity_c37r.c_sharp_get_long(reader, 5) if st == 1: f.set_value_with_idx(f.status, model_nd.NDFileDone) else: f.set_value_with_idx(f.status, model_nd.NDFileProcessing) f.set_value_with_idx(f.url, unity_c37r.c_sharp_get_string(reader, 9)) f.set_value_with_idx(f.begin_time, unity_c37r.c_sharp_try_get_time(reader, 8)) f_name = f.get_value_with_idx(f.file_name) paddern = os.path.splitext(f_name) if len(paddern) > 1: paddern = paddern[1] else: paddern = "" r_fname = 'Documents/{0}/Cache/{1}{2}'.format(account_folder, f.get_value_with_idx(f.hash_code), paddern) s_node = self.node.GetByPath(r_fname) if s_node is not None: f.set_value_with_idx(f.local_path, s_node.AbsolutePath) self.nd.db_insert_transfer(f.get_values()) reader.Close() cmd.CommandText = ''' select server_full_path, file_md5, file_size, ctime, mtime from image_filelist ''' reader = cmd.ExecuteReader() while reader.Read(): f = model_nd.NDFileList() f.set_value_with_idx(f.account, current_account) f.set_value_with_idx(f.file_name, unity_c37r.c_sharp_get_string(reader, 0)) f.set_value_with_idx(f.server_path, f.get_value_with_idx(f.file_name)) f.set_value_with_idx(f.create_time, unity_c37r.c_sharp_try_get_time(reader, 3)) f.set_value_with_idx(f.update_time, unity_c37r.c_sharp_try_get_time(reader, 4)) f.set_value_with_idx(f.file_hash, unity_c37r.c_sharp_get_string(reader, 1)) self.nd.db_insert_filelist(f.get_values()) self.nd.db_commit() reader.Close() cmd.CommandText = ''' select from_uk, server_fullpath, server_filename, size, server_mtime, server_ctime, dlink, uname, msg_time from Mbox_groupfile_share ''' reader = cmd.ExecuteReader() while reader.Read(): s = model_nd.NDFileShared() s.set_value_with_idx(s.account, current_account) s.set_value_with_idx(s.file_name, unity_c37r.c_sharp_get_string(reader, 2)) s.set_value_with_idx(s.server_path, unity_c37r.c_sharp_get_string(reader, 1)) s.set_value_with_idx(s.file_size, unity_c37r.c_sharp_get_long(reader, 3) ) s.set_value_with_idx(s.sender_id, unity_c37r.c_sharp_get_string(reader, 0)) s.set_value_with_idx(s.update_time, unity_c37r.c_sharp_try_get_time(reader, 4)) s.set_value_with_idx(s.create_time, unity_c37r.c_sharp_try_get_time(reader, 5)) s.set_value_with_idx(s.url, unity_c37r.c_sharp_get_string(reader, 6)) s.set_value_with_idx(s.sender_name, unity_c37r.c_sharp_get_string(reader, 7)) s.set_value_with_idx(s.send_time, unity_c37r.c_sharp_try_get_time(reader, 8)) self.nd.db_insert_shared(s.get_values()) reader.Close() self.nd.db_commit() cmd.CommandText = ''' select gid, name, uname, uk, avatarurl, ctime from Mbox_group ''' reader = cmd.ExecuteReader() grp_dict = dict() while reader.Read(): grp = model_im.Chatroom() grp.account_id = current_account grp.chatroom_id = unity_c37r.c_sharp_get_string(reader, 0) grp.name = unity_c37r.c_sharp_get_string(reader, 1) grp.owner_id = unity_c37r.c_sharp_get_string(reader, 3) grp.photo = unity_c37r.c_sharp_get_string(reader, 4) grp.create_time = unity_c37r.c_sharp_try_get_time(reader, 5) grp_dict[grp.chatroom_id] = grp self.nd.im.db_insert_table_chatroom(grp) self.nd.im.db_commit() reader.Close() cmd.CommandText = ''' select gid, ctime, uk, uname, nick_name, avatar_url from Mbox_group_member ''' reader = cmd.ExecuteReader() while reader.Read(): gm = model_im.ChatroomMember() gm.account_id = current_account gm.chatroom_id = unity_c37r.c_sharp_get_string(reader, 0) gm.member_id = unity_c37r.c_sharp_get_string(reader, 2) gm.display_name = unity_c37r.c_sharp_get_string(reader, 3) gm.photo = unity_c37r.c_sharp_get_string(reader, 5) self.nd.im.db_insert_table_chatroom_member(gm) # add system message gm = model_im.ChatroomMember() gm.account_id = current_account gm.member_id = 0 gm.display_name = u'系统消息' self.nd.im.db_insert_table_chatroom_member(gm) self.nd.im.db_commit() reader.Close() # group messages cmd.CommandText = ''' select gid, msgid, msguk, time, content, username from mbox_groupmsg ''' reader = cmd.ExecuteReader() while reader.Read(): m = model_im.Message() m.talker_id = unity_c37r.c_sharp_get_string(reader, 0) if grp_dict.__contains__(m.talker_id): m.talker_name = grp_dict[m.talker_id].name m.msg_id = unity_c37r.c_sharp_get_string(reader, 1) m.sender_id = unity_c37r.c_sharp_get_string(reader, 2) m.send_time = unity_c37r.c_sharp_try_get_time(reader, 3) m.content = unity_c37r.c_sharp_get_string(reader, 4) m.is_sender = 1 if current_account == m.sender_id else 0 m.account_id = current_account m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT self.nd.im.db_insert_table_message(m) self.nd.im.db_commit() reader.Close() cmd.CommandText = ''' select uk, uname, avatarurl from mbox_newfriendunreadlist ''' reader = cmd.ExecuteReader() while reader.Read(): f = model_im.Friend() f.account_id = current_account f.friend_id = unity_c37r.c_sharp_get_string(reader, 0) f.photo = unity_c37r.c_sharp_get_string(reader, 2) f.nickname = unity_c37r.c_sharp_get_string(reader, 1) self.nd.im.db_insert_table_friend(f) self.nd.im.db_commit() reader.Close() cmd.CommandText = ''' select msgid, msguk, is_receive, time, content, username from mbox_msg ''' reader = cmd.ExecuteReader() while reader.Read(): m = model_im.Message() m.is_sender = unity_c37r.c_sharp_get_long(reader, 2) m.msg_id = unity_c37r.c_sharp_get_string(reader, 0) m.talker_id = unity_c37r.c_sharp_get_string(reader, 1) if m.is_sender == 0: m.sender_id = m.talker_id else: m.sender_id = current_account m.account_id = current_account m.content = unity_c37r.c_sharp_get_string(reader, 4) m.send_time = unity_c37r.c_sharp_try_get_time(reader, 3) m.talker_name = unity_c37r.c_sharp_get_string(reader, 5) m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT self.nd.im.db_insert_table_message(m) self.nd.im.db_commit() reader.Close()
def parse(self, aid): db_node = self.node.GetByPath('databases/{}'.format( self.account_dbs[aid])) if db_node is None: return conn = unity_c37r.create_connection_tentatively(db_node) cmd = sql.SQLiteCommand(conn) f_dict = dict() cmd.CommandText = ''' select user_id, username, name, description, web_url, image_url from users where user_id = {} '''.format(aid) reader = cmd.ExecuteReader() if reader.Read(): a = model_im.Account() a.account_id = unity_c37r.c_sharp_get_long(reader, 0) a.nickname = unity_c37r.c_sharp_get_string(reader, 2) a.username = unity_c37r.c_sharp_get_string(reader, 1) a.signature = parse_description( unity_c37r.c_sharp_get_blob(reader, 3)) a.photo = unity_c37r.c_sharp_get_string(reader, 5) f_dict[a.account_id] = a self.im.db_insert_table_account(a) reader.Close() cmd.CommandText = ''' select user_id, username, name, description, web_url, image_url from users where user_id != {} '''.format(aid) reader = cmd.ExecuteReader() while reader.Read(): f = model_im.Friend() f.account_id = aid f.friend_id = unity_c37r.c_sharp_get_long(reader, 0) f.nickname = unity_c37r.c_sharp_get_string(reader, 2) f.remark = unity_c37r.c_sharp_get_string(reader, 1) f.signature = parse_description( unity_c37r.c_sharp_get_blob(reader, 3)) f.photo = unity_c37r.c_sharp_get_string(reader, 5) f_dict[f.account_id] = f self.im.db_insert_table_friend(f) reader.Close() cmd.CommandText = ''' select status_id, author_id, content, created, favorite_count, retweet_count from statuses ''' reader = cmd.ExecuteReader() while reader.Read(): feed = model_im.Feed() feed.account_id = aid feed.likecount = unity_c37r.c_sharp_get_long(reader, 4) feed.rtcount = unity_c37r.c_sharp_get_long(reader, 5) feed.content = parse_statuses( unity_c37r.c_sharp_get_blob(reader, 2)) feed.sender_id = unity_c37r.c_sharp_get_long(reader, 1) feed.send_time = unity_c37r.c_sharp_get_long(reader, 3) / 1000 self.im.db_insert_table_feed(feed) reader.Close() cmd.CommandText = ''' select user_id, created, data, conversation_id from conversation_entries ''' reader = cmd.ExecuteReader() while reader.Read(): cid = unity_c37r.c_sharp_get_string(reader, 3) uids = cid.split('-') obj_id = None if uids[0] == str(aid): obj_id = uids[1] else: obj_id = uids[0] m = model_im.Message() m.account_id = aid m.send_time = unity_c37r.c_sharp_get_long(reader, 1) / 1000 m.content = parse_messages(unity_c37r.c_sharp_get_blob(reader, 2)) m.talker_id = obj_id m.send_id = unity_c37r.c_sharp_get_long(reader, 0) if f_dict.__contains__(int(obj_id)): m.talker_name = f_dict[int(obj_id)].nickname self.im.db_insert_table_message(m) self.im.db_commit() self.parse_recovery(aid)
def analyse_account(self, aid): account_node = self.root_node.GetByPath( '/Documents/{}/account'.format(aid)) ##########################Friends##################################### f_sql_node = account_node.GetByPath('/{}_Relation2.sqlite'.format(aid)) db = unity_c37r.create_connection(f_sql_node.PathWithMountPoint) cmd = sql.SQLiteCommand(db) friends = list() cmd.CommandText = ''' select miliaoid, name, comments, icon, type, timestamp from MLRelation2Object ''' reader = cmd.ExecuteReader() while reader.Read(): if canceller.IsCancellationRequested: self.im.db_close() raise IOError("E") f = model_im.Friend() f.account_id = aid f.friend_id = unity_c37r.c_sharp_get_string(reader, 0) f.deleted = 0 f.nickname = unity_c37r.c_sharp_get_string(reader, 1) f.remark = unity_c37r.c_sharp_get_string(reader, 2) pic = unity_c37r.c_sharp_get_string(reader, 3) f.icon = self.__get_media_path(pic, -1) f.source = f_sql_node.AbsolutePath f.type = model_im.FRIEND_TYPE_FRIEND friends.append(f) cmd.Dispose() db.Close() f_info_node = account_node.GetByPath( '/{}_PersonalInfo2.sqlite'.format(aid)) db = unity_c37r.create_connection(f_info_node.PathWithMountPoint) cmd = sql.SQLiteCommand(db) for f in friends: cmd.CommandText = ''' select info from MLPersonalInfo2Object where miliaoid = '{}' '''.format(f.friend_id) reader = cmd.ExecuteReader() if not reader.Read(): cmd.Dispose() continue jstring = unity_c37r.c_sharp_get_string(reader, 0) r = json.loads(jstring, encoding='utf-8') f.address = r.get('city') if r.get('sex') == u'男': f.gender = 0 elif r.get('sex') == u'女': f.gender = 1 else: f.gender = 9 f.photo = self.__get_media_path(r.get('icon'), -1) f.signature = r.get('signature') self.im.db_insert_table_friend(f) cmd.Dispose() self.im.db_commit() cmd.CommandText = ''' select info from MLPersonalInfo2Object where miliaoid = {} '''.format(aid) reader = cmd.ExecuteReader() if not reader.Read(): module_print('no account record in the db, skipped', 1) else: a = model_im.Account() a.account_id = aid jstring = unity_c37r.c_sharp_get_string(reader, 0) r = json.loads(jstring) a.nickname = r.get('nickname') a.address = r.get('city') a.birthdat = r.get('birthday') a.source = f_info_node.PathWithMountPoint a.signature = r.get('signature') icon_url = r.get('icon') a.photo = self.__get_media_path(icon_url, -1) a.source = f_info_node.AbsolutePath self.im.db_insert_table_account(a) ##########################Groups##################################### cmd.Dispose() db.Close() grp_sql_node = account_node.GetByPath('/{}_MUC2.sqlite'.format(aid)) if grp_sql_node is not None: db = unity_c37r.create_connection(grp_sql_node.PathWithMountPoint) cmd = sql.SQLiteCommand(db) cmd.CommandText = ''' select creator_id, creator_name, group_id, group_name, create_time, group_member_limit, group_icon from MLMUC2Object ''' reader = cmd.ExecuteReader() else: reader = None grp = dict() while reader is not None and reader.Read(): if canceller.IsCancellationRequested: self.im.db_close() raise IOError("E") g = model_im.Chatroom() g.account_id = aid g.chatroom_id = unity_c37r.c_sharp_get_string(reader, 2) g.creator_id = unity_c37r.c_sharp_get_string(reader, 0) g.create_time = unity_c37r.c_sharp_get_long(reader, 4) g.owner_id = g.creator_id g.name = unity_c37r.c_sharp_get_string(reader, 3) g.max_member_count = unity_c37r.c_sharp_get_long(reader, 5) g.deleted = 0 g.source = grp_sql_node.AbsolutePath g.member_count = 0 pic = unity_c37r.c_sharp_get_string(reader, 6) if pic is None: pic = "" res = re.search('\\[(.*)\\]', pic, re.I | re.M) if res is not None: g.photo = self.__get_media_path( json.loads(res.group(1)).get('url'), -1) if res.group(1) is not "" else None grp[g.chatroom_id] = g if reader is not None: cmd.Dispose() db.Close() grp_mem_node = account_node.GetByPath( '/{}_mucMember2.sqlite'.format(aid)) if grp_mem_node is not None: #db = sqlite3.connect(grp_mem_node.PathWithMountPoint) db = unity_c37r.create_connection(grp_mem_node.PathWithMountPoint) #cur = db.cursor() cmd = sql.SQLiteCommand(db) cmd.CommandText = ''' select group_id, member_gender, member_icon, member_id, member_nick, join_time, last_send_msg, member_uptodate from MLMUCMember2Object ''' reader = cmd.ExecuteReader() else: reader = None while reader is not None and reader.Read(): if canceller.IsCancellationRequested: self.im.db_close() raise IOError("E") gid = unity_c37r.c_sharp_get_string(reader, 0) if grp.__contains__(gid): grp[gid].member_count += 1 m = model_im.ChatroomMember() m.account_id = aid m.member_id = unity_c37r.c_sharp_get_string(reader, 3) m.display_name = unity_c37r.c_sharp_get_string(reader, 4) # fix it later #m.photo = md5() pic = unity_c37r.c_sharp_get_string(reader, 2) m.photo = self.__get_media_path(pic, -1) if pic is not "" else None m.source = grp_mem_node.AbsolutePath m.chatroom_id = unity_c37r.c_sharp_get_string(reader, 0) #m.gender = # fix it later... m.gender = 9 m.deleted = 0 self.im.db_insert_table_chatroom_member(m) if reader is not None: cmd.Dispose() db.Close() for k in grp: self.im.db_insert_table_chatroom(grp[k]) self.im.db_commit() self.__parse_message(account_node, aid)
def parse(self, account_id): db_node = self.node.GetByPath('databases/momo_{}'.format(account_id)) if db_node is None: return conn = unity_c37r.create_connection_tentatively(db_node) cmd = sql.SQLiteCommand(conn) cmd.CommandText = ''' select NAME, SIGNATURE, PHONE_NUMBER, PHOTOS from user where MOMOID = {} '''.format(account_id) reader = cmd.ExecuteReader() if reader.Read(): a = model_im.Account() a.account_id = account_id a.nickname = unity_c37r.c_sharp_get_string(reader, 0) a.signature = unity_c37r.c_sharp_get_string(reader, 1) a.photo = unity_c37r.c_sharp_get_string(reader, 3) a.telephone = unity_c37r.c_sharp_get_string(reader, 2) self.im.db_insert_table_account(a) reader.Close() cmd.CommandText = ''' select MOMOID, NAME, SIGNATURE, PHONE_NUMBER, PHOTOS from user where MOMOID != {} '''.format(account_id) reader = cmd.ExecuteReader() while reader.Read(): f = model_im.Friend() f.account_id = account_id f.friend_id = unity_c37r.c_sharp_get_string(reader, 0) f.nickname = unity_c37r.c_sharp_get_string(reader, 1) f.signature = unity_c37r.c_sharp_get_string(reader, 2) f.telephone = unity_c37r.c_sharp_get_string(reader, 3) f.photo = unity_c37r.c_sharp_get_string(reader, 4) f.type = model_im.FRIEND_TYPE_FRIEND self.im.db_insert_table_friend(f) self.f_dict[f.friend_id] = f reader.Close() self.im.db_commit() cmd.CommandText = ''' select GID, NAME, CREATE_TIME, OWNER, SIGN, LOC_LAT, LOC_LNG, SITE_NAME, PHOTOS from 'group' ''' reader = cmd.ExecuteReader() grp_dict = dict() while reader.Read(): grp = model_im.Chatroom() grp.account_id = account_id grp.chatroom_id = unity_c37r.c_sharp_get_string(reader, 0) grp.name = unity_c37r.c_sharp_get_string(reader, 1) grp.create_time = unity_c37r.c_sharp_try_get_time(reader, 2) / 1000 grp.owner_id = unity_c37r.c_sharp_get_string(reader, 3) grp.description = unity_c37r.c_sharp_get_string(reader, 4) grp.photo = unity_c37r.c_sharp_get_string(reader, 8) self.im.db_insert_table_chatroom(grp) grp_dict[grp.chatroom_id] = grp self.im.db_commit() reader.Close() cmd.Dispose() conn.Close() chat_list = list() db_node = self.node.GetByPath('databases/{}'.format(account_id)) if db_node is None: pass conn = unity_c37r.create_connection_tentatively(db_node) cmd = sql.SQLiteCommand(conn) cmd.CommandText = ''' select tbl_name from sqlite_master where tbl_name like 'Chat_%' and type = 'table' ''' reader = cmd.ExecuteReader() while reader.Read(): c = unity_c37r.c_sharp_get_string(reader, 0) chat_list.append(c) reader.Close() idx = 0 chat_dict = dict() while idx < len(chat_list): v = chat_list[idx].split('_')[1] v = processHexBytes(v) v = processBytesAndString(v, "jarekTan") #say hi 消息,之后再解析 if v.__contains__('momo'): idx += 1 continue v = v.split('_')[1] chat_dict[v] = chat_list[idx] idx += 1 for c in chat_dict: tbl_name = chat_dict[c] is_grp = grp_dict.__contains__(c) # 是否是GRP群组 if not is_grp: cmd.CommandText = ''' select m_msgid, m_msginfo, m_time, m_receive, m_type from {} '''.format(tbl_name) else: cmd.CommandText = ''' select m_msgid, m_msginfo, m_time, m_receive, m_type, m_remoteid from {} '''.format(tbl_name) reader = cmd.ExecuteReader() while reader.Read(): m = model_im.Message() m.account_id = account_id m.msg_id = unity_c37r.c_sharp_get_string(reader, 0) m.is_sender = 0 if unity_c37r.c_sharp_get_string(reader, 3) == '1' else 1 m.talker_id = c tp = unity_c37r.c_sharp_get_long(reader, 4) if not is_grp: m.talker_name = self.f_dict[c].nickname else: m.talker_name = grp_dict[c].name m.talker_type = model_im.CHAT_TYPE_FRIEND if not is_grp else model_im.CHAT_TYPE_GROUP if m.is_sender: m.sender_id = account_id elif not is_grp: m.sender_id = c m.sender_name = m.talker_name else: # 如果是群组 m.sender_id = unity_c37r.c_sharp_get_string(reader, 5) m.send_time = int(unity_c37r.c_sharp_get_string(reader, 2)) content = unity_c37r.c_sharp_get_string(reader, 1) js = json.loads(content) #如果是群组 if is_grp: m.sender_name = js.get('usertitle') # 0 正常消息 5 撤回消息 7 入群通知 if tp == 0 or tp == 5 or tp == 7: m.content = js.get('content') m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT #暂时不知道怎么解析 elif tp == 1: m.content = "暂不支持的内容" m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT #???没内容 elif tp == 2: m.content = "暂不支持的内容" m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT #暂未分析 elif tp == 6: m.content = "暂不支持的内容" m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT #群成员的动态,没有feed连接,只有图片 #拆分成两条消息 elif tp == 20: m.content = js.get('t17').get('title') + '\n' + js.get('t17').get('desc') m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT self.im.db_insert_table_message(m) m.media_path = js.get('t17').get('pic') m.type = model_im.MESSAGE_CONTENT_TYPE_IMAGE #分享 elif tp == 12: m.content = js.get('content') m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT else: m.content = content m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT self.im.db_insert_table_message(m) reader.Close() cmd.Dispose() conn.Close() self.im.db_commit() self.parse_relation_recovery(self.node.GetByPath('databases/momo_{}'.format(account_id)), account_id) self.parse_chat_recovery(self.node.GetByPath('databases/{}'.format(account_id)),account_id, chat_dict, self.f_dict, grp_dict) self.parse_feed(account_id)
def __parse_message(self, a_node, aid): f_message_node = a_node.GetByPath('/{}_Message.sqlite'.format(aid)) db = unity_c37r.create_connection(f_message_node.PathWithMountPoint) cmd = sql.SQLiteCommand(db) cmd.CommandText = ''' select ZLOCAL_ID, ZBODY_TYPE, ZTIMESTAMP, ZBODY, ZEXT_ID, ZMSG_SENDER, ZMSG_TO, ZMSG_XML from ZMESSAGEV5OBJECT ''' try: reader = None reader = cmd.ExecuteReader() except: #因为此处会出现错误,故暂时在出异常时,把文件移到Cache里面(Md5) if reader is not None: reader.Close() cmd.Dispose() db.Close() dst_file = self.cache + "/" + unity_c37r.md5( f_message_node.PathWithMountPoint) unity_c37r.mapping_file_with_copy( f_message_node.PathWithMountPoint, dst_file) db = unity_c37r.create_connection(dst_file) cmd = sql.SQLiteCommand(db) cmd.CommandText = ''' select ZLOCAL_ID, ZBODY_TYPE, ZTIMESTAMP, ZBODY, ZEXT_ID, ZMSG_SENDER, ZMSG_TO, ZMSG_XML from ZMESSAGEV5OBJECT ''' reader = cmd.ExecuteReader() # 如果再出错误,这个案例就有问题了 while reader.Read(): if canceller.IsCancellationRequested: self.im.db_close() raise IOError("E") m = model_im.Message() m.talker_type = model_im.CHAT_TYPE_FRIEND m.account_id = aid target_id = unity_c37r.c_sharp_get_string(reader, 5) m.is_sender = 1 if str(target_id) == aid else 0 m.deleted = 0 m.msg_id = unity_c37r.c_sharp_get_long(reader, 0) m.send_time = int( unity_c37r.c_sharp_get_real(reader, 2) * 1000) / 1000 m.source = f_message_node.AbsolutePath m.sender_id = unity_c37r.c_sharp_get_string(reader, 5) if m.is_sender == 1: tid = unity_c37r.c_sharp_get_string(reader, 6) m.talker_id = tid.split('@')[0] else: m.talker_id = unity_c37r.c_sharp_get_string(reader, 5) #def __process_message(self, content, xml, aid, m_type, ext_id): p1 = unity_c37r.c_sharp_get_string(reader, 3) p2 = unity_c37r.c_sharp_get_string(reader, 7) tp = unity_c37r.c_sharp_get_long(reader, 1) p3 = unity_c37r.c_sharp_get_string(reader, 4) s_msg = self.__process_message(p1, p2, aid, tp, p3) m.content = s_msg.content m.media_path = s_msg.media_path m.type = s_msg.media_type try: self.im.db_insert_table_message(m) except: print('f****d!') cmd.Dispose() db.Close() self.im.db_commit() g_message_node = self.root_node.GetByPath( 'Documents/{}/account/{}_MUC.sqlite'.format(aid, aid)) if g_message_node is None: reader = None else: db = unity_c37r.create_connection( g_message_node.PathWithMountPoint) cmd = sql.SQLiteCommand(db) cmd.CommandText = ''' select ZBODY_TYPE, ZMSG_ID, ZSEND_TIME, ZBODY, ZSENDER_ID, ZMSG_TO, ZMSG_XML, ZEXT_ID from ZMUCMESSAGEOBJECT ''' reader = cmd.ExecuteReader() while reader is not None and reader.Read(): if canceller.IsCancellationRequested: self.im.db_close() raise IOError("E") m = model_im.Message() m.talker_type = model_im.CHAT_TYPE_GROUP m.msg_id = unity_c37r.c_sharp_get_string(reader, 1) m.account_id = aid sender_id = unity_c37r.c_sharp_get_string(reader, 4) m.sender_id = sender_id if sender_id is not 0 or unity_c37r.c_sharp_get_string( reader, 4) != '' else -1000 # -1000 means system... m.is_sender = 1 if str(m.sender_id) == aid else 0 m.send_time = unity_c37r.c_sharp_get_long(reader, 2) / 1000 m.source = g_message_node.AbsolutePath m.deleted = 0 tp = unity_c37r.c_sharp_get_long(reader, 0) xml = unity_c37r.c_sharp_get_string(reader, 6) ext_id = unity_c37r.c_sharp_get_string(reader, 7) if tp == 0 or tp == 3: m.content = unity_c37r.c_sharp_get_string(reader, 3) m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT if m.sender_id != -1000 else model_im.MESSAGE_CONTENT_TYPE_SYSTEM elif xml is not None and ext_id is None: if tp == 1: r = os.path.exists( os.path.join(self.root_node.PathWithMountPoint, 'Documents/image/%s' % ext_id)) if r: m.media_path = os.path.join( self.root_node.AbsolutePath, 'Documents/image/%s' % ext_id) m.type = model_im.MESSAGE_CONTENT_TYPE_IMAGE elif os.path.exists( os.path.join(self.root_node.PathWithMountPoint, 'Documents/image/th_%s' % ext_id)): m.media_path = os.path.join( self.root_node.AbsolutePath, 'Documents/image/th_%s' % ext_id) m.type = model_im.MESSAGE_CONTENT_TYPE_IMAGE else: m.content = 'image message not cached' m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT elif tp == 6: r = self.__handle_location(aid, ext_id) if r == '': m.content = 'location message not cached' m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT r = r.split(';') m.location_name = r[0] m.location_lat = r[1] m.location_lng = r[2] m.type = model_im.MESSAGE_CONTENT_TYPE_LOCATION else: p1 = unity_c37r.c_sharp_get_string(reader, 3) p2 = unity_c37r.c_sharp_get_string(reader, 6) ext_id = unity_c37r.c_sharp_get_string(reader, 7) s_msg = self.__process_message(p1, p2, aid, tp, ext_id) m.media_path = s_msg.media_path m.type = s_msg.media_type self.im.db_insert_table_message(m) if reader is not None: cmd.Dispose() db.Close() self.im.db_commit()
def parse(self): app_node = self.node.GetByPath('Library/Caches/__xstore_app.db') if app_node is None: print('f****d') return conn = unity_c37r.create_connection(app_node.PathWithMountPoint) cmd = sql.SQLiteCommand(conn) cmd.CommandText = ''' select nick, logo, gender from PUserInfo where userId = {} '''.format(self.account) reader = cmd.ExecuteReader() if reader.Read(): a = model_im.Account() a.account_id = self.account a.nickname = unity_c37r.c_sharp_get_string(reader, 0) a.photo = unity_c37r.c_sharp_get_string(reader, 1) self.im.db_insert_table_account(a) cmd.Dispose() cmd.CommandText = ''' select userId, nick, logo, gender from PUserInfo where userId != {} '''.format(self.account) reader = cmd.ExecuteReader() while reader.Read(): if canceller.IsCancellationRequested: cmd.Dispose() conn.Close() self.im.db_close() raise IOError('e') f = model_im.Friend() f.account_id = self.account f.friend_id = unity_c37r.c_sharp_get_long(reader, 0) f.nickname = unity_c37r.c_sharp_get_string(reader, 1) f.photo = unity_c37r.c_sharp_get_string(reader, 2) self.im.db_insert_table_friend(f) cmd.Dispose() cmd.CommandText = ''' select pondId, adminUserId, pondName, pondLogo from PPondInfo ''' reader = cmd.ExecuteReader() while reader.Read(): if canceller.IsCancellationRequested: cmd.Dispose() conn.Close() self.im.db_close() raise IOError('e') g = model_im.Chatroom() g.account_id = self.account g.chatroom_id = unity_c37r.c_sharp_get_long(reader, 0) g.name = unity_c37r.c_sharp_get_string(reader, 2) g.owner_id = unity_c37r.c_sharp_get_long(reader, 1) g.photo = unity_c37r.c_sharp_get_string(reader, 3) self.im.db_insert_table_chatroom(g) cmd.Dispose() cmd.CommandText = ''' select * from PItemInfo ''' reader = cmd.ExecuteReader() while reader.Read(): if canceller.IsCancellationRequested: cmd.Dispose() conn.Close() self.im.db_close() raise IOError('e') feed = model_im.Feed() feed.account_id = self.account feed.attachment_link = unity_c37r.c_sharp_get_string(reader, 1) feed.attachment_title = unity_c37r.c_sharp_get_string(reader, 4) #feed.attachment_desc feed.attachment_desc = '''price:{}\norigPrice:\n'''.format(unity_c37r.c_sharp_get_string(reader, 2), unity_c37r.c_sharp_get_string(reader, 3)) seller_id = unity_c37r.c_sharp_get_long(reader, 5) seller_info = unity_c37r.c_sharp_get_long(reader, 6) feed.sender_id = seller_id if seller_id != 0 else seller_info self.im.db_insert_table_feed(feed) cmd.Dispose() conn.Close() db_node = self.node.GetByPath('Library/Caches/__xstore_user_{}.db'.format(self.account)) if db_node is None: print('f****d') return conn = unity_c37r.create_connection(db_node.PathWithMountPoint) cmd = sql.SQLiteCommand(conn) cmd.CommandText = ''' select Sid, Uid, content, extJson, timeStamp from PMessage ''' reader = cmd.ExecuteReader() while reader.Read(): if canceller.IsCancellationRequested: cmd.Dispose() conn.Close() self.im.db_close() raise IOError('e') m = model_im.Message() m.account_id = self.account m.sender_id = unity_c37r.c_sharp_get_long(reader, 1) m.talker_id = unity_c37r.c_sharp_get_long(reader, 0) m.send_time = unity_c37r.c_sharp_get_long(reader, 4) / 1000 try: string = unity_c37r.c_sharp_get_string(reader, 2) js = json.loads(string) tp = js.get('contentType') if tp == 1: m.content = js.get('text').get('text') m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT elif tp == 17: # trade... #m.content = js.get('content') m.content = js.get('title') deal = model_im.Deal() m.type = model_im.MESSAGE_CONTENT_TYPE_RECEIPT m.extra_id = deal.deal_id deal.money = js.get('content') deal.description = js.get('title') self.im.db_insert_table_deal(deal) elif tp == 10: m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT js = js.get('actionCard') m.content = '''title:{}\ncontent:{}'''.format(js.get('memo'), js.get('title')) elif tp == 2: # image m.type = model_im.MESSAGE_CONTENT_TYPE_IMAGE m.media_path = js.get('image').get('pics')[0].get('url') elif tp == 8: m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT m.content = '''title:{}\ncontent:{}'''.format(js.get('imageCard').get('title'), js.get('imageCard').get('content')) elif tp == 6: m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT #m.content = '''title:{}\ncontent:{}\nstring:{}'''.format(js.get('textCard').get('title'), js.get('textCard').get('memo'), string) js = js.get('textCard') title = js.get('title') # if title is None: # m.content = '''content:{}'''.format(js.get('content')) # else: # m.content = '''title:{}\ncontent:{}\nstring:{}'''.format(js.get('title'), js.get('memo'), string) content = js.get('content') memo = js.get('memo') m.content = '''title:{}\ncontent:{}\nmemo:{}'''.format(title, content, memo) elif tp == 16: m.type = model_im.MESSAGE_CONTENT_TYPE_ATTACHMENT m.content = js.get('itemCard').get('title') deal = model_im.Deal() js = js.get('itemCard').get('item') deal.deal_id = js.get('itemId') m.extra_id = deal.deal_id m.media_path = js.get('mainPic') deal.description = js.get('title') deal.money = js.get('price') self.im.db_insert_table_deal(deal) elif tp == 11: # 留言 m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT m.content = '''title:{}\ncontent:{}'''.format(js.get('reply').get('title'), js.get('reply').get('content')) # url is lost... waiting for support. elif tp == 20: m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT m.content = js.get('text') elif tp == 7: m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT m.content = js.get('itemCard').get('title') elif tp == 14: m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT m.content = js.get('tip').get('tips') else: print('detect unsupported type:%d' % tp) m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT m.content = string self.im.db_insert_table_message(m) except Exception as e: print 'find error string:{}'.format(string) logging.error(e) self.im.db_commit() cmd.Dispose() cmd.CommandText = ''' select XSummary, Session$$$$sessionId , ts, Sender from XMessageCenterItem ''' reader = cmd.ExecuteReader() while reader.Read(): if canceller.IsCancellationRequested: cmd.Dispose() conn.Close() self.im.db_close() raise IOError('e') m = model_im.Message() m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT m.content = unity_c37r.c_sharp_get_string(reader, 0) m.talker_id = unity_c37r.c_sharp_get_long(reader, 1) m.sender_id = unity_c37r.c_sharp_get_long(reader, 3) m.send_time = unity_c37r.c_sharp_get_long(reader, 2) / 1000 self.im.db_insert_table_message(m) self.im.db_commit() cmd.Dispose() conn.Close()