Exemple #1
0
 def decode_recover_chatroom_member(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 = 'channel_users_v2'
     ts = SQLiteParser.TableSignature(table)
     for rec in db.ReadTableDeletedRecords(ts, False):
         if canceller.IsCancellationRequested:
             return
         try:
             chatroom_member = model_im.ChatroomMember()
             chatroom_member.account_id = self.account
             chatroom_member.source = self.root.GetByPath(
                 self.account_db_path).PathWithMountPoint
             chatroom_member.chatroom_id = rec['did'].Value
             chatroom_member.member_id = rec['uid'].Value
             chatroom_member_data = rec['data'].Value
             chatroom_member.deleted = 1
             if chatroom_member_data:
                 user_info = TelegramDecodeHelper.decode_user(
                     chatroom_member_data)
                 if user_info:
                     if user_info.deleted is False:
                         chatroom_member.deleted = 0
                     chatroom_member.telephone = user_info.phone
                     first_name = user_info.first_name if user_info.first_name else ""
                     last_name = user_info.last_name if user_info.last_name else ""
                     chatroom_member.display_name = first_name + " " + last_name
             self.model_col.db_insert_table_chatroom_member(chatroom_member)
         except Exception as e:
             print("error happen", e)
     self.model_col.db_commit()
Exemple #2
0
    def _generate_chatroom_member_table(self, member_list):
        for member in member_list:
            try:
                member_id = member["id"]
                chatroom_id = member["chatroom_id"]
                serialized_info = self.__query_account_info(member_id)
                if not serialized_info:
                    continue
                account_info = json.loads(serialized_info)

                chatroom_member = model_im.ChatroomMember()
                chatroom_member.chatroom_id = chatroom_id
                chatroom_member.member_id = member_id
                chatroom_member.account_id = self.using_account.account_id
                chatroom_member.photo = account_info.get("thumbUrl", None)
                if account_info.get("city") or account_info.get("country"):
                    chatroom_member.address = account_info.get("city", "") + " " + account_info.get("country", "")
                chatroom_member.telephone = self.__choose_phone_number(account_info.get("phones", []))
                chatroom_member.gender = self.__convert_gender(account_info.get("gender", 0))
                chatroom_member.birthday = self._handle_birthday(account_info.get("birthday", None))
                chatroom_member.signature = account_info.get("mood", None)
                chatroom_member.display_name = account_info.get("displayNameOverride", None)
                chatroom_member.source = self.checking_col.db_path
                self.model_im_col.db_insert_table_chatroom_member(chatroom_member)
            except Exception as e:
                pass
        self.model_im_col.db_commit()
    def _generate_chatroom_member_table(self):
        with self.cloud_p2p_col as db_col:
            sql = """SELECT uk, 
                            group_id, 
                            name, 
                            avatar_url, 
                            ctime, 
                            role 
                    FROM v_groups_people;"""
            db_col.execute_sql(sql)
            while db_col.has_rest():
                try:
                    chatroom_member = model_im.ChatroomMember()

                    chatroom_member.chatroom_id = db_col.get_string(1)
                    chatroom_member.account_id = self.using_account.account_id
                    chatroom_member.source = db_col.db_path
                    chatroom_member.display_name = db_col.get_string(2)
                    chatroom_member.photo = db_col.get_string(3)
                    chatroom_member.member_id = db_col.get_int64(0)

                    self.model_im_col.db_insert_table_chatroom_member(chatroom_member)
                except Exception as e:
                    pass
            self.model_im_col.db_commit()
Exemple #4
0
 def _get_chatroom_member(self):
     conn = self.__get_con()
     conn.Open()
     cmd = System.Data.SQLite.SQLiteCommand(conn)
     cmd.CommandText = """select channel_users_v2.did,
                                 channel_users_v2.uid,
                                 channel_users_v2.date,
                                 channel_users_v2.data,
                                 users.data
                         from channel_users_v2 left join users on abs(channel_users_v2.uid) = abs(users.uid)"""
     reader = cmd.ExecuteReader()
     while reader.Read():
         try:
             chatroom_member = model_im.ChatroomMember()
             chatroom_member.account_id = self.account
             chatroom_member.chatroom_id = GetInt64(reader, 0)
             chatroom_member.member_id = GetInt64(reader, 1)
             chatroom_member.source = self.root.GetByPath(
                 self.account_db_path).PathWithMountPoint
             user_info = TelegramDecodeHelper.decode_user(GetBlob(
                 reader, 4))
             if user_info:
                 chatroom_member.deleted = 0 if user_info.deleted is False else 1
                 chatroom_member.telephone = user_info.phone
                 first_name = user_info.first_name if user_info.first_name else ""
                 last_name = user_info.last_name if user_info.last_name else ""
                 chatroom_member.display_name = first_name + " " + last_name
             self.model_col.db_insert_table_chatroom_member(chatroom_member)
         except Exception as e:
             print(e)
     cmd.Dispose()
     reader.Close()
     conn.Close()
     self.model_col.db_commit()
    def decode_recover_chatroom_member(self):
        if not self.c_recover_helper.is_valid():
            return
        ts = self.c_recover_helper.fetch_table("groups_people", {
            "role": "Int",
            "ctime": "Int",
            "uk": "Int",
            "group_id": "Int",
        })
        for rec in self.c_recover_helper.read_deleted_record(ts):
            if canceller.IsCancellationRequested:
                return
            try:

                m = model_im.ChatroomMember()
                m.deleted = 1
                m.source = self.c_recover_helper.db_path
                m.account_id = self.using_account.account_id
                m.chatroom_id = rec['group_id'].Value
                m.member_id = rec['uk'].Value

                self.model_im_col.db_insert_table_chatroom_member(m)
            except Exception as e:
                pass
        self.model_im_col.db_commit()
    def get_groups_member(self, node, account_id):
        g_node = node.GetByPath("nim_cache.db")
        if g_node is None:
            return
        try:
            conn = SqliteByCSharp(g_node, self.cache)
            with conn as cmd:

                cmd.CommandText = '''
                    select tid, account, nick, join_time from tuser
                    '''
                reader = cmd.ExecuteReader()
                while reader.Read():
                    try:
                        chatroom_id = SqliteByCSharp.GetString(reader, 0)
                        memeber_id = SqliteByCSharp.GetString(reader, 1)
                        display_name = SqliteByCSharp.GetString(reader, 2)

                        member = model_im.ChatroomMember()
                        member.source = g_node.AbsolutePath
                        member.account_id = account_id
                        member.chatroom_id = chatroom_id
                        member.member_id = memeber_id
                        member.display_name = display_name

                        if member.account_id and member.chatroom_id and member.member_id:
                            self.bulletMessage.db_insert_table_chatroom_member(
                                member)
                    except Exception as e:
                        pass
        except Exception as e:
            pass
        self.bulletMessage.db_commit()
Exemple #7
0
    def parse_ChatroomMember(self, friend_list, DEL_FRIEND_PK_CHATROOM_MID,
                             MEMBER_PK_CHATROOM_PKS, CHATROOM_PK_MID):
        ''' account_id+'/Messages/Line.sqlite', 'ZGROUP'

            :type friend: model_im.Friend()
            :type chatroom_mid: group mid
        '''
        '''
            'Z_4MEMBERS' Z_4GROUPS 
                        
            RecNo	FieldName	SQLType	Size
            1	Z_4GROUPS	    INTEGER
            2	Z_12MEMBERS1	    INTEGER
            
            self.chatroom_id  = None  # 群ID[TEXT]
            self.member_id    = None  # 成员ID[TEXT]
            self.display_name = None  # 群内显示名称[TEX
            self.photo     = None  # 头像[TEXT]
            self.telephone = None  # 电话[TEXT]
            self.email     = None  # 电子邮箱[TEXT]
            self.gender    = GENDER_NONE  # 性别[INT]
            self.age       = None  # 年龄[INT]
            self.address   = None  # 地址[TEXT]
            self.birthday  = None  # 生日[TEXT]
            self.signature = None  # 签名[TEXT]
        '''
        for friend_pk, friend in friend_list.iteritems():
            # M2M,  friend chatroom
            for chatroom_pk in MEMBER_PK_CHATROOM_PKS.get(friend_pk, [False]):
                try:
                    if chatroom_pk:
                        chatroom_mid = CHATROOM_PK_MID.get(chatroom_pk, None)
                    # 如果 chatroom_pk 不在 群与群成员关系表里, 则说明是 退出的群
                    # 需要根据 ZCHAT, 即 ZCHAT 表的 pk, 关联 群id(ZMID)
                    else:  # pk 2 mid
                        chatroom_mid = DEL_FRIEND_PK_CHATROOM_MID.get(
                            friend_pk, None)
                    if not chatroom_mid:
                        continue
                    cm = model_im.ChatroomMember()
                    cm.account_id = friend.account_id  # 账户ID[TEXT]
                    if chatroom_mid and chatroom_mid.startswith('c'):
                        cm.chatroom_id = chatroom_mid
                    cm.member_id = friend.friend_id  # 成员ID[TEXT]
                    cm.display_name = friend.remark if friend.remark else friend.nickname  # 群内显示名称[TEXT]
                    cm.photo = friend.photo  # 头像[TEXT]
                    cm.telephone = friend.telephone
                    cm.email = friend.email
                    cm.gender = friend.gender
                    cm.age = friend.age
                    cm.address = friend.address
                    cm.birthday = friend.birthday
                    cm.signature = friend.signature
                    cm.deleted = friend.deleted
                    cm.source = friend.source
                    cm.insert_db(self.csm)
                except:
                    exc()
Exemple #8
0
    def _get_chatroom_member_table(self):
        for chatroom_member_info in self.__query_chatroom_list():
            member_id = chatroom_member_info["member_id"]
            account_id = chatroom_member_info["account_id"]
            conversation_id = chatroom_member_info["conversation_id"]
            display_name = self.__query_member_name(member_id)

            if not all((member_id, account_id, conversation_id)):
                continue

            chatroom_member = model_im.ChatroomMember()
            chatroom_member.member_id = member_id
            chatroom_member.display_name = display_name
            chatroom_member.account_id = account_id
            chatroom_member.chatroom_id = conversation_id
            self.model_im_col.db_insert_table_chatroom_member(chatroom_member)
        self.model_im_col.db_commit()
Exemple #9
0
 def parse_chatroom_member(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)
     fs = self.node.FileSystem
     try:
         if self.db is None:
             return
         db_cmd.CommandText = '''select distinct a._id, a.date, a.participant_id_1, b.number, b.display_name, a.participant_id_2, c.number, c.display_name, 
         a.participant_id_3, d.number, d.display_name, a.participant_id_4, e.number, e.display_name, a.name from conversations as a 
         left join participants_info as b on a.participant_id_1 = b._id left join participants_info as c on a.participant_id_2 = c._id
         left join participants_info as d on a.participant_id_3 = d._id left join participants_info as e on a.participant_id_4 = e._id where conversation_type = 1'''
         sr = db_cmd.ExecuteReader()
         while (sr.Read()):
             try:
                 if canceller.IsCancellationRequested:
                     break
                 tags = [2, 5, 8, 11]
                 for tag in tags:
                     if IsDBNull(sr[tag]) or sr[tag] == 0:
                         break
                     chatroom_member = model_im.ChatroomMember()
                     chatroom_member.account_id = self.account_id
                     chatroom_member.chatroom_id = self._db_reader_get_int_value(sr, 0)
                     chatroom_member.deleted = deleteFlag
                     chatroom_member.display_name = self._db_reader_get_string_value(sr, tag+2)
                     chatroom_member.member_id = self._db_reader_get_int_value(sr, tag)
                     chatroom_member.source = self.node.AbsolutePath
                     chatroom_member.telephone = self._db_reader_get_string_value(sr, tag+1)
                     self.db_insert_table_chatroom_member(chatroom_member)
             except:
                 traceback.print_exc()
         sr.Close()
         if deleteFlag is 0: 
             self.db_commit()
         db_cmd.Dispose()
         db.Close()
     except Exception as e:
         print(e)
Exemple #10
0
 def get_group_member(self, node, account_id):
     try:
         # results = []
         db = SQLiteParser.Database.FromNode(node, canceller)
         if db is None:
             return
         if 'QOCGroupMember' not in db.Tables:
             return
         tbs = SQLiteParser.TableSignature("QOCGroupMember")
         for rec in db.ReadTableRecords(tbs, self.extractDeleted, True):
             if canceller.IsCancellationRequested:
                 return
             try:
                 groups_member = model_im.ChatroomMember()
                 groups_member.account_id = account_id
                 groups_member.source = node.AbsolutePath
                 if rec.Deleted == DeletedState.Deleted:
                     groups_member.deleted = 1
                 if "group_id" in rec and (not rec["group_id"].IsDBNull):
                     groups_member.chatroom_id = rec["group_id"].Value
                 if "friend_id" in rec and (not rec["friend_id"].IsDBNull):
                     groups_member.member_id = rec["friend_id"].Value
                     if self.account_list:
                         # 根据之前得到的account赋值
                         for account in self.account_list:
                             if account.account_id == rec[
                                     "friend_id"].Value:
                                 groups_member.display_name = account.nickname
                                 groups_member.photo = account.photo
                 if groups_member.chatroom_id and groups_member.member_id:
                     self.qunar_db.db_insert_table_chatroom_member(
                         groups_member)
                     # results.append(groups_member)
             except Exception as e:
                 print(e)
                 # TraceService.Trace(TraceLevel.Info,"qunar(ios) get_group_member record failed")
         # return results
     except Exception as e:
         print(e)
         # TraceService.Trace(TraceLevel.Error,"qunar(ios) get_group_member failed")
         # return []
     self.qunar_db.db_commit()
Exemple #11
0
 def parse_chatroom_member(self, dbPath):
     '''解析群组成员数据'''
     db = SQLite.SQLiteConnection(
         'Data Source = {}; ReadOnly = True'.format(dbPath))
     db.Open()
     db_cmd = SQLite.SQLiteCommand(db)
     try:
         if self.db is None:
             return
         db_cmd.CommandText = '''select a.discussionid, a.memberid, b.birthday, b.gender, b.name, b.signature, a.deleted from bb_discussion_member_info as a 
             left join bb_user_info as b on a.memberid = b.userid'''
         sr = db_cmd.ExecuteReader()
         while (sr.Read()):
             try:
                 chatroom_member = model_im.ChatroomMember()
                 if canceller.IsCancellationRequested:
                     break
                 chatroom_member.account_id = self.account_id
                 chatroom_member.chatroom_id = self._db_reader_get_int_value(
                     sr, 0)
                 chatroom_member.deleted = self._db_reader_get_int_value(
                     sr, 6)
                 chatroom_member.display_name = self._db_reader_get_string_value(
                     sr, 4)
                 chatroom_member.member_id = self._db_reader_get_int_value(
                     sr, 1)
                 chatroom_member.source = self.node.AbsolutePath
                 chatroom_member.birthday = self._db_reader_get_int_value(
                     sr, 2)
                 chatroom_member.gender = self._db_reader_get_int_value(
                     sr, 3)
                 chatroom_member.signature = self._db_reader_get_string_value(
                     sr, 5)
                 self.db_insert_table_chatroom_member(chatroom_member)
             except:
                 traceback.print_exc()
         sr.Close()
         self.db_commit()
         db_cmd.Dispose()
         db.Close()
     except Exception as e:
         print(e)
Exemple #12
0
 def parse_message(self):
     '''解析消息数据'''
     fs = self.node.FileSystem
     try:
         db = SQLiteParser.Database.FromNode(self.node, canceller)
         if db is None:
             return
         ts = SQLiteParser.TableSignature('tb_personal_message')
         for rec in db.ReadTableRecords(ts, self.extractDeleted, True):
             try:
                 message = model_im.Message()
                 if canceller.IsCancellationRequested:
                     break
                 message.account_id = self.account_id
                 message.deleted = rec.IsDeleted
                 message.send_time = self._get_timestamp(
                     self._db_record_get_int_value(rec, 'timestamp'))
                 message.talker_id = self._db_record_get_int_value(
                     rec, 'f_uid')
                 if not 'content' in rec or IsDBNull(rec['content'].Value):
                     continue
                 content = json.loads(rec['content'].Value)
                 if 'user' in content.keys():
                     userinfo = content['user']
                     userid = userinfo[
                         'userid'] if 'userid' in userinfo.keys() else None
                     nickname = userinfo[
                         'nickname'] if 'nickname' in userinfo.keys(
                         ) else ''
                     message.talker_name = nickname
                     # birthday = userinfo['birthday'] if 'birthday' in userinfo.keys() else 0
                     # gender = userinfo['gender'] if 'gender' in userinfo.keys() else 0
                     # lng = userinfo['lng'] if 'lng' in userinfo.keys() else 0
                     # note = userinfo['notes'] if 'notes' in userinfo.keys() else ''
                     # age = userinfo['age']  if 'age' in userinfo.keys() else 0
                     # icon = userinfo['icon'] if 'icon' in userinfo.keys() else None
                     # lat = userinfo['lat'] if 'lat' in userinfo.keys() else 0
                 sendtype = self._db_record_get_int_value(rec, 'sendtype')
                 message.sender_id = self._db_record_get_int_value(
                     rec, 'f_uid'
                 ) if sendtype == 2 else self.account_id if sendtype == 1 else 0
                 message.sender_name = message.talker_name if sendtype == 2 else self.account_name if sendtype == 1 else ''
                 message.is_sender = 1 if sendtype == 1 else 0
                 message.msgid = self._db_record_get_int_value(
                     rec, 'server_id')
                 message.talker_type = model_im.CHAT_TYPE_FRIEND
                 msgtype = self._db_record_get_int_value(
                     rec, 'message_type')
                 if msgtype == 1:  #普通文本
                     message.content = content[
                         'content'] if 'content' in content.keys() else ''
                     message.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                 elif msgtype == 2:  #jpg
                     message.media_path = content['attachment'].replace(
                         '\\',
                         '') if 'attachment' in content.keys() else None
                     message.type = model_im.MESSAGE_CONTENT_TYPE_IMAGE
                 elif msgtype == 3:  #mp3
                     media_name = content['attachment'].replace(
                         '\\',
                         '') if 'attachment' in content.keys() else None
                     message.type = model_im.MESSAGE_CONTENT_TYPE_VOICE
                     if media_name is not None:
                         pardir = os.path.basename(
                             os.path.dirname(media_name))
                         filename = os.path.basename(media_name)
                         nodes = fs.Search('/' + os.path.join(
                             pardir, filename).replace('\\', '/') + '$')
                         if nodes is None:
                             message.content = '音频消息:' + filename
                             message.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                         for node in nodes:
                             message.media_path = node.AbsolutePath
                             break
                 elif msgtype == 4:  #3gp
                     message.media_path = content['attachment'].replace(
                         '\\',
                         '') if 'attachment' in content.keys() else None
                     message.type = model_im.MESSAGE_CONTENT_TYPE_VIDEO
                 elif msgtype == 5:  #地理位置
                     location = model_im.Location()
                     loc = content[
                         'attachment'] if 'attachment' in content.keys(
                         ) else None
                     if loc is not None:
                         loc = loc.split(',')
                         longitude = float(loc[0]) / 1000000
                         latitude = float(loc[1]) / 1000000
                     message.location_id = location.location_id
                     message.type = model_im.MESSAGE_CONTENT_TYPE_LOCATION
                     location.latitude = latitude
                     location.longitude = longitude
                     location.address = content[
                         'content'] if 'content' in content.keys() else None
                     location.timestamp = content[
                         'datetime'] if 'datetime' in content.keys() else 0
                     self.db_insert_table_location(location)
                 elif msgtype == 6:  #png
                     message.media_path = content['attachment'].replace(
                         '\\',
                         '') if 'attachment' in content.keys() else None
                     message.type = model_im.MESSAGE_CONTENT_TYPE_IMAGE
                 elif msgtype == 9:  #表情包
                     message.media_path = content['attachment'].replace(
                         '\\',
                         '') if 'attachment' in content.keys() else None
                     message.type = model_im.MESSAGE_CONTENT_TYPE_IMAGE
                 self.db_insert_table_message(message)
             except:
                 pass
         self.db_commit()
         ts = SQLiteParser.TableSignature('tb_group_message')
         dic = {}
         self.member_count = {}
         for rec in db.ReadTableRecords(ts, self.extractDeleted, True):
             try:
                 message = model_im.Message()
                 if canceller.IsCancellationRequested:
                     break
                 message.account_id = self.account_id
                 message.deleted = rec.IsDeleted
                 message.send_time = self._get_timestamp(
                     self._db_record_get_int_value(rec, 'timestamp'))
                 message.talker_id = self._db_record_get_int_value(
                     rec, 'groupid')
                 if not 'content' in rec or IsDBNull(rec['content'].Value):
                     continue
                 msginfo = json.loads(rec['content'].Value)
                 if 'user' in msginfo.keys():
                     #群好友信息
                     userinfo = msginfo['user']
                     userid = userinfo[
                         'userid'] if 'userid' in userinfo.keys() else None
                     if userid == self._db_record_get_int_value(
                             rec, 'userid'):
                         message.is_sender = 1
                     else:
                         message.is_sender = 0
                     message.sender_id = userid
                     nickname = userinfo[
                         'nickname'] if 'nickname' in userinfo.keys(
                         ) else ''
                     message.sender_name = nickname
                     birthday = userinfo[
                         'birthday'] if 'birthday' in userinfo.keys() else 0
                     gender = userinfo[
                         'gender'] if 'gender' in userinfo.keys() else 0
                     lng = userinfo['lng'] if 'lng' in userinfo.keys(
                     ) else 0
                     age = userinfo['age'] if 'age' in userinfo.keys(
                     ) else 0
                     icon = userinfo['icon'] if 'icon' in userinfo.keys(
                     ) else None
                     lat = userinfo['lat'] if 'lat' in userinfo.keys(
                     ) else 0
                     friend = model_im.Friend()
                     member = model_im.ChatroomMember()
                     flag = 0
                     friend.account_id = self.account_id
                     member.account_id = self.account_id
                     friend.friend_id = userid
                     member.member_id = userid
                     member.chatroom_id = message.talker_id
                     friend.fullname = nickname
                     member.display_name = nickname
                     friend.nickname = nickname
                     friend.photo = icon
                     member.photo = icon
                     friend.gender = 1 if gender == 'm' else 0
                     member.gender = friend.gender
                     friend.age = age
                     member.age = age
                     friend.source = self.node.AbsolutePath
                     member.source = self.node.AbsolutePath
                     location = model_im.Location()
                     friend.location_id = location.location_id
                     location.latitude = float(lat) / float(1000000)
                     location.longitude = float(lng) / float(1000000)
                     friend.type = model_im.FRIEND_TYPE_GROUP_FRIEND
                     if not userid in dic.keys():
                         dic[userid] = [rec.IsDeleted]
                     elif rec.IsDeleted not in dic[userid]:
                         dic[userid].append(rec.IsDeleted)
                     else:
                         flag = 1
                     if flag == 0:
                         self.db_insert_table_location(location)
                         self.db_insert_table_friend(friend)
                         self.db_insert_table_chatroom_member(member)
                         if member.chatroom_id not in self.member_count.keys(
                         ):
                             self.member_count[member.chatroom_id] = 1
                         else:
                             self.member_count[member.chatroom_id] += 1
                 message.msg_id = self._db_record_get_int_value(
                     rec, 'messageid')
                 msgtype = self._db_record_get_int_value(
                     rec, 'message_type')
                 content = json.loads(
                     self._db_record_get_string_value(rec, 'content'))
                 if msgtype == 1:  #普通文本
                     message.content = content[
                         'content'] if 'content' in content.keys() else ''
                     message.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                 elif msgtype == 2:  #jpg
                     message.media_path = content['attachment'].replace(
                         '\\',
                         '') if 'attachment' in content.keys() else None
                     message.type = model_im.MESSAGE_CONTENT_TYPE_IMAGE
                 elif msgtype == 3:  #mp3
                     media_name = content['attachment'].replace(
                         '\\',
                         '') if 'attachment' in content.keys() else None
                     message.type = model_im.MESSAGE_CONTENT_TYPE_VOICE
                     if media_name is not None:
                         pardir = os.path.basename(
                             os.path.dirname(media_name))
                         filename = os.path.basename(media_name)
                         nodes = fs.Search('/' + os.path.join(
                             pardir, filename).replace('\\', '/') + '$')
                         if nodes is None:
                             message.content = '音频消息:' + filename
                             message.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                         for node in nodes:
                             message.media_path = node.AbsolutePath
                             break
                 elif msgtype == 4:  #3gp
                     message.media_path = content['attachment'].replace(
                         '\\',
                         '') if 'attachment' in content.keys() else None
                     message.type = model_im.MESSAGE_CONTENT_TYPE_VIDEO
                 elif msgtype == 5:  #地理位置
                     location = model_im.Location()
                     loc = content[
                         'attachment'] if 'attachment' in content.keys(
                         ) else None
                     if loc is not None:
                         loc = loc.split(',')
                         latitude = float(loc[0]) / 1000000
                         longitude = float(loc[1]) / 1000000
                     message.location_id = location.location_id
                     message.type = model_im.MESSAGE_CONTENT_TYPE_LOCATION
                     location.latitude = latitude
                     location.longitude = longitude
                     location.address = content[
                         'content'] if 'content' in content.keys() else None
                     location.timestamp = content[
                         'datetime'] if 'datetime' in content.keys() else 0
                     self.db_insert_table_location(location)
                 elif msgtype == 6:  #png
                     message.media_path = content['attachment'].replace(
                         '\\',
                         '') if 'attachment' in content.keys() else None
                     message.type = model_im.MESSAGE_CONTENT_TYPE_IMAGE
                 elif msgtype == 9:  #表情包
                     message.media_path = content['attachment'].replace(
                         '\\',
                         '') if 'attachment' in content.keys() else None
                     message.type = model_im.MESSAGE_CONTENT_TYPE_IMAGE
                 message.talker_type = model_im.CHAT_TYPE_GROUP
                 self.db_insert_table_message(message)
             except:
                 pass
         #print(self.member_count)
         self.db_commit()
     except Exception as e:
         print(e)
Exemple #13
0
 def parse(self):
     for i in self.result_sql:
         current_id = None
         connection = sql.SQLiteConnection(
             'Data Source = {}; ReadOnly=True'.format(i))
         connection.Open()
         cmd = sql.SQLiteCommand(connection)
         cmd.CommandText = '''
             select uid, nick, avatarMediaId, mobile, gender, birthdayValue, address, extension, email from contact 
         '''
         reader = cmd.ExecuteReader()
         idx = 0
         f_dict = dict()
         while reader.Read():
             # if canceller.IsCancellationRequested:
             #     self.im.db_close()
             #     raise IOError("f****d")
             if idx == 0:
                 a = model_im.Account()
                 a.account_id = GetInt64(reader, 0)
                 a.nickname = GetString(reader, 1)
                 # real_name????
                 # photo ... pass for a while.
                 self.get_picture(GetString(reader, 2), AVATAR)
                 a.telephone = GetString(reader, 3)
                 a.gender = GetInt64(reader, 4)
                 a.birthday = GetInt64(reader, 5)
                 a.address = GetString(reader, 6)
                 a.email = GetString(reader, 8)
                 r = GetString(reader, 7)
                 if r is '':
                     pass
                 else:
                     r = json.loads(r)
                     if r.get('ownness') is not None:
                         #r = r.get('ownness').get(status)
                         pass
                     else:
                         pass
                 self.im.db_insert_table_account(a)
                 idx += 1
                 current_id = a.account_id
                 continue
             f = model_im.Friend()
             f.friend_id = GetInt64(reader, 0)
             f.nickname = GetString(reader, 1)
             # photo....
             # f.photo = #TODO generate photo id....
             f.photo = self.get_picture(GetString(reader, 2), AVATAR)
             f.account_id = current_id
             f.telephone = GetString(reader, 3)
             f.gender = GetInt64(reader, 4)
             f.birthday = GetInt64(reader, 5)
             f.deleted = 0
             f.email = GetString(reader, 8)
             f.address = GetString(reader, 6)
             f.type = model_im.FRIEND_TYPE_FRIEND
             r = GetString(reader, 7)
             if r is '':
                 pass
             else:
                 r = json.loads(r)
                 if r.get('ownness') is not None:
                     pass  #TODO fix it later
             self.im.db_insert_table_friend(f)
             f_dict[f.friend_id] = f
         cmd.Dispose()
         cmd.CommandText = '''
             select conversationId, title, createdAt, extensionJson, ownerId,
             memberLimit, memberCount, automaticIcon, customIcon from WKConversation where conversationType != 2
         '''
         reader = cmd.ExecuteReader()
         groups = list()
         while reader.Read():
             # if canceller.IsCancellationRequested:
             #     self.im.db_close()
             #     raise IOError('f****d')
             g = model_im.Chatroom()
             g.account_id = current_id
             g.chatroom_id = GetString(reader, 0)
             g.name = GetString(reader, 1)
             g.photo = self.get_picture(GetString(reader, 8), AVATAR)
             g.create_time = GetInt64(reader, 2) / 1000
             g.owner_id = GetInt64(reader, 4)
             g.max_member_count = GetInt64(reader, 5)
             g.member_count = GetInt64(reader, 6)
             groups.append(g.chatroom_id)
             self.im.db_insert_table_chatroom(g)
         chat_tbl_list = list()
         cmd.Dispose()
         cmd.CommandText = '''
             select tbl_name from sqlite_master where tbl_name like 'WKChat_%' and type = 'table'
         '''
         reader = cmd.ExecuteReader()
         while reader.Read():
             r = GetString(reader, 0)
             if r is '' or r.__contains__('fts'):
                 continue
             chat_tbl_list.append(r)
         cmd.Dispose()
         for r in chat_tbl_list:
             cmd.CommandText = ''' 
                 select messageId, conversationId, localSentTime, content, attachmentsType, senderId,
                 attachmentsJson from {} 
             '''.format(r)
             reader = cmd.ExecuteReader()
             while reader.Read():
                 # if canceller.IsCancellationRequested:
                 #     self.im.db_close()
                 #     raise IOError('f****d')
                 msg = model_im.Message()
                 msg.deleted = 0
                 msg.account_id = current_id
                 cv_id = GetString(reader, 1)
                 # update conversation id
                 if cv_id.__contains__(':'):
                     cvl = cv_id.split(':')
                     if int(cvl[0]) == current_id:
                         msg.talker_id = cvl[1]
                     else:
                         msg.talker_id = cvl[0]
                     msg.talker_type = model_im.CHAT_TYPE_FRIEND
                 else:
                     msg.talker_id = cv_id
                     msg.talker_type = model_im.CHAT_TYPE_GROUP
                 msg.sender_id = GetInt64(reader, 5)
                 msg.is_sender = 1 if msg.sender_id == current_id else 0
                 msg.content = GetString(reader, 3)
                 msg.send_time = GetInt64(reader, 2)
                 msg.msg_id = GetInt64(reader, 0)
                 msg.source = i
                 #TODO add other message decryptor.... and parse etc.
                 tp = GetInt64(reader, 4)
                 try:
                     if tp == 1 or tp == 500 or tp == 501:
                         msg.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                     elif tp == 1101:
                         msg.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                         msg.content = '[call message]'
                     elif tp == 600:
                         msg.type = model_im.MESSAGE_CONTENT_TYPE_CONTACT_CARD
                         string = GetString(reader, 6)
                         js = json.loads(string)
                         name = js.get('attachments')[0].get(
                             'extension').get('name')
                         uid = js.get('attachments')[0].get(
                             'extension').get('uid')
                         msg.content = 'uid:{}\nname:{}'.format(uid, name)
                     elif tp == 102:
                         msg.type = model_im.MESSAGE_CONTENT_TYPE_CONTACT_CARD
                         string = GetString(reader, 6)
                         js = json.loads(string)
                         title = js.get('attachments')[0].get(
                             'extension').get('title')
                         text = js.get('attachments')[0].get(
                             'extension').get('text')
                         pic = js.get('attachments')[0].get(
                             'extension').get('picUrl')
                         msg.content = 'title:{}\ntext:{}\npicUrl:{}'.format(
                             title, text, pic)
                     elif tp == 202 or tp == 103:
                         msg.type = model_im.MESSAGE_CONTENT_TYPE_VIDEO
                         string = GetString(reader, 6)
                         js = json.loads(string)
                         media_id = js.get('attachments')[0].get(
                             'extension').get('picUrl')
                         abs_path = self.root.PathWithMountPoint
                         f_name = os.path.join(
                             abs_path,
                             "Library/Caches/videoCaches/%s.mp4" % media_id)
                         if os.path.exists(f_name):
                             msg.media_path = f_name
                         else:
                             msg.content = "video message: not cached"
                             msg.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                     elif tp == 104:  # location ?
                         string = GetString(reader, 6)
                         js = json.loads(string)
                         lati = js.get('attachments')[0].get(
                             'extension').get('latitude')
                         lng = js.get('attachments')[0].get(
                             'extension').get('longitude')
                         name = js.get('attachments')[0].get(
                             'extension').get('locationName')
                         msg.location = md5(str(lati) + str(lng))
                         msg.type = model_im.MESSAGE_CONTENT_TYPE_LOCATION
                         msg.content = name
                         l = model_im.Location()
                         l.location_id = msg.location
                         l.deleted = 0
                         l.latitude = lati
                         l.longitude = lng
                         l.address = name
                         l.timestamp = GetInt64(reader, 2)
                         self.im.db_insert_table_location(l)
                     elif tp == 2:  # image
                         msg.type = model_im.MESSAGE_CONTENT_TYPE_IMAGE
                         string = GetString(reader, 6)
                         js = json.loads(string)
                         media_id = js.get('photoContent').get('mediaId')
                         t_f_name = js.get('photoContent').get('filename')
                         if t_f_name is None or t_f_name == "":
                             #print(string)
                             ext = ''
                         else:
                             fn, ext = os.path.splitext(t_f_name)
                         if ext == "JPG" or ext == "jpg" or ext == 'MOV' or ext == 'mov':
                             fn = self.get_picture(media_id, JPG)
                         elif ext == 'PNG' or ext == 'png':
                             fn = self.get_picture(media_id, PNG)
                         elif ext == 'gif' or ext == 'GIF':
                             fn = self.get_picture(media_id, GIF)
                         else:
                             fn = self.get_picture(media_id, SYSTEM)
                         if fn != "":
                             msg.media_path = fn
                         else:
                             msg.content = 'image message not cached...'
                             msg.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                     #TODO Fix it after rp is certain...
                     elif tp == 900 or tp == 901:
                         msg.content = GetString(reader, 6)
                         msg.type = model_im.MESSAGE_CONTENT_TYPE_TEXT
                     else:
                         msg.content = GetString(reader, 3) if GetString(
                             reader, 3) is not '' else GetString(reader, 6)
                         msg.type = model_im.MESSAGE_CONTENT_TYPE_SYSTEM
                 except:
                     self.log_print('error occurs: {}'.format(
                         GetString(reader, 3)))
                     continue
                 self.im.db_insert_table_message(msg)
             cmd.Dispose()
             # group members....
         for g in groups:
             members = list()
             for t in chat_tbl_list:
                 cmd.CommandText = '''
                 select senderId from {}  where conversationId = '{}' group by senderId
                 '''.format(t, g)
                 reader = cmd.ExecuteReader()
                 while reader.Read():
                     # if canceller.IsCancellationRequested:
                     #     self.im.db_close()
                     #     raise IOError('f****d')
                     m_id = GetInt64(reader, 0)
                     if members.__contains__(m_id) or m_id == current_id:
                         continue
                     members.append(m_id)
                 cmd.Dispose()
             for m in members:
                 cm = model_im.ChatroomMember()
                 cm.account_id = current_id
                 cm.member_id = m
                 if f_dict.__contains__(m):
                     #f = model_im.Friend()
                     # if canceller.IsCancellationRequested:
                     #     self.im.db_close()
                     #     raise IOError('f****d')
                     f = f_dict[m]
                     cm.address = f.address
                     cm.display_name = f.nickname
                     cm.birthday = f.birthday
                     cm.photo = f.photo
                     cm.deleted = 0
                     cm.gender = f.gender
                     cm.email = f.email
                     cm.telephone = f.telephone
                     cm.signature = f.signature
                 cm.chatroom_id = g
                 self.im.db_insert_table_chatroom_member(cm)
         self.im.db_commit()
         #self.im.db_close()
         #以下部分不兼容老版本分析:
         cmd.CommandText = '''
             select dingId, senderUid, sendAt, content from Ding
         '''
         reader = cmd.ExecuteReader()
         feed_dict = dict()
         while reader.Read():
             # if canceller.IsCancellationRequested:
             #     self.im.db_close()
             #     raise IOError('f****d')
             s_id = GetInt64(reader, 1)
             d_id = GetInt64(reader, 0)
             s_time = GetInt64(reader, 2) / 1000
             s_content = GetString(reader, 3)
             feed = model_im.Feed()
             feed.sender_id = s_id
             feed.account_id = current_id
             feed.repeated = 0
             feed.send_time = s_time
             feed.content = s_content
             feed_dict[d_id] = feed
             #feed.comments = s_id
             #self.im.db_insert_table_feed(feed)
         cmd.Dispose()
         cmd.CommandText = '''
             select dingId, commentId, commenterUid, attachmentJSON, createAt from dingcomment
         '''
         try:
             reader = cmd.ExecuteReader()
         except:
             reader = None
         while reader is not None and reader.Read():
             # if canceller.IsCancellationRequested:
             #     self.im.db_close()
             #     raise IOError('f****d')
             fcm = model_im.FeedComment()
             d_id = GetInt64(reader, 0)
             if not feed_dict.__contains__(d_id):
                 continue
             feed_dict[d_id].comments = str()
             feed_dict[d_id].comments += '{},'.format(GetInt64(reader, 1))
             fcm.comment_id = GetInt64(reader, 1)
             string = GetString(reader, 3)
             try:
                 fcm.content = json.loads(string).get('text')
                 fcm.sender_id = GetInt64(reader, 1)
                 fcm.sender_name = "" if not f_dict.__contains__(
                     fcm.sender_id) else f_dict[fcm.sender_id].nickname
                 fcm.create_time = GetInt64(reader, 4) / 1000
             except:
                 pass
             self.im.db_insert_table_feed_comment(fcm)
         for k in feed_dict:
             self.im.db_insert_table_feed(feed_dict[k])
         feed_dict.clear()  # no longer use...
         cmd.Dispose()
         # 出勤活动
         cmd.CommandText = '''
             select value from WebPersistenceModel where key like 'fastCheck_%' or 'asyncCheck_%'
         '''
         try:
             reader = cmd.ExecuteReader()
         except:
             reader = None
         while reader is not None and reader.Read():
             try:
                 string = GetString(reader, 0)
                 js = json.loads(string)
                 feed = model_im.Feed()
                 feed.sender_id = current_id
                 addr = js.get('checkResult').get('address')
                 time = js.get('checkResult').get('checkTime')
                 f_id = js.get('checkResult').get('id')
                 method = js.get('checkResult').get('locationMethod')
                 s_type = js.get('checkResult').get('scheduleType')
                 feed.content = '''
                 event:{}
                 address:{}
                 method:{}
                 '''.format(s_type, addr, method)
                 feed.send_time = time / 1000
                 self.im.db_insert_table_feed(feed)
             except:
                 continue
         self.im.db_commit()
         cmd.Dispose()
         connection.Close()
         try:
             self.parse_recovery(i, current_id, chat_tbl_list)
         except:
             pass
Exemple #14
0
 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()
Exemple #15
0
    def get_contacts(self):
        if self.user is None:
            return

        dbPath = self.root.GetByPath('../../../Documents/Contact/' + self.md5_encode(self.user)[8:24] + '.db')
        db = SQLiteParser.Database.FromNode(dbPath)
        if db is None:
            return

        if 'contact_account_list' in db.Tables:
            ts = SQLiteParser.TableSignature('contact_account_list')
            SQLiteParser.Tools.AddSignatureToTable(ts, 'userID', SQLiteParser.FieldType.Text, SQLiteParser.FieldConstraints.NotNull)
            for rec in db.ReadTableRecords(ts, self.extract_deleted):
                # if canceller.IsCancellationRequested:
                #     return

                if rec['userID'].Value == self.user:
                    continue
                
                if rec['noAliPay'].Value == '1':
                    continue

                friend = model_im.Friend()
                friend.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                friend.source = dbPath.AbsolutePath
                friend.account_id = self.user
                friend.friend_id = rec['userID'].Value
                friend.nickname = rec['nickName'].Value
                tmp = self.aes_decode(rec['fullName'].Value)
                if tmp is not None:
                    memoryRange = MemoryRange.FromBytes(tmp)
                    obj = BPReader.GetTree(memoryRange)
                    if obj is not None:
                        friend.remark = obj.Value
                exposedAccount = rec['exposedAlipayAccount'].Value
                if not IsDBNull(exposedAccount):
                    str = Text.ASCIIEncoding.ASCII.GetString(exposedAccount)
                    g = re.match('.cn', str, re.M | re.I)
                    if g is not None:
                        friend.email = g.group(0)
                    g = re.match('.com', str, re.M | re.I)
                    if g is not None:
                        friend.email = g.group(0)
                if IsDBNull(friend.email):
                    tmp = self.aes_decode(rec['account'].Value)
                    if tmp is not None:
                        memoryRange = MemoryRange.FromBytes(tmp)
                        obj = BPReader.GetTree(memoryRange)
                        if obj is not None:
                            str = obj.Value
                            g = re.match('.cn', str, re.M | re.I)
                            if g is not None:
                                friend.email = g.group(0)
                            g = re.match('.com', str, re.M | re.I)
                            if g is not None:
                                friend.email = g.group(0)
                friend.photo = rec['headUrl'].Value
                friend.gender = model_im.GENDER_MALE if rec['gender'].Value == 'm' else model_im.GENDER_FEMALE
                friend.age = rec['age'].Value
                friend.signature = rec['signature'].Value
                friend.address = rec['area'].Value
                friend.telephone = rec['phoneString'].Value
                if IsDBNull(friend.telephone):
                    tmp = self.aes_decode(rec['account'].Value)
                    if tmp is not None:
                        memoryRange = MemoryRange.FromBytes(tmp)
                        obj = BPReader.GetTree(memoryRange)
                        if obj is not None:
                            str = obj.Value
                            g = re.match('\d{3}\D{6}\d{2}', str, re.M | re.I)
                            if g is not None:
                                friend.telephone = g.group(0)
                friend.type = model_im.FRIEND_TYPE_FRIEND
                if friend.friend_id not in self.contacts.keys():
                    self.contacts[friend.friend_id] = friend
                self.im.db_insert_table_friend(friend)

        if 'contact_recent_list' in db.Tables:
            ts = SQLiteParser.TableSignature('contact_recent_list')
            SQLiteParser.Tools.AddSignatureToTable(ts, 'userID', SQLiteParser.FieldType.Text, SQLiteParser.FieldConstraints.NotNull)
            for rec in db.ReadTableRecords(ts, self.extract_deleted):
                if rec['userType'].Value != '107' and rec['userType'].Value != '11':
                    continue
                friend = model_im.Friend()
                friend.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                friend.source = dbPath.AbsolutePath
                friend.account_id = self.user
                g = re.match('\d{16}', rec['userID'].Value, re.M | re.I)
                if g is not None:
                    friend.friend_id = g.group(0)
                memoryRange = MemoryRange.FromBytes(self.aes_decode(rec['displayName'].Value))
                obj = BPReader.GetTree(memoryRange)
                friend.nickname = obj.Value
                friend.photo = rec['headUrl'].Value
                friend.create_time = rec['createTime'].Value
                friend.type = model_im.FRIEND_TYPE_FOLLOW
                if friend.friend_id not in self.contacts.keys():
                    self.contacts[friend.friend_id] = friend
                self.im.db_insert_table_friend(friend)

        if 'ap_group_list' in db.Tables:
            ts = SQLiteParser.TableSignature('ap_group_list')
            SQLiteParser.Tools.AddSignatureToTable(ts, 'groupId', SQLiteParser.FieldType.Text, SQLiteParser.FieldConstraints.NotNull)
            for rec in db.ReadTableRecords(ts, self.extract_deleted):
                chatroom = model_im.Chatroom()
                chatroom.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                chatroom.source = dbPath.AbsolutePath
                chatroom.account_id = self.user
                chatroom.chatroom_id = rec['groupId'].Value
                chatroom.name = rec['currentDisplayGroupName'].Value
                chatroom.photo = rec['groupImageUrl'].Value
                chatroom.max_member_count = rec['threshold'].Value
                chatroom.create_time = int(rec['gmtCreate'].Value)
                chatroom.owner_id = rec['masterUserId'].Value
                chatroom.type = model_im.CHATROOM_TYPE_NORMAL
                member_id_list = rec['memberUserIdsDesc'].Value.replace('[', '').replace(']', '').replace('\"', '').split(',')
                chatroom.member_count = len(member_id_list)
                if chatroom.chatroom_id not in self.contacts.keys():
                    self.contacts[chatroom.chatroom_id] = chatroom
                self.im.db_insert_table_chatroom(chatroom)

                for member_id in member_id_list:
                    # if canceller.IsCancellationRequested:
                    #     return
                    chatroom_member = model_im.ChatroomMember()
                    chatroom_member.deleted = 0 if rec.Deleted == DeletedState.Intact else 1
                    chatroom_member.source = dbPath.AbsolutePath
                    chatroom_member.account_id = self.user
                    chatroom_member.chatroom_id = chatroom.chatroom_id
                    chatroom_member.member_id = member_id
                    friend = self.contacts.get(member_id)
                    if friend is not None:
                        chatroom_member.display_name = friend.nickname
                        chatroom_member.photo = friend.photo
                        chatroom_member.gender = friend.gender
                        chatroom_member.telephone = friend.telephone
                        chatroom_member.age = friend.age
                        chatroom_member.address = friend.address
                        chatroom_member.birthday = friend.birthday
                        chatroom_member.signature = friend.signature
                    self.im.db_insert_table_chatroom_member(chatroom_member)
        self.im.db_commit()