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()
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()
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()
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()
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()
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)
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()
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)
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)
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
def parse(self, account_folder): f_node = self.node.GetByPath('Documents/{}/netdisk.sqlite'.format(account_folder)) if f_node is None: return conn = unity_c37r.create_connection_tentatively(f_node) cmd = sql.SQLiteCommand(conn) cmd.CommandText = ''' select uk, user_name, avatar_url from feed_userlist ''' reader = cmd.ExecuteReader() current_account = None if reader.Read(): a = model_im.Account() a.account_id = unity_c37r.c_sharp_get_string(reader, 0) current_account = a.account_id a.username = unity_c37r.c_sharp_get_string(reader, 1) a.nickname = a.username a.photo = unity_c37r.c_sharp_get_string(reader, 2) self.nd.im.db_insert_table_account(a) else: raise IOError('[BAIDU NETDISK] E: NO ACCOUNT INFORMATION!') reader.Close() cmd.CommandText = ''' select fid, server_full_path, file_name, file_size, file_md5, ctime, mtime, atime from cachefilelist ''' reader = cmd.ExecuteReader() while reader.Read(): f = model_nd.NDFileList() f.set_value_with_idx(f.account, current_account) f.set_value_with_idx(f.file_name, unity_c37r.c_sharp_get_string(reader, 2)) f.set_value_with_idx(f.server_path, unity_c37r.c_sharp_get_string(reader, 1)) f.set_value_with_idx(f.create_time, unity_c37r.c_sharp_try_get_time(reader, 5)) f.set_value_with_idx(f.update_time, unity_c37r.c_sharp_try_get_time(reader, 6)) f.set_value_with_idx(f.cache_time, unity_c37r.c_sharp_try_get_time(reader, 7)) f.set_value_with_idx(f.file_hash, unity_c37r.c_sharp_get_string(reader, 4)) f.set_value_with_idx(f.file_size, unity_c37r.c_sharp_get_long(reader, 3)) self.nd.db_insert_filelist(f.get_values()) reader.Close() self.nd.db_commit() cmd.CommandText = ''' select file_name, server_full_path, file_size, blocklistmd5, trans_type, trans_status, ctime, mtime, atime, downloadlink, thumburl from transfilelist ''' reader = cmd.ExecuteReader() while reader.Read(): f = model_nd.NDFileTransfer() f.set_value_with_idx(f.account, current_account) f.set_value_with_idx(f.file_name, unity_c37r.c_sharp_get_string(reader, 0)) f.set_value_with_idx(f.server_path, unity_c37r.c_sharp_get_string(reader, 1)) f.set_value_with_idx(f.file_size, unity_c37r.c_sharp_get_long(reader, 2)) f.set_value_with_idx(f.hash_code, unity_c37r.c_sharp_get_string(reader, 3)) f.set_value_with_idx(f.is_download, 1) st = unity_c37r.c_sharp_get_long(reader, 5) if st == 1: f.set_value_with_idx(f.status, model_nd.NDFileDone) else: f.set_value_with_idx(f.status, model_nd.NDFileProcessing) f.set_value_with_idx(f.url, unity_c37r.c_sharp_get_string(reader, 9)) f.set_value_with_idx(f.begin_time, unity_c37r.c_sharp_try_get_time(reader, 8)) f_name = f.get_value_with_idx(f.file_name) paddern = os.path.splitext(f_name) if len(paddern) > 1: paddern = paddern[1] else: paddern = "" r_fname = 'Documents/{0}/Cache/{1}{2}'.format(account_folder, f.get_value_with_idx(f.hash_code), paddern) s_node = self.node.GetByPath(r_fname) if s_node is not None: f.set_value_with_idx(f.local_path, s_node.AbsolutePath) self.nd.db_insert_transfer(f.get_values()) reader.Close() cmd.CommandText = ''' select server_full_path, file_md5, file_size, ctime, mtime from image_filelist ''' reader = cmd.ExecuteReader() while reader.Read(): f = model_nd.NDFileList() f.set_value_with_idx(f.account, current_account) f.set_value_with_idx(f.file_name, unity_c37r.c_sharp_get_string(reader, 0)) f.set_value_with_idx(f.server_path, f.get_value_with_idx(f.file_name)) f.set_value_with_idx(f.create_time, unity_c37r.c_sharp_try_get_time(reader, 3)) f.set_value_with_idx(f.update_time, unity_c37r.c_sharp_try_get_time(reader, 4)) f.set_value_with_idx(f.file_hash, unity_c37r.c_sharp_get_string(reader, 1)) self.nd.db_insert_filelist(f.get_values()) self.nd.db_commit() reader.Close() cmd.CommandText = ''' select from_uk, server_fullpath, server_filename, size, server_mtime, server_ctime, dlink, uname, msg_time from Mbox_groupfile_share ''' reader = cmd.ExecuteReader() while reader.Read(): s = model_nd.NDFileShared() s.set_value_with_idx(s.account, current_account) s.set_value_with_idx(s.file_name, unity_c37r.c_sharp_get_string(reader, 2)) s.set_value_with_idx(s.server_path, unity_c37r.c_sharp_get_string(reader, 1)) s.set_value_with_idx(s.file_size, unity_c37r.c_sharp_get_long(reader, 3) ) s.set_value_with_idx(s.sender_id, unity_c37r.c_sharp_get_string(reader, 0)) s.set_value_with_idx(s.update_time, unity_c37r.c_sharp_try_get_time(reader, 4)) s.set_value_with_idx(s.create_time, unity_c37r.c_sharp_try_get_time(reader, 5)) s.set_value_with_idx(s.url, unity_c37r.c_sharp_get_string(reader, 6)) s.set_value_with_idx(s.sender_name, unity_c37r.c_sharp_get_string(reader, 7)) s.set_value_with_idx(s.send_time, unity_c37r.c_sharp_try_get_time(reader, 8)) self.nd.db_insert_shared(s.get_values()) reader.Close() self.nd.db_commit() cmd.CommandText = ''' select gid, name, uname, uk, avatarurl, ctime from Mbox_group ''' reader = cmd.ExecuteReader() grp_dict = dict() while reader.Read(): grp = model_im.Chatroom() grp.account_id = current_account grp.chatroom_id = unity_c37r.c_sharp_get_string(reader, 0) grp.name = unity_c37r.c_sharp_get_string(reader, 1) grp.owner_id = unity_c37r.c_sharp_get_string(reader, 3) grp.photo = unity_c37r.c_sharp_get_string(reader, 4) grp.create_time = unity_c37r.c_sharp_try_get_time(reader, 5) grp_dict[grp.chatroom_id] = grp self.nd.im.db_insert_table_chatroom(grp) self.nd.im.db_commit() reader.Close() cmd.CommandText = ''' select gid, ctime, uk, uname, nick_name, avatar_url from Mbox_group_member ''' reader = cmd.ExecuteReader() while reader.Read(): gm = model_im.ChatroomMember() gm.account_id = current_account gm.chatroom_id = unity_c37r.c_sharp_get_string(reader, 0) gm.member_id = unity_c37r.c_sharp_get_string(reader, 2) gm.display_name = unity_c37r.c_sharp_get_string(reader, 3) gm.photo = unity_c37r.c_sharp_get_string(reader, 5) self.nd.im.db_insert_table_chatroom_member(gm) # add system message gm = model_im.ChatroomMember() gm.account_id = current_account gm.member_id = 0 gm.display_name = u'系统消息' self.nd.im.db_insert_table_chatroom_member(gm) self.nd.im.db_commit() reader.Close() # group messages cmd.CommandText = ''' select gid, msgid, msguk, time, content, username from mbox_groupmsg ''' reader = cmd.ExecuteReader() while reader.Read(): m = model_im.Message() m.talker_id = unity_c37r.c_sharp_get_string(reader, 0) if grp_dict.__contains__(m.talker_id): m.talker_name = grp_dict[m.talker_id].name m.msg_id = unity_c37r.c_sharp_get_string(reader, 1) m.sender_id = unity_c37r.c_sharp_get_string(reader, 2) m.send_time = unity_c37r.c_sharp_try_get_time(reader, 3) m.content = unity_c37r.c_sharp_get_string(reader, 4) m.is_sender = 1 if current_account == m.sender_id else 0 m.account_id = current_account m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT self.nd.im.db_insert_table_message(m) self.nd.im.db_commit() reader.Close() cmd.CommandText = ''' select uk, uname, avatarurl from mbox_newfriendunreadlist ''' reader = cmd.ExecuteReader() while reader.Read(): f = model_im.Friend() f.account_id = current_account f.friend_id = unity_c37r.c_sharp_get_string(reader, 0) f.photo = unity_c37r.c_sharp_get_string(reader, 2) f.nickname = unity_c37r.c_sharp_get_string(reader, 1) self.nd.im.db_insert_table_friend(f) self.nd.im.db_commit() reader.Close() cmd.CommandText = ''' select msgid, msguk, is_receive, time, content, username from mbox_msg ''' reader = cmd.ExecuteReader() while reader.Read(): m = model_im.Message() m.is_sender = unity_c37r.c_sharp_get_long(reader, 2) m.msg_id = unity_c37r.c_sharp_get_string(reader, 0) m.talker_id = unity_c37r.c_sharp_get_string(reader, 1) if m.is_sender == 0: m.sender_id = m.talker_id else: m.sender_id = current_account m.account_id = current_account m.content = unity_c37r.c_sharp_get_string(reader, 4) m.send_time = unity_c37r.c_sharp_try_get_time(reader, 3) m.talker_name = unity_c37r.c_sharp_get_string(reader, 5) m.type = model_im.MESSAGE_CONTENT_TYPE_TEXT self.nd.im.db_insert_table_message(m) self.nd.im.db_commit() reader.Close()
def 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()