示例#1
0
 def _get_chatroom(self):
     conn = self.__get_con()
     conn.Open()
     cmd = System.Data.SQLite.SQLiteCommand(conn)
     cmd.CommandText = """select uid,
                                 name,
                                 data
                         from chats"""
     reader = cmd.ExecuteReader()
     while reader.Read():
         try:
             chat_room = model_im.Chatroom()
             chat_room.account_id = self.account
             chat_room.chatroom_id = GetInt64(reader, 0)
             chat_room.name = GetString(reader, 1)
             chat_room.source = self.root.GetByPath(
                 self.account_db_path).PathWithMountPoint
             # 没有找到解析chats表data的decoder类
             self.model_col.db_insert_table_chatroom(chat_room)
         except Exception as e:
             print(e)
     cmd.Dispose()
     reader.Close()
     conn.Close()
     self.model_col.db_commit()
示例#2
0
    def parse_relation_recovery(self, db_node, account_id):
        if db_node is None:
            return
        db = SQLiteParser.Database.FromNode(db_node)
        ts = SQLiteParser.TableSignature('user')
        sb = SQLiteParser.Tools.AddSignatureToTable(ts, "MOMOID", SQLiteParser.FieldType.Text, SQLiteParser.FieldConstraints.NotNull)

        for rec in db.ReadTableDeletedRecords(ts, False):
            friend = model_im.Friend()
            friend.friend_id = str(unity_c37r.try_get_rec_value(rec, 'MOMOID', ''))
            friend.nickname = str(unity_c37r.try_get_rec_value(rec, 'NAME', ""))
            friend.signature = str(unity_c37r.try_get_rec_value(rec, 'SIGNATURE', ""))
            friend.telephone = str(unity_c37r.try_get_rec_value(rec, 'PHONENUMBER', ''))
            friend.photo = str(unity_c37r.try_get_rec_value(rec, 'PHOTOS', ''))
            friend.account_id = account_id
            friend.type = model_im.FRIEND_TYPE_FRIEND
            friend.deleted = 1
            self.im.db_insert_table_friend(friend)
        ts = SQLiteParser.TableSignature('group')
        SQLiteParser.Tools.AddSignatureToTable(ts, "GID", SQLiteParser.FieldType.Text, SQLiteParser.FieldConstraints.NotNull)
        for rec in db.ReadTableDeletedRecords(ts, False):
            cm = model_im.Chatroom()
            cm.account_id = account_id
            cm.chatroom_id = str(unity_c37r.try_get_rec_value(rec, 'GID', ""))
            cm.name = str(unity_c37r.try_get_rec_value(rec, 'NAME', ''))
            cm.owner_id = str(unity_c37r.try_get_rec_value(rec, 'NAME', ""))
            cm.description = str(unity_c37r.try_get_rec_value(rec, 'SIGN', ''))
            cm.photo = str(unity_c37r.try_get_rec_value(rec, 'PHOTOS', ''))
            cm.deleted = 1
            self.im.db_insert_table_chatroom(cm)
        self.im.db_commit()
示例#3
0
    def decode_recover_chatroom(self):
        node = self.root.GetByPath(self.account_db_path)
        if node is None:
            return
        db = SQLiteParser.Database.FromNode(node, canceller)
        if db is None:
            return
        table = 'chats'
        ts = SQLiteParser.TableSignature(table)
        for rec in db.ReadTableDeletedRecords(ts, False):
            if canceller.IsCancellationRequested:
                return
            try:
                chat_room = model_im.Chatroom()
                chat_room.account_id = self.account
                chat_room.source = self.root.GetByPath(
                    self.account_db_path).PathWithMountPoint
                chat_room.chatroom_id = rec['uid'].Value
                chat_room.name = rec['name'].Value
                chat_room.deleted = 1

                # 没有找到解析chats表data的decoder类
                self.model_col.db_insert_table_chatroom(chat_room)
            except Exception as e:
                print("error happen", e)
        self.model_col.db_commit()
示例#4
0
    def decode_recover_chatroom(self):
        if not self.c_recover_helper.is_valid():
            return
        ts = self.c_recover_helper.fetch_table("groups", {
            "group_id": "Int",
            "name": "Text",
            "ctime": "Int",
            "create_uk": "Int",
            "people_limit": "Int",
        })
        for rec in self.c_recover_helper.read_deleted_record(ts):
            if canceller.IsCancellationRequested:
                return
            try:

                chatroom = model_im.Chatroom()
                chatroom.deleted = 1
                chatroom.source = self.c_recover_helper.db_path
                chatroom.account_id = self.using_account.account_id
                chatroom.chatroom_id = rec['group_id'].Value
                chatroom.name = rec['name'].Value
                chatroom.creator_id = rec['create_uk'].Value
                chatroom.create_time = rec['ctime'].Value
                chatroom.max_member_count = rec['people_limit'].Value

                self.model_im_col.db_insert_table_chatroom(chatroom)
            except Exception as e:
                pass
        self.model_im_col.db_commit()
示例#5
0
    def decode_recover_chatroom(self):
        table_name = self.table_name["conversations"]
        if not self.recovering_helper.is_valid():
            return
        ts = self.recovering_helper.fetch_table(table_name, {
            "nsp_data": "Text",
        })
        for rec in self.recovering_helper.read_deleted_record(ts):
            if canceller.IsCancellationRequested:
                return
            try:
                chatroom_info = json.loads(rec["nsp_data"].Value)

                chatroom = model_im.Chatroom()
                chatroom.deleted = 1
                chatroom.source = self.checking_col.db_path
                chatroom.account_id = self.using_account.account_id
                chatroom.chatroom_id = chatroom_info["conv"]["id"].split(":", 1)[1]
                if (not chatroom.chatroom_id.endswith("@thread.skype")) and (
                        not chatroom.chatroom_id.endswith("highlights.skype")):
                    continue
                if chatroom_info["conv"].get("_convProps", None):
                    chatroom.create_time = self.__convert_timestamp(
                        chatroom_info["conv"]["_convProps"].get("created", None))
                if chatroom_info["conv"].get("_threadProps", None):
                    chatroom.member_count = int(chatroom_info["conv"]["_threadProps"].get("membercount", 0))
                    chatroom.name = chatroom_info["conv"]["_threadProps"].get("topic", None)
                    if chatroom_info["conv"]["_threadProps"].get("creator", None):
                        chatroom.creator_id = chatroom_info["conv"]["_threadProps"].get("creator", "").split(":", 1)[1]
                self.model_im_col.db_insert_table_chatroom(chatroom)
            except Exception as e:
                pass
        self.model_im_col.db_commit()
示例#6
0
 def parse_chatroom(self, dbPath):
     '''解析群组数据'''
     db = SQLite.SQLiteConnection(
         'Data Source = {}; ReadOnly = True'.format(dbPath))
     db.Open()
     db_cmd = SQLite.SQLiteCommand(db)
     try:
         if db is None:
             return
         db_cmd.CommandText = '''select a.discussionid, a.title, a.memberver, count(b.memberid) as member_count, a.deleted from bb_discussion_info as a 
             left join bb_discussion_member_info as b on a.discussionid = b.discussionid group by a.discussionid'''
         sr = db_cmd.ExecuteReader()
         while (sr.Read()):
             try:
                 chatroom = model_im.Chatroom()
                 if canceller.IsCancellationRequested:
                     break
                 chatroom.account_id = self.account_id
                 chatroom.chatroom_id = self._db_reader_get_int_value(sr, 0)
                 chatroom.create_time = self._db_reader_get_int_value(sr, 2)
                 chatroom.deleted = self._db_reader_get_int_value(sr, 4)
                 chatroom.member_count = self._db_reader_get_int_value(
                     sr, 3)
                 chatroom.name = self._db_reader_get_string_value(sr, 1)
                 chatroom.source = self.node.AbsolutePath
                 self.db_insert_table_chatroom(chatroom)
             except:
                 traceback.print_exc()
         sr.Close()
         self.db_commit()
         db_cmd.Dispose()
         db.Close()
     except Exception as e:
         print(e)
示例#7
0
 def parse_chatroom(self, dbPath):
     '''解析群组数据'''
     db = SQLite.SQLiteConnection(
         'Data Source = {}; ReadOnly = True'.format(dbPath))
     db.Open()
     db_cmd = SQLite.SQLiteCommand(db)
     try:
         if db is None:
             return
         db_cmd.CommandText = '''select groupname, myuid, groupicon, groupId, deleted from DBTableNmae_GroupMsg'''
         sr = db_cmd.ExecuteReader()
         while (sr.Read()):
             try:
                 chatroom = model_im.Chatroom()
                 if canceller.IsCancellationRequested:
                     break
                 chatroom.account_id = self.account_id
                 chatroom.chatroom_id = self._db_reader_get_int_value(sr, 3)
                 chatroom.photo = self._db_reader_get_string_value(sr, 2)
                 chatroom.deleted = self._db_reader_get_int_value(sr, 4)
                 chatroom.name = self._db_reader_get_string_value(sr, 0)
                 chatroom.source = self.node.AbsolutePath
                 self.db_insert_table_chatroom(chatroom)
             except:
                 traceback.print_exc()
         sr.Close()
         self.db_commit()
         db_cmd.Dispose()
         db.Close()
     except Exception as e:
         print(e)
示例#8
0
 def decode_recover_chatroom(self):
     if not self.cl_recover_helper.is_valid():
         return
     ts = self.cl_recover_helper.fetch_table("contact", {
         "_rowid_": "Int",
         "pid": "Text",
         "isTemporary": "Int",
         "displayName": "Text",
         "groupId": "Int",
         "userType": "Int"
     })
     for rec in self.cl_recover_helper.read_deleted_record(ts):
         if canceller.IsCancellationRequested:
             return
         try:
             if rec["groupId"].Value == 0 or rec["userType"].Value != 5:
                 continue
             chatroom = model_im.Chatroom()
             chatroom.source = self.cl_db_path
             chatroom.account_id, _, chatroom.chatroom_id = rec["pid"].Value.split("|")
             chatroom.name = rec["displayName"].Value
             chatroom.deleted = 1
             self.model_im_col.db_insert_table_chatroom(chatroom)
         except Exception as e:
             print("debug error", e)
     self.model_im_col.db_commit()
示例#9
0
 def _get_chatroom_table(self):
     with self.cl_db_col as db_col:
         sql = """SELECT contact.pid, 
                         contact.userType, 
                         contact.isTemporary, 
                         contact.displayName,
                         chat_info.chatDescription, 
                         chat_info.chatParticipantsCount, 
                         chat_info.rules, 
                         chat_info.youRole
                 FROM contact left join chat_info on contact._rowid_ = chat_info.contactID
                 where chat_info.youRole != 0;"""
         db_col.execute_sql(sql)
         while db_col.has_rest():
             try:
                 chatroom = model_im.Chatroom()
                 chatroom.source = self.cl_db_path
                 chatroom.account_id, _, chatroom.chatroom_id = db_col.get_string(0).split("|")
                 chatroom.name = db_col.get_string(3)
                 chatroom.description = db_col.get_string(4)
                 chatroom.member_count = db_col.get_int64(5)
                 chatroom.notice = db_col.get_string(6)
                 chatroom.type = model_im.CHATROOM_TYPE_NORMAL if db_col.get_int64(
                     2) == 0 else model_im.CHATROOM_TYPE_TEMP
                 self.model_im_col.db_insert_table_chatroom(chatroom)
             except Exception as e:
                 print("debug error", e)
         self.model_im_col.db_commit()
示例#10
0
 def parse_chatroom(self):
     '''解析群组数据'''
     try:
         db = SQLiteParser.Database.FromNode(self.node, canceller)
         if db is None:
             return
         ts = SQLiteParser.TableSignature('tb_group_history_order')
         for rec in db.ReadTableRecords(ts, self.extractDeleted, True):
             try:
                 if rec.IsDeleted == 1:
                     continue
                 chatroom = model_im.Chatroom()
                 if canceller.IsCancellationRequested:
                     break
                 chatroom.account_id = self.account_id
                 chatroom.chatroom_id = self._db_record_get_int_value(
                     rec, 'groupid')
                 chatroom.photo = self._db_record_get_string_value(
                     rec, 'groupicon')
                 chatroom.member_count = self.member_count[
                     chatroom.chatroom_id]
                 chatroom.deleted = rec.IsDeleted
                 chatroom.name = self._db_record_get_string_value(
                     rec, 'groupname')
                 chatroom.source = self.node.AbsolutePath
                 self.db_insert_table_chatroom(chatroom)
             except:
                 pass
         self.db_commit()
     except Exception as e:
         print(e)
示例#11
0
 def decode_recover_chatroom(self):
     if not self.recover_helper.is_valid():
         return
     ts = self.recover_helper.fetch_table(
         "ICQ_CONTACT_DATA", {
             "PROFILE_ID": "Text",
             "CONTACT_ID": "Text",
             "NAME": "Text",
             "CHAT_INFO_ID": "Int",
         })
     for rec in self.recover_helper.read_deleted_record(ts):
         if canceller.IsCancellationRequested:
             return
         try:
             name = rec["CONTACT_ID"].Value
             if "@" in name:
                 chatroom = model_im.Chatroom()
                 chatroom.account_id = rec["PROFILE_ID"].Value
                 chatroom.name = name
                 chatroom.chatroom_id = rec["CONTACT_ID"].Value
                 chatroom.source = self.icq_data_path
                 chatroom.deleted = 1
                 chat_info_id = rec["CHAT_INFO_ID"].Value
                 if chat_info_id:
                     _, chatroom.description, chatroom.member_count = self.__query_chatroom_info(
                         chat_info_id)
                 self.model_im_col.db_insert_table_chatroom(chatroom)
         except Exception as e:
             print("error happen", e)
     self.model_im_col.db_commit()
示例#12
0
 def get_groups_friends(self, node):
     db = SQLiteParser.Database.FromNode(node, canceller)
     if db is None:
         return
     if 'SessionModel' not in db.Tables:
         return
     tbs = SQLiteParser.TableSignature("SessionModel")
     for rec in db.ReadTableRecords(tbs, self.extractDeleted, True):
         try:
             if canceller.IsCancellationRequested:
                 return
             # 群
             if "`sessionType`" in rec and rec["`sessionType`"].Value == 3:
                 group = model_im.Chatroom()
                 group.source = node.AbsolutePath
                 if rec.Deleted == DeletedState.Deleted:
                     group.deleted = 1
                 group.type = 1
                 if "`loadName`" in rec and (
                         not rec["`loadName`"].IsDBNull):
                     group.account_id = rec["`loadName`"].Value
                 if "`sessionAvatar`" in rec and (
                         not rec["`sessionAvatar`"].IsDBNull):
                     group.photo = rec["`sessionAvatar`"].Value
                 if "`sessionNickName`" in rec and (
                         not rec["`sessionNickName`"].IsDBNull):
                     group.name = rec["`sessionNickName`"].Value
                 if "`sessionId`" in rec and (
                         not rec["`sessionId`"].IsDBNull):
                     group.chatroom_id = rec["`sessionId`"].Value
                 if group.chatroom_id and group.name:
                     self.group_list[group.chatroom_id] = group.name
                 if group.account_id and group.chatroom_id:
                     self.blued.db_insert_table_chatroom(group)
             # 好友
             elif "`sessionType`" in rec and rec["`sessionType`"].Value == 2:
                 friend = model_im.Friend()
                 friend.source = node.AbsolutePath
                 friend.type = 1
                 if "`loadName`" in rec and (
                         not rec["`loadName`"].IsDBNull):
                     friend.account_id = rec["`loadName`"].Value
                 if "`sessionAvatar`" in rec and (
                         not rec["`sessionAvatar`"].IsDBNull):
                     friend.photo = rec["`sessionAvatar`"].Value
                 if "`sessionNickName`" in rec and (
                         not rec["`sessionNickName`"].IsDBNull):
                     friend.nickname = rec["`sessionNickName`"].Value
                 if "`sessionId`" in rec and (
                         not rec["`sessionId`"].IsDBNull):
                     friend.friend_id = rec["`sessionId`"].Value
                 if friend.friend_id and friend.nickname:
                     self.friend_list[friend.friend_id] = friend.nickname
                 if friend.account_id and friend.friend_id:
                     self.blued.db_insert_table_friend(friend)
         except Exception as e:
             traceback.print_exc()
     self.blued.db_commit()
示例#13
0
    def get_contacts(self):
        if self.user is None:
            return

        dbPath = self.root.GetByPath('../../../Documents/' + self.user +
                                     '/msg2.db')
        db = SQLiteParser.Database.FromNode(dbPath)
        if db is None:
            return

        if 'msglog' in db.Tables:
            ts = SQLiteParser.TableSignature('msglog')
            SQLiteParser.Tools.AddSignatureToTable(
                ts, "id", SQLiteParser.FieldType.Text,
                SQLiteParser.FieldConstraints.NotNull)
            for rec in db.ReadTableRecords(ts, self.extract_deleted):
                if canceller.IsCancellationRequested:
                    return
                contact = {'deleted': rec.Deleted, 'repeated': 0}
                contactid = rec['id'].Value
                type = rec['msg_type'].Value
                if contactid in self.contacts:
                    continue
                else:
                    self.contacts[contactid] = contact

                if type == 1:
                    friend = model_im.Friend()
                    friend.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                    friend.repeated = contact.get('repeated', 0)
                    friend.source = dbPath.AbsolutePath

                    friend.account_id = self.user
                    friend.friend_id = contactid
                    friend.type = model_im.FRIEND_TYPE_FRIEND
                    self.csm.db_insert_table_friend(friend)

                if type == 2:
                    chatroom = model_im.Chatroom()
                    chatroom.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                    chatroom.repeated = contact.get('repeated', 0)
                    chatroom.source = dbPath.AbsolutePath

                    chatroom.account_id = self.user
                    chatroom.chatroom_id = contactid
                    self.csm.db_insert_table_chatroom(chatroom)

                if type == 6:
                    friend = model_im.Friend()
                    friend.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                    friend.repeated = contact.get('repeated', 0)
                    friend.source = dbPath.AbsolutePath

                    friend.account_id = self.user
                    friend.friend_id = contactid
                    friend.type = model_im.FRIEND_TYPE_SUBSCRIBE
                    self.csm.db_insert_table_friend(friend)
            self.csm.db_commit()
示例#14
0
 def parse_chatroom(self, dbPath, deleteFlag):
     '''解析群组数据'''
     db = SQLite.SQLiteConnection('Data Source = {}; ReadOnly = True'.format(dbPath))
     db.Open()
     db_cmd = SQLite.SQLiteCommand(db)
     if deleteFlag is 1:
         self.db = SQLite.SQLiteConnection('Data Source = {}'.format(self.cachedb))
         self.db.Open()
         self.db_cmd = SQLite.SQLiteCommand(self.db)
     try:
         if db is None:
             return
         db_cmd.CommandText = '''select distinct _id, date, participant_id_1, participant_id_2, participant_id_3, participant_id_4, name from conversations where conversation_type = 1'''
         sr = db_cmd.ExecuteReader()
         dic = {}
         while (sr.Read()):
             try:
                 id = self._db_reader_get_int_value(sr, 0)
                 if id != 0:
                     if id not in dic.keys():
                         dic[id] = []
                         dic[id].append(deleteFlag)
                     elif deleteFlag in dic[id]:
                         continue
                 chatroom = model_im.Chatroom()
                 if canceller.IsCancellationRequested:
                     break
                 chatroom.account_id = self.account_id
                 chatroom.chatroom_id = self._db_reader_get_int_value(sr, 0)
                 chatroom.create_time = self._get_timestamp(sr[1]) if not IsDBNull(sr[1]) else 0
                 chatroom.deleted = deleteFlag
                 if sr[5] != 0:
                     count = 4
                 elif sr[4] != 0:
                     count = 3
                 elif sr[3] != 0:
                     count = 2
                 else:
                     count = 0
                 chatroom.member_count = count
                 chatroom.name = self._db_reader_get_string_value(sr, 6)
                 chatroom.source = self.node.AbsolutePath
                 self.db_insert_table_chatroom(chatroom)
             except:
                 traceback.print_exc()
         sr.Close()
         if deleteFlag is 0: 
             self.db_commit()
         db_cmd.Dispose()
         db.Close()
     except Exception as e:
         print(e)
示例#15
0
    def parse_Chatroom(self, table_name):
        ''' REAL_GROUP 包含群成员

            FieldName	SQLType	   	
            _key	        STRING     # chat_id
            _val	        BLOB       # 
        '''
        CHATROOM_ID_NAME = {}
        FRIEND_CHATROOMS = {}
        for rec in self._read_table(table_name, deleted=False):
            if self._is_empty(rec, '_key', '_val'):
                continue
            try:
                pk_value = rec['_key'].Value
                if pk_value[0] not in ('c', 'r') or self._is_duplicate(
                        rec, '_key'):
                    continue
            except:
                continue
            CHATROOM_NAME, CHATROOM_MEMBERS = self._read_chatroom_hex(
                rec['_val'].Value)

            chatroom = model_im.Chatroom()
            chatroom.account_id = self.cur_account_id
            chatroom.chatroom_id = rec['_key'].Value
            chatroom.name = CHATROOM_NAME if CHATROOM_NAME else None
            chatroom.member_count = len(CHATROOM_MEMBERS)
            chatroom.creator_id = CHATROOM_MEMBERS[
                0] if CHATROOM_MEMBERS else None
            # chatroom.create_time  =
            chatroom.deleted = 1 if rec.IsDeleted else 0
            chatroom.source = self.cur_db_source

            for friend_id in CHATROOM_MEMBERS:
                if FRIEND_CHATROOMS.has_key(friend_id):
                    FRIEND_CHATROOMS[friend_id].add(chatroom.chatroom_id)
                else:
                    chatrooms = set()
                    chatrooms.add(chatroom.chatroom_id)
                    FRIEND_CHATROOMS[friend_id] = chatrooms
            try:
                CHATROOM_ID_NAME[chatroom.chatroom_id] = chatroom.name
            except:
                exc()
            try:
                chatroom.insert_db(self.im)
            except:
                exc()
        self.im.db_commit()
        return CHATROOM_ID_NAME, FRIEND_CHATROOMS
示例#16
0
 def get_groups_friends(self, node, account_id):
     db = SQLiteParser.Database.FromNode(node, canceller)
     if db is None:
         return
     if 'sessionTable' not in db.Tables:
         return
     tbs = SQLiteParser.TableSignature("sessionTable")
     for rec in db.ReadTableRecords(tbs, False):
         try:
             if canceller.IsCancellationRequested:
                 return
             # 群
             if "sessionType" in rec and rec["sessionType"].Value == 3:
                 group = model_im.Chatroom()
                 group.account_id = account_id
                 group.source = node.AbsolutePath
                 group.type = 1
                 if "sessionAvatar" in rec and (
                         not rec["sessionAvatar"].IsDBNull):
                     group.photo = rec["sessionAvatar"].Value
                 if "sessionName" in rec and (
                         not rec["sessionName"].IsDBNull):
                     group.name = rec["sessionName"].Value
                 if "sessionId" in rec and (not rec["sessionId"].IsDBNull):
                     group.chatroom_id = rec["sessionId"].Value
                 if group.chatroom_id and group.name:
                     self.group_list[group.chatroom_id] = group.name
                 if group.account_id and group.chatroom_id:
                     self.blued.db_insert_table_chatroom(group)
             # 好友
             elif "sessionType" in rec and rec["sessionType"].Value == 2:
                 friend = model_im.Friend()
                 friend.account_id = account_id
                 friend.source = node.AbsolutePath
                 friend.type = 1
                 if "sessionAvatar" in rec and (
                         not rec["sessionAvatar"].IsDBNull):
                     friend.photo = rec["sessionAvatar"].Value
                 if "sessionName" in rec and (
                         not rec["sessionName"].IsDBNull):
                     friend.nickname = rec["sessionName"].Value
                 if "sessionId" in rec and (not rec["sessionId"].IsDBNull):
                     friend.friend_id = rec["sessionId"].Value
                 if friend.friend_id and friend.nickname:
                     self.friend_list[friend.friend_id] = friend.nickname
                 if friend.account_id and friend.friend_id:
                     self.blued.db_insert_table_friend(friend)
         except Exception as e:
             pass
     self.blued.db_commit()
示例#17
0
 def get_chatroom(self, account_id):
     try:
         for g_id, g_name in self.group_info.items():
             chatroom = model_im.Chatroom()
             chatroom.account_id = account_id
             chatroom.chatroom_id = g_id
             chatroom.name = g_name
             chatroom.type = 1
             try:
                 self.bulletMessage.db_insert_table_chatroom(chatroom)
             except Exception as e:
                 pass
     except Exception as e:
         pass
     self.bulletMessage.db_commit()
示例#18
0
    def parse_Chatroom(self, table_name, CHATROOM_MEMBER_COUNT):
        ''' TIMConversationCoreInfoORM 

            FieldName	                    SQLType                   	
            belongingConversationIdentifier	    TEXT
            infoVersion	                        INTEGER
            name	                        TEXT
            desc	                        TEXT
            icon	                        TEXT
            notice	                        TEXT
            ext	                            TEXT
        '''
        CHATROOM_ID_NAME = {}
        for rec in self._read_table(table_name):
            try:
                if (rec['belongingConversationIdentifier'].Value
                        not in CHATROOM_MEMBER_COUNT or self._is_empty(
                            rec, 'belongingConversationIdentifier', 'name')
                        or self._is_duplicate(
                            rec, 'belongingConversationIdentifier')):
                    continue
                chatroom = model_im.Chatroom()
                chatroom.account_id = self.cur_account_id
                chatroom.chatroom_id = rec[
                    'belongingConversationIdentifier'].Value
                chatroom.name = rec['name'].Value
                chatroom.photo = rec['icon'].Value
                try:
                    chatroom.creator_id = json.loads(
                        rec['ext'].Value).get('a:s_name_operator')
                except:
                    pass
                chatroom.member_count = CHATROOM_MEMBER_COUNT.get(
                    chatroom.chatroom_id, None)
                chatroom.create_time = rec['infoVersion'].Value
                chatroom.deleted = 1 if rec.IsDeleted else 0
                chatroom.source = self.cur_db_source
                try:
                    CHATROOM_ID_NAME[chatroom.chatroom_id] = chatroom.name
                except:
                    exc()
                chatroom.insert_db(self.csm)
            except:
                exc()
        self.csm.db_commit()
        return CHATROOM_ID_NAME
示例#19
0
    def get_groups(self, node, account_id):
        groups_node = node.GetByPath("nim_cache.db")
        if groups_node is None:
            return
        try:
            conn = SqliteByCSharp(groups_node, self.cache)
            with conn as cmd:

                cmd.CommandText = '''
                    select id,name,creator,level,count,introduce,create_time,icon from team
                    '''
                reader = cmd.ExecuteReader()
                while reader.Read():
                    try:
                        chatroom_id = SqliteByCSharp.GetString(reader, 0)
                        name = SqliteByCSharp.GetString(reader, 1)
                        creator_id = SqliteByCSharp.GetString(reader, 2)
                        max_member_count = SqliteByCSharp.GetInt64(reader, 3)
                        member_count = SqliteByCSharp.GetInt64(reader, 4)
                        notice = SqliteByCSharp.GetString(reader, 5)
                        create_time = SqliteByCSharp.GetInt64(reader, 6)
                        photo = SqliteByCSharp.GetString(reader, 7)

                        self.group_list[chatroom_id] = name

                        chatroom = model_im.Chatroom()
                        chatroom.source = groups_node.AbsolutePath
                        chatroom.account_id = account_id
                        chatroom.chatroom_id = chatroom_id
                        chatroom.name = name
                        chatroom.creator_id = creator_id
                        chatroom.max_member_count = max_member_count
                        chatroom.member_count = member_count
                        chatroom.notice = notice
                        chatroom.photo = photo
                        chatroom.type = 1  # 普通群

                        if chatroom.account_id and chatroom.chatroom_id:
                            self.bulletMessage.db_insert_table_chatroom(
                                chatroom)
                    except Exception as e:
                        print(e)
        except Exception as e:
            print(e)
        self.bulletMessage.db_commit()
示例#20
0
    def _get_chatroom_table(self):
        chatroom_member = []
        with self.checking_col as db_col:
            sql = """SELECT nsp_data 
                    FROM {};""".format(self.table_name["conversations"])
            db_col.execute_sql(sql)
            while db_col.has_rest():
                try:
                    chatroom_info = json.loads(db_col.get_string(0))

                    chatroom = model_im.Chatroom()
                    chatroom.source = db_col.db_path
                    chatroom.account_id = self.using_account.account_id
                    chatroom.chatroom_id = chatroom_info["conv"]["id"].split(
                        ":", 1)[1]
                    if not chatroom.chatroom_id.endswith("@thread.skype"):
                        continue
                    if chatroom_info["conv"].get("_convProps", None):
                        chatroom.create_time = self.__convert_timestamp(
                            chatroom_info["conv"]["_convProps"].get(
                                "created", None))
                    if chatroom_info["conv"].get("_threadProps", None):
                        chatroom.member_count = int(
                            chatroom_info["conv"]["_threadProps"].get(
                                "membercount", 0))
                        chatroom.name = chatroom_info["conv"][
                            "_threadProps"].get("topic", None)
                        if chatroom_info["conv"]["_threadProps"].get(
                                "creator", None):
                            chatroom.creator_id = \
                                chatroom_info["conv"]["_threadProps"].get("creator", "").split(":", 1)[1]
                    # 获取成员并return 出去方便拿到chatroom_member表
                    if chatroom_info["conv"].get("_threadMembers", None):
                        for member in chatroom_info["conv"]["_threadMembers"]:
                            member["id"] = member["id"].split(":", 1)[1]
                            member["chatroom_id"] = chatroom.chatroom_id
                            chatroom_member.append(member)

                    self.model_im_col.db_insert_table_chatroom(chatroom)
                except Exception as e:
                    pass

            self.model_im_col.db_commit()
        return chatroom_member
示例#21
0
 def get_groups(self, node):
     try:
         results = []
         db = SQLiteParser.Database.FromNode(node, canceller)
         if db is None:
             return
         if 'QOCGroupDetail' not in db.Tables:
             return
         tbs = SQLiteParser.TableSignature("QOCGroupDetail")
         for rec in db.ReadTableRecords(tbs, self.extractDeleted, True):
             if canceller.IsCancellationRequested:
                 return
             try:
                 groups = model_im.Chatroom()
                 groups.source = node.AbsolutePath
                 groups.type = 1
                 if rec.Deleted == DeletedState.Deleted:
                     groups.deleted = 1
                 if "owner_id" in rec and (not rec["owner_id"].IsDBNull):
                     groups.account_id = rec["owner_id"].Value
                 if "session_id" in rec and (
                         not rec["session_id"].IsDBNull):
                     groups.chatroom_id = rec["session_id"].Value
                 if "title" in rec and (not rec["title"].IsDBNull):
                     groups.name = rec["title"].Value
                 if "members_num" in rec and (
                         not rec["members_num"].IsDBNull):
                     groups.member_count = rec["members_num"].Value
                 if "img_url" in rec and (not rec["img_url"].IsDBNull):
                     groups.photo = rec["img_url"].Value
                 if groups.account_id and groups.chatroom_id:
                     self.qunar_db.db_insert_table_chatroom(groups)
                     # resluts.append(groups)
             except Exception as e:
                 TraceService.Trace(TraceLevel.Info,
                                    "qunar(ios) get_groups record failed")
         # return results
     except Exception as e:
         TraceService.Trace(TraceLevel.Error,
                            "qunar(ios) get_groups failed")
         # return []
     self.qunar_db.db_commit()
示例#22
0
 def _get_chatroom_table(self):
     with self.icq_db_col as db_col:
         sql = """SELECT ICQ_CONTACT_DATA.PROFILE_ID,
                         ICQ_CONTACT_DATA.CONTACT_ID,
                         ICQ_CONTACT_DATA.NAME,
                         CHAT_INFO.ABOUT,
                         CHAT_INFO.MEMBERS_COUNT
                 FROM ICQ_CONTACT_DATA LEFT JOIN CHAT_INFO 
                 on ICQ_CONTACT_DATA.CHAT_INFO_ID = CHAT_INFO._id
                 where ICQ_CONTACT_DATA.CONTACT_ID like '%@%';"""
         db_col.execute_sql(sql)
         while db_col.has_rest():
             try:
                 chatroom = model_im.Chatroom()
                 chatroom.source = self.icq_data_path
                 chatroom.account_id = db_col.get_string(0)
                 chatroom.chatroom_id = db_col.get_string(1)
                 chatroom.name = db_col.get_string(2)
                 chatroom.description = db_col.get_string(3)
                 chatroom.member_count = db_col.get_int64(4)
                 self.model_im_col.db_insert_table_chatroom(chatroom)
             except Exception as e:
                 print("debug error", e)
         self.model_im_col.db_commit()
示例#23
0
    def _generate_chatroom_table(self):
        with self.cloud_p2p_col as db_col:
            sql = """SELECT v_groups_detail.name, 
                            v_groups_detail.desc, 
                            v_groups_detail.announce, 
                            v_groups_detail.type, 
                            v_groups_detail.ctime, 
                            v_groups_detail.create_uk, 
                            v_groups_detail.people_limit,
                            v_groups_detail.group_id, 
                            v_groups_detail.is_banded, 
                            count(v_groups_people.uk) 
                    FROM v_groups_detail left join v_groups_people 
                    on v_groups_detail.group_id = v_groups_people.group_id 
                    group by v_groups_detail.group_id;"""
            db_col.execute_sql(sql)
            while db_col.has_rest():
                try:
                    chatroom = model_im.Chatroom()

                    chatroom.chatroom_id = db_col.get_int64(7)
                    chatroom.account_id = self.using_account.account_id
                    chatroom.name = db_col.get_string(0)
                    chatroom.member_count = db_col.get_int64(9)
                    chatroom.max_member_count = db_col.get_int64(6)
                    chatroom.create_time = db_col.get_int64(4)
                    chatroom.creator_id = db_col.get_int64(5)
                    chatroom.source = db_col.db_path
                    chatroom.description = db_col.get_string(1)
                    chatroom.notice = db_col.get_string(2)

                    self.model_im_col.db_insert_table_chatroom(chatroom)
                except Exception as e:
                    pass

            self.model_im_col.db_commit()
示例#24
0
 def parse(self, aid):
     files = self.cache + '/{}.db'.format(aid)
     if not os.path.exists(self.cache + '/{}.db'.format(aid)):
         self.m_print('no sql file,parse exit!')
         return
     conn = sql.SQLiteConnection(
         'Data Source = {}; Readonly = True'.format(self.cache +
                                                    '/{}.db'.format(aid)))
     conn.Open()
     cmd = sql.SQLiteCommand(conn)
     cmd.CommandText = '''
         select iconMedia, nick, gender, city, mobile, real_name, dingtalkId, email, activeTime
         from tbuser where uid = {}
     '''.format(aid)
     reader = cmd.ExecuteReader()
     reader.Read()
     a = model_im.Account()
     a.account_id = aid
     a.nickname = GetString(reader, 1)
     if GetString(reader, 2) == 'F':
         a.gender = model_im.GENDER_FEMALE
     elif GetString(reader, 2) == 'M':
         a.gender = model_im.GENDER_MALE
     else:
         a.gender = model_im.GENDER_OTHER
     a.address = GetString(reader, 3)
     a.telephone = GetString(reader, 4)
     a.email = GetString(reader, 7)
     a.photo = GetString(reader, 0)
     self.im.db_insert_table_account(a)
     cmd.Dispose()
     cmd.CommandText = '''
         select uid, iconMedia, nick, gender, city, mobile, email, extensation from tbuser 
         where uid != {}
     '''.format(aid)
     reader = cmd.ExecuteReader()
     f_dict = dict()
     while reader.Read():
         f = model_im.Friend()
         f.account_id = aid
         f.friend_id = GetInt64(reader, 0)
         f.photo = GetString(reader, 1)
         gender = GetString(reader, 3)
         if gender == 'F':
             f.gender = model_im.GENDER_FEMALE
         elif gender == 'M':
             f.gender = model_im.GENDER_MALE
         else:
             f.gender = model_im.GENDER_OTHER
         f.nickname = Getstring(reader, 2)
         f.address = GetString(reader, 4)
         f.telephone = GetString(reader, 5)
         f.email = GetString(reader, 6)
         f.source = files
         ext = Getstring(reaser, 7)
         js = json.loads(ext)
         if js.get('ownness') is not None:
             f.signature = js.get('ownness')[0].get('status')
         #self.im.db_insert_table_friend(f)
         f_dict[f.friend_id] = f
     cmd.Dispose()
     # 暂时未加入分组信息
     cmd.CommandText = '''
         select uid, empName, orgName, depName from tb_user_intimacy
     '''
     reader = cmd.ExecuteReader()
     while reader.Read():
         try:
             #f = model_im.Friend()
             f_dict[GetInt64(reader, 0)].remark = GetString(reader, 2)
         except:
             continue
     for k in f_dict:
         self.im.db_insert_table_friend(f_dict[k])
     cmd.Dispose()
     cmd.CommandText = '''
         select tbdingcontent.content, tbdingcontent.dingId, tbdinglist.senderId,
          tbdinglist.dingCreatedAt, tbdinglist.latestComments 
         from tbdingcontent,tbdinglist where  tbdingcontent.dingId = tbdinglist.dingId
     '''
     reader = cmd.ExecuteReader()
     while reader.Read():
         feed = model_im.Feed()
         feed.account_id = aid
         feed.content = GetString(reader, 0)
         feed.sender_id = GetInt64(reader, 2)
         feed.send_time = GetInt64(reader, 3) / 1000
         feed.source = files
         string = GetString(reader, 4)
         if string is not '':
             js = json.loads(string)
             for a in js:
                 feed.comments += '{},'.format(a.get('commentId'))
                 fcm = model_im.FeedComment()
                 fcm.comment_id = a.get('commentId')
                 fcm.content = a.get('commentContent').get('text')
                 fcm.sender_id = a.get('senderId')
                 fcm.sender_name = a.get('commenter')
                 fcm.create_time = a.get('createdAt') / 1000
                 fcm.source = files
                 self.im.db_insert_table_feed_comment(fcm)
         self.im.db_insert_table_feed(feed)
     cmd.Dispose()
     conn.Close()
     self.im.db_commit()
     files = self.cache + '/{}_chat.db'.format(aid)
     if not os.path.exists(files):
         self.m_print('no chat sqlite file, parse exists!')
         return
     conn = sql.SQLiteConnection(
         'Data Source = {}; ReadOnly = True'.format(files))
     conn.Open()
     cmd = sql.SQLiteCommand(conn)
     cmd.CommandText('''
         select cid, title , createAt, ownerId, groupIcon from tbconversation where type = 2
     ''')
     reader = cmd.ExecuteReader()
     while reader.Read():
         g = model_im.Chatroom()
         g.account_id = aid
         g.chatroom_id = GetString(reader, 0)
         g.name = GetString(reader, 1)
         g.owner_id = GetInt64(reader, 3)
         g.create_time = GetInt64(reader, 2) / 1000
         g.source = files
         self.im.db_insert_table_chatroom(g)
     cmd.Dispose()
     cmd.CommandText = '''
         select tbl_name from sqlite_master where type = 'table' and tbl_name like 'tbmsg_%'
     '''
     reader = cmd.ExecuteReader()
     tbl_list = list()
     while reader.Read():
         tbl_list.append(GetString(reade, 0))
     cmd.Dispose()
     for tbl in tbl_list:
         cmd.CommandText = '''
             select cid, mid, senderId, createdAt, contentType, content from {}
         '''.format(tbl)
         reader = cmd.ExecuteReader()
         while reader.Read():
             msg = model_im.Message()
             msg.account_id = aid
             msg.msg_id = GetInt64(reader, 1)
             msg.talker_id = GetString(reader, 0)
             # talker_name?
             msg.sender_id = GetInt64(reader, 2)
             msg.is_sender = 1 if msg.sender_id == aid else 0
             msg.send_time = GetInt64(reader, 3) / 1000
             tp = GetInt64(reader, 4)
             string = GetString(reader, 5)
             if tp == 1:
                 msg.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                 js = json.loads(string)
                 msg.content = js.get('txt')
             elif tp == 2:
                 msg.type = model_im.MESSAGE_CONTENT_TYPE_IMAGE
                 js = json.loads(string)
                 msg.content = js.get('url')
             elif tp == 501 or tp == 503 or tp == 502:
                 msg.type = model_im.MESSAGE_CONTENT_TYPE_ATTACHMENT
                 msg.content = js.get('ext').get('f_name')
             elif tp == 901:  # redpakcet
                 #msg.type = model_im.message_content_type_
                 # pass
                 js = json.loads(string)
                 amount = js.get('ext').get('amount')
                 title = js.get('ext').get('congrats')
                 size = js.get('ext').get('size')
             elif tp == 203:  # picture...
                 msg.type = model_im.MESSAGE_CONTENT_TYPE_ATTACHMENT
                 js = json.loads(string)
                 msg.content = js.get('f_name')
             elif tp == 1200 or tp == 1203:
                 msg.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                 js = json.loads(string)
                 msg.content = js.get('markdown')
             elif tp == 300:
                 msg.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                 js = json.loads(string)
                 ext = js.get('multi')[0].get('ext')
                 js = json.loads(ext)
                 msg.content = js.get('b_tl')
             elif tp == 103:
                 msg.type = model_im.MESSAGE_CONTENT_TYPE_VIDEO
                 js = json.loads(string)
                 msg.content = js.get('url')
                 # msg.media_path = msg.content # ???
             elif tp == 1101:
                 msg.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                 msg.content = string
             elif tp == 3:
                 msg.type = model_im.MESSAGE_CONTENT_TYPE_VOICE
                 msg.content = json.loads(string).get('url')
             elif tp == 1600:
                 msg.type = model_im.MESSAGE_CONTENT_TYPE_SYSTEM
                 msg.content = json.loads(string).get('dingContent')
             else:
                 msg.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                 msg.content = string
             self.im.db_insert_table_message(msg)
         self.im.db_commit()
         cmd.Dispose()
         conn.Close()
示例#25
0
    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)
示例#26
0
    def get_contacts(self):
        if self.user is None:
            return

        subDbPath = self.root.GetByPath('/Documents/DB/' + self.user +
                                        '/subscribed.sqlite')
        subDb = SQLiteParser.Database.FromNode(subDbPath)
        if subDb is None:
            return

        if 'r_h_c_public_account_object' in subDb.Tables:
            ts = SQLiteParser.TableSignature('r_h_c_public_account_object')
            SQLiteParser.Tools.AddSignatureToTable(
                ts, "account_i_d", SQLiteParser.FieldType.Text,
                SQLiteParser.FieldConstraints.NotNull)
            for rec in subDb.ReadTableRecords(ts, self.extract_deleted):
                if canceller.IsCancellationRequested:
                    return

                friend = model_im.Friend()
                friend.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                friend.source = subDbPath.AbsolutePath
                friend.account_id = self.user
                friend.friend_id = str(rec['account_i_d'].Value)
                friend.nickname = rec['account_name'].Value
                friend.photo = rec['account_head_u_r_l'].Value
                friend.type = model_im.FRIEND_TYPE_SUBSCRIBE
                self.friends[friend.friend_id] = friend
                self.im.db_insert_table_friend(friend)

        infoDbPath = self.root.GetByPath('/Documents/DB/' + self.user +
                                         '/info.sqlite')
        infoDb = SQLiteParser.Database.FromNode(infoDbPath)
        if infoDb is None:
            return

        if 'r_s_chat_room_persistence_object' in infoDb.Tables:
            ts_1 = SQLiteParser.TableSignature(
                'r_s_chat_room_persistence_object')
            SQLiteParser.Tools.AddSignatureToTable(
                ts_1, "room_id", SQLiteParser.FieldType.Text,
                SQLiteParser.FieldConstraints.NotNull)
            for rec in infoDb.ReadTableRecords(ts_1, self.extract_deleted):
                if canceller.IsCancellationRequested:
                    return
                chatroom = model_im.Chatroom()
                chatroom.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                chatroom.source = infoDbPath.AbsolutePath
                chatroom.account_id = self.user
                chatroom.chatroom_id = str(rec['room_id'].Value)
                chatroom.name = rec['room_name'].Value
                chatroom.photo = rec['head_url'].Value
                if IsDBNull(chatroom.photo):
                    chatroom.photo = None
                self.chatrooms[chatroom.chatroom_id] = chatroom
                self.im.db_insert_table_chatroom(chatroom)

                chatroom_members = []
                if 'r_s_chat_member_persistence_object' in infoDb.Tables:
                    ts_2 = SQLiteParser.TableSignature(
                        'r_s_chat_member_persistence_object')
                    SQLiteParser.Tools.AddSignatureToTable(
                        ts_2, "user_id", SQLiteParser.FieldType.Text,
                        SQLiteParser.FieldConstraints.NotNull)
                    for rec in infoDb.ReadTableRecords(ts_2,
                                                       self.extract_deleted):
                        if canceller.IsCancellationRequested:
                            return
                        room_id = str(rec['room_id'].Value)
                        if room_id != chatroom.chatroom_id:
                            continue

                        chatroom_member = model_im.ChatroomMember()
                        chatroom_member.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                        chatroom_member.source = infoDbPath.AbsolutePath
                        chatroom_member.account_id = self.user
                        chatroom_member.chatroom_id = room_id
                        chatroom_member.member_id = rec['user_id'].Value
                        chatroom_member.display_name = rec['name'].Value
                        chatroom_member.photo = rec['head_url'].Value
                        chatroom_members.append(chatroom_member)
                        self.im.db_insert_table_chatroom_member(
                            chatroom_member)
                self.chatroom_members[chatroom.chatroom_id] = chatroom_members

            chatDbPath = self.root.GetByPath('/Documents/DB/' + self.user +
                                             '/chat.sqlite')
            chatDb = SQLiteParser.Database.FromNode(chatDbPath)
            if chatDb is None:
                return

            if 'r_s_chat_session' in chatDb.Tables:
                ts_1 = SQLiteParser.TableSignature('r_s_chat_session')
                SQLiteParser.Tools.AddSignatureToTable(
                    ts_1, "target_user_id", SQLiteParser.FieldType.Text,
                    SQLiteParser.FieldConstraints.NotNull)
                for rec in chatDb.ReadTableRecords(ts_1, self.extract_deleted):
                    if canceller.IsCancellationRequested:
                        return

                    friend = model_im.Friend()
                    friend.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                    friend.source = chatDbPath.AbsolutePath
                    friend.type = model_im.FRIEND_TYPE_FRIEND
                    friend.account_id = self.user
                    friend.friend_id = str(rec['target_user_id'].Value)
                    friend.nickname = rec['target_user_name'].Value

                    if 'r_n_chat_target_info' in infoDb.Tables:
                        ts_2 = SQLiteParser.TableSignature(
                            'r_n_chat_target_info')
                        SQLiteParser.Tools.AddSignatureToTable(
                            ts_2, "target_id", SQLiteParser.FieldType.Text,
                            SQLiteParser.FieldConstraints.NotNull)
                        for rec in infoDb.ReadTableRecords(
                                ts_2, self.extract_deleted):
                            id = str(rec['target_id'].Value)
                            if id != friend.friend_id:
                                continue
                            friend.photo = rec['target_head_url'].Value
                            if IsDBNull(friend.photo):
                                friend.photo = None
                    if friend.friend_id not in self.friends.keys(
                    ) and friend.friend_id not in self.chatrooms.keys():
                        self.friends[friend.friend_id] = friend
                    self.im.db_insert_table_friend(friend)
        self.im.db_commit()
示例#27
0
 def parse(self):
     if self.account is None:
         print('Get Account Id Failed, Parse Ret!')
         return False
     
     tg_node = self.root.GetByPath('Documents/tgdata.db')
     conn = sql.SQLiteConnection('Data Source = {}; Readonly=True'.format(tg_node.PathWithMountPoint))
     conn.Open()
     cmd = sql.SQLiteCommand(conn)
     cmd.CommandText = '''
     select uid, first_name, last_name, phone_number, photo_small, photo_medium, photo_big, last_seen, username from users_v29
     where uid = {}'''.format(self.account)
     reader = cmd.ExecuteReader()
     if reader.Read():
         a = model_im.Account()
         idx = 0
         a.account_id = GetInt64(reader, 0)
         a.nickname = GetString(reader, 2) + GetString(reader, 1)
         a.telephone = GetString(reader, 3)
         p = self.get_photo_from_id(GetString(reader, 6))
         if p is "":
             p = self.get_photo_from_id(GetString(reader, 5))
         if p is "":
             p = self.get_photo_from_id(GetString(reader, 4))
         a.photo = p
         a.username = GetString(reader, 8)
         self.im.db_insert_table_account(a)
     else:
         self.im.db_close()
         print("this is not the right group!")
         return False
     cmd.Dispose()
     cmd.CommandText = '''
     select uid, first_name, last_name, phone_number, photo_small, photo_medium, photo_big, username from users_v29
     where uid != {}
     '''.format(self.account)
     reader = cmd.ExecuteReader()
     while reader.Read():
         f = model_im.Friend()
         f.account_id = self.account
         f.friend_id = GetInt64(reader, 0)
         f.nickname = GetString(reader, 2) + GetString(reader, 1)
         f.telephone = GetString(reader, 3)
         p = self.get_photo_from_id(GetString(reader, 6))
         if p is "":
             p = self.get_photo_from_id(GetString(reader, 5))
         if p is "":
             p = self.get_photo_from_id(GetString(reader, 4))
         f.photo = p
         # user name?
         f.account_id = self.account
         self.im.db_insert_table_friend(f)
     cmd.Dispose()
     self.im.db_commit()
     # channels...
     cmd.CommandText = '''
         select cid, data from channel_conversations_v29
     '''
     reader = cmd.ExecuteReader()
     while reader.Read():
         g = model_im.Chatroom()
         g.account_id = self.account
         g.chatroom_id = GetInt64(reader, 0)
         blob = bytearray(GetBlob(reader, 1))
         decoder = TeleBlobDecoder(blob)
         decoder.decode_long_for_ckey('i') # cid
         decoder.decode_long_for_ckey('ah') # acess hash
         decoder.decode_int_for_ckey('dv')
         decoder.decode_int_for_ckey('kind')
         decoder.decode_int_for_ckey('pts')
         decoder.decode_bytes_for_ckey('vsort', 9)
         decoder.decode_bytes_for_ckey('isort', 9)
         decoder.decode_bytes_for_ckey('usort', 9)
         decoder.decode_int_for_ckey('mread')
         decoder.decode_int_for_ckey('moutread')
         decoder.decode_int_for_ckey('mknown')
         decoder.decode_int_for_ckey('mlr')
         decoder.decode_int_for_ckey('mrd')
         decoder.decode_int_for_ckey('mrod')
         about = decoder.decode_string_for_ckey('about')
         g.description = about
         decoder.decode_string_for_ckey('username')
         decoder.decode_int_for_ckey('out')
         decoder.decode_int_for_ckey('unr')
         decoder.decode_int_for_ckey('der')
         decoder.decode_int_for_ckey('ds')
         decoder.decode_int_for_ckey('date')
         decoder.decode_int_for_ckey('from')
         decoder.decode_string_for_ckey('text')
         decoder.decode_data_for_ckey('media') # note that...
         decoder.decode_int_for_ckey('ucount')
         decoder.decode_int_for_ckey('sucount')
         g.name = decoder.decode_string_for_ckey('ct') # nick name
         ps = self.get_photo_from_id(decoder.decode_string_for_ckey('cp.s')) # photo small
         pm = self.get_photo_from_id(decoder.decode_string_for_ckey('cp.m')) # photo medium
         pb = self.get_photo_from_id(decoder.decode_string_for_ckey('cp.l')) # photo big
         if pb is not "":
             g.photo = pb
         elif pm is not "":
             g.photo = pm
         else:
             g.photo = ps
         decoder.decode_int_for_ckey('ver')
         decoder.decode_int_for_ckey('adm')
         decoder.decode_int_for_ckey('role')
         decoder.decode_int_for_ckey('ro')
         decoder.decode_long_for_ckey('flags')
         decoder.decode_int_for_ckey('lef')
         decoder.decode_int_for_ckey('kk')
         decoder.decode_int_for_ckey('mtci')
         decoder.decode_long_for_ckey('mtch')
         decoder.decode_string_for_ckey('rr')
         decoder.decode_int_for_ckey('pmi')
         decoder.decode_int_for_ckey('ccd')
         decoder.decode_int_for_ckey('pdt')
         self.im.db_insert_table_chatroom(g)
     cmd.Dispose()
     # Friend messages
     # 稳的一笔 C37R
     cmd.CommandText = '''
         select mid, cid, message, media, from_id, to_id,  outgoing, date from messages_v29
     '''
     reader = cmd.ExecuteReader()
     while reader.Read():
         m = model_im.Message()
         m.talker_type = model_im.CHAT_TYPE_FRIEND
         m.account_id = self.account
         m.msg_id = GetInt64(reader, 0)
         m.is_sender = GetInt64(reader, 6)
         m.content = GetString(reader, 2)
         m.sender_id = GetInt64(reader, 4)
         m.talker_id = GetInt64(reader, 5) if m.is_sender == 1 else m.sender_id
         m.send_time = GetInt64(reader, 7)
         # parse media.... excited.
         try:
             blob = bytearray(GetBlob(reader, 3))
             if blob is None or len(blob) == 0:
                 pass
             else:
                 self.parse_media_attachments(blob, m)
         except Exception as e:
             print(e)
         if m.content == '' or m.content is None:
             continue
         self.im.db_insert_table_message(m)
     self.im.db_commit()
     cmd.Dispose()
     cmd.CommandText = '''
         select cid, data, mid from channel_messages_v29
     '''
     reader = cmd.ExecuteReader()
     while reader.Read():
         m = model_im.Message()
         m.talker_type = model_im.CHAT_TYPE_GROUP
         m.account_id = self.account
         m.talker_id = GetInt64(reader, 0)
         bts = GetBlob(reader, 1)
         m.msg_id = GetInt64(reader, 2)
         decoder = TeleBlobDecoder(bts)
         decoder.decode_int_for_ckey('i')
         decoder.decode_bytes_for_ckey('sk', 17)
         decoder.decode_int_for_ckey('pts')
         decoder.decode_int_for_ckey('unr')
         decoder.decode_int_for_ckey('out')
         decoder.decode_int_for_ckey('ds')
         m.sender_id = decoder.decode_long_for_ckey('fi')
         to_id = decoder.decode_long_for_ckey('ti')
         cid = decoder.decode_long_for_ckey('ci')
         m.content = decoder.decode_string_for_ckey('t')
         m.send_time = decoder.decode_int_for_ckey('d')
         medias = decoder.decode_data_for_ckey('md')
         try:
             if len(medias) == 0 or medias is None:
                 pass
             else:
                 self.parse_media_attachments(medias, m)
         except Exception as e:
             print(e)
         decoder.decode_int_for_ckey('rd')
         decoder.decode_long_for_ckey('ri')
         decoder.decode_int_for_ckey('lt')
         decoder.decode_long_for_ckey('f')
         decoder.decode_int_for_ckey('sqi')
         decoder.decode_int_for_ckey('sqo')
         if m.content is '' or m.content is None:
             continue
         self.im.db_insert_table_message(m)
     self.im.db_commit()
     return True
示例#28
0
    def get_groups(self):
        if self.read_file_path():
            conn = System.Data.SQLite.SQLiteConnection(
                "Data Source = {0}; ReadOnly = True".format(
                    self.source_path.PathWithMountPoint))
        else:
            conn = System.Data.SQLite.SQLiteConnection(
                "Data Source = {0}".format(self.dest_path))
        try:
            conn.Open()
            cmd = System.Data.SQLite.SQLiteCommand(conn)
            cmd.CommandText = '''
                select key_remote_jid,count(jid) as count from chat_list left join group_participants 
                where chat_list.key_remote_jid = group_participants.gjid and subject is not null group by key_remote_jid
            '''
            reader = cmd.ExecuteReader()
            dicts = {}
            while reader.Read():
                group_id = GetString(reader, 0)
                group_count = GetInt64(reader, 1)
                dicts[group_id] = group_count

            cmd.Dispose()
            cmd.CommandText = """
                select key_remote_jid as group_id , subject as title, sort_timestamp as create_time, jid as member_id , admin from chat_list left join 
                group_participants where chat_list.key_remote_jid = group_participants.gjid and admin = 2
            """
            reader = cmd.ExecuteReader()
            while reader.Read():
                if canceller.IsCancellationRequested:
                    return
                chatroom = model_im.Chatroom()
                chatroom.source = self.source_path.AbsolutePath
                chatroom.account_id = self.account_id
                chatroom.chatroom_id = GetString(reader, 0)
                chatroom.name = GetString(reader, 1)
                chatroom.create_time = int(str(GetInt64(reader, 2))[:-3])
                create_person = GetString(reader, 0)[:13] + "@s.whatsapp.net"
                chatroom.creator_id = create_person
                if GetString(reader, 3):
                    chatroom.owner_id = GetString(reader, 3)
                else:
                    chatroom.owner_id = self.account_id
                chatroom.member_count = dicts.get(GetString(reader, 0))
                chatroom.type = 1
                try:
                    self.whatsapp.db_insert_table_chatroom(chatroom)
                except Exception as e:
                    pass

            cmd.Dispose()
            # 找出创建失败的群
            cmd.CommandText = '''
                select key_remote_jid,sort_timestamp from chat_list where subject is null and last_read_message_table_id is null
            '''
            # chatroom_fail = model_im.Chatroom()
            reader_fail = cmd.ExecuteReader()
            while reader_fail.Read():
                chatroom_fail = model_im.Chatroom()
                chatroom_fail.source = self.source_path.AbsolutePath
                chatroom_fail.chatroom_id = GetString(reader_fail, 0)
                chatroom_fail.account_id = self.account_id
                chatroom_fail.create_time = int(
                    str(GetInt64(reader_fail, 1))[:-3])
                create_person_fail = GetString(reader_fail,
                                               0)[:13] + "@s.whatsapp.net"
                chatroom_fail.creator_id = create_person_fail
                chatroom_fail.owner_id = create_person_fail
                chatroom_fail.member_count = 1
                chatroom_fail.type = 2  # 临时群
                groups_id = GetString(reader_fail, 0)
                start_index = groups_id.find("-")
                end_index = groups_id.find("@")
                name = groups_id[start_index + 1:end_index]
                self.groups_dicts[groups_id] = name
                chatroom_fail.name = name
                try:
                    self.whatsapp.db_insert_table_chatroom(chatroom_fail)
                except Exception as e:
                    pass
        except Exception as e:
            pass
        if conn != None:
            conn.Close()
        self.whatsapp.db_commit()
示例#29
0
    def get_contacts(self):
        dbPath = self.root.GetByPath(self.user_id + '/main.db')
        db = SQLiteParser.Database.FromNode(dbPath)
        if db is None:
            return

        if 'yixin_contact' in db.Tables:
            ts = SQLiteParser.TableSignature('yixin_contact')
            SQLiteParser.Tools.AddSignatureToTable(
                ts, "uid", SQLiteParser.FieldType.Text,
                SQLiteParser.FieldConstraints.NotNull)
            for rec in db.ReadTableRecords(ts, self.extract_deleted):
                _id = rec['uid'].Value
                if _id in self.friends:
                    continue

                friend = model_im.Friend()
                friend.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                friend.source = 'YiXin'
                friend.account_id = self.user_id
                friend.friend_id = _id
                friend.nickname = rec['nickname'].Value
                friend.photo = rec['photourl'].Value
                friend.gender = 2 if rec['gender'].Value == 0 else 1
                friend.signature = rec['signature'].Value
                friend.email = rec['email'].Value
                friend.address = rec['address'].Value
                friend.type = model_im.FRIEND_TYPE_FRIEND
                self.friends[_id] = friend
                if 'buddylist' in db.Tables:
                    ts = SQLiteParser.TableSignature('buddylist')
                    SQLiteParser.Tools.AddSignatureToTable(
                        ts, "uid", SQLiteParser.FieldType.Text,
                        SQLiteParser.FieldConstraints.NotNull)
                    for rec in db.ReadTableRecords(ts, self.extract_deleted):
                        if friend.friend_id != rec['uid']:
                            continue
                        friend.remark = rec['alias'].Value
                self.csm.db_insert_table_friend(friend)

        if 'tinfo' in db.Tables:
            ts = SQLiteParser.TableSignature('tinfo')
            SQLiteParser.Tools.AddSignatureToTable(
                ts, "tid", SQLiteParser.FieldType.Text,
                SQLiteParser.FieldConstraints.NotNull)
            for rec in db.ReadTableRecords(ts, self.extract_deleted):
                _id = rec['tid'].Value
                if _id in self.chatrooms:
                    continue

                chatroom = model_im.Chatroom()
                chatroom.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                chatroom.source = 'YiXin'
                chatroom.account_id = self.user_id
                chatroom.chatroom_id = _id
                chatroom.name = rec['defaultname'].Value
                chatroom.creator_id = rec['creator'].Value
                chatroom.photo = rec['photo'].Value
                chatroom.member_count = rec['membercount'].Value
                chatroom.type = model_im.CHATROOM_TYPE_NORMAL
                self.chatrooms[_id] = chatroom
                self.csm.db_insert_table_chatroom(chatroom)

                if 'tuser' in db.Tables:
                    ts = SQLiteParser.TableSignature('tuser')
                    SQLiteParser.Tools.AddSignatureToTable(
                        ts, "tid", SQLiteParser.FieldType.Text,
                        SQLiteParser.FieldConstraints.NotNull)
                    for rec in db.ReadTableRecords(ts, self.extract_deleted):
                        room_id = rec['tid'].Value
                        if chatroom.chatroom_id != room_id:
                            continue

                        chatroom_member = model_im.ChatroomMember()
                        chatroom_member.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                        chatroom_member.source = 'YiXin'
                        chatroom_member.account_id = self.user_id
                        chatroom_member.chatroom_id = room_id
                        chatroom_member.member_id = rec['uid'].Value
                        friend = self.friends.get(chatroom_member.member_id)
                        if friend is not None:
                            chatroom_member.display_name = friend.nickname
                            chatroom_member.email = friend.email
                            chatroom_member.gender = friend.gender
                            chatroom_member.address = friend.address
                            chatroom_member.signature = friend.signature
                            chatroom_member.photo = friend.photo
                        self.csm.db_insert_table_chatroom_member(
                            chatroom_member)

        if 'painfo' in db.Tables:
            ts = SQLiteParser.TableSignature('painfo')
            SQLiteParser.Tools.AddSignatureToTable(
                ts, "uid", SQLiteParser.FieldType.Text,
                SQLiteParser.FieldConstraints.NotNull)
            for rec in db.ReadTableRecords(ts, self.extract_deleted):
                _id = rec['uid'].Value
                if _id in self.friends:
                    continue

                friend = model_im.Friend()
                friend.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                friend.source = 'YiXin'
                friend.account_id = self.user_id
                friend.friend_id = _id
                friend.nickname = rec['nickname'].Value
                friend.photo = rec['photourl'].Value
                friend.gender = rec['gender'].Value
                friend.signature = rec['signature'].Value
                friend.type = model_im.FRIEND_TYPE_FOLLOW
                self.friends[friend.friend_id] = friend
                self.csm.db_insert_table_friend(friend)
        self.csm.db_commit()
示例#30
0
 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)