private void GetdbContactRemark(byte[] data, ref DynamicEx friend) { try { int index = 0; if (data[index++] != 0x0A) { return; } int length = data[index++]; if (0 != length) {//昵称NickName var res = System.Text.Encoding.UTF8.GetString(data, index, length); friend.Set("NickName", res); } index += length; if (index >= data.Length || data[index++] != 0x12) { return; } length = data[index++]; if (0 != length) {//修改后微信号Alias var res = System.Text.Encoding.UTF8.GetString(data, index, length); friend.Set("Alias", res); } index += length; if (index >= data.Length || data[index++] != 0x1A) { return; } length = data[index++]; if (0 != length) {//备注RemarkName var res = System.Text.Encoding.UTF8.GetString(data, index, length); friend.Set("RemarkName", res); } index += length; } catch { } }
/// <summary> /// 对byte数据进行转码 。 /// columns为列名,多个逗号隔开;encodestr为编码格式,如UTF-8,Unicode,GBK /// </summary> private void Encode(IEnumerable <dynamic> items, string columns, string encodestr) { if (String.IsNullOrEmpty(columns) || String.IsNullOrEmpty(encodestr)) { return; } if (items == null) { return; } var cs = columns.Replace(",", ",").Split(','); var encode = System.Text.Encoding.GetEncoding(encodestr); foreach (var item in items) { try { DynamicEx obj = (DynamicEx)item; foreach (var c in cs) { var value = obj.Get(c) as byte[]; obj.Set(c, encode.GetString(value).Replace("\0", "")); } } catch (Exception e) { Console.WriteLine("转码异常" + e.Message); } } }
private void GetdbContactProfile(byte[] data, ref DynamicEx friend) { try { int index = 0; while (index < data.Length && data[index] != 0x12) { index++; } if (index >= data.Length || data[index++] != 0x12) { return; } int length = data[index++]; if (0 != length) {//国家Country var res = System.Text.Encoding.UTF8.GetString(data, index, length); friend.Set("Country", res); } index += length; if (index >= data.Length || data[index++] != 0x1a) { return; } length = data[index++]; if (0 != length) {//省Province var res = System.Text.Encoding.UTF8.GetString(data, index, length); friend.Set("Province", res); } index += length; if (index >= data.Length || data[index++] != 0x22) { return; } length = data[index++]; if (0 != length) {//市City var res = System.Text.Encoding.UTF8.GetString(data, index, length); friend.Set("City", res); } index += length; if (index >= data.Length || data[index++] != 0x2a) { return; } length = data[index++]; if (0 != length) {//个性签名Signature var res = System.Text.Encoding.UTF8.GetString(data, index, length); friend.Set("Signature", res); } index += length; } catch { } }
/// <summary> /// 获取通讯录 包括好友和群聊 /// </summary> private void LoadAllContacts() { LsAllFriends = new List <WeChatFriendShow>(); LsAllGroupFriends = new List <WeChatGroupShow>(); #region 从MM.sqlite的Friend表获取好友信息 var sql = @"SELECT f.*, e.* FROM Friend f LEFT JOIN Friend_Ext e ON f.UsrName = e.UsrName"; MainContext.UsingSafeConnection(sql, r => { dynamic data; WeChatFriendShow friendInfo; while (r.Read()) { data = r.ToDynamic(); if (DynamicConvert.ToSafeString(data.UsrName).Contains("@chatroom")) { LsAllGroupFriends.Add(CreateWeChatGroupShow(data)); } else { friendInfo = new WeChatFriendShow(); CreateWeChatFriendShow(data, ref friendInfo); LsAllFriends.Add(friendInfo); } } }); #endregion #region 从WCDB_Contact.sqlite的表Friend获取好友信息 string WCDBPath = Path.Combine(MD5AccountPath, "DB", "WCDB_Contact.sqlite"); if (FileHelper.IsValid(WCDBPath)) { List <char> listC = new List <char>(); for (int i = 0; i < 32; i++) { listC.Add((char)i); } listC.Add((char)127); var arrC = listC.ToArray();//分割字符 using (var WCDB = new SqliteContext(WCDBPath)) { WCDB.UsingSafeConnection("SELECT * FROM Friend WHERE imgStatus != 1", r => {//imgStatus为1的记录为系统功能 dynamic fd; DynamicEx dy; WeChatFriendShow friendInfo; while (r.Read()) { fd = r.ToDynamic(); dy = new DynamicEx(); dy.Set("UsrName", fd.userName); dy.Set("type", fd.type); dy.Set("certificationFlag", fd.certificationFlag); dy.Set("imgStatus", fd.imgStatus); dy.Set("XLY_DataType", "2"); byte[] dbContactRemark = fd.dbContactRemark; if (dbContactRemark.IsValid()) {//获取昵称、备注、修改后微信号 GetdbContactRemark(dbContactRemark, ref dy); } byte[] dbContactProfile = fd.dbContactProfile; if (dbContactProfile.IsValid()) {//获取位置和签名 GetdbContactProfile(dbContactProfile, ref dy); } byte[] dbContactChatRoom = fd.dbContactChatRoom; if (dbContactChatRoom.IsValid()) {//获取群组成员列表 var dArr = System.Text.Encoding.UTF8.GetString(dbContactChatRoom).Split(arrC, StringSplitOptions.RemoveEmptyEntries).ToList(); if (dArr.IsValid()) { string ConChatRoomMem = dArr.FirstOrDefault(d => d.Contains(";")); string ConChatRoomOwner = ""; if (dArr.IndexOf(ConChatRoomMem) + 1 < dArr.Count) {//群组的创建者在群组成员后面 ConChatRoomOwner = dArr[dArr.IndexOf(ConChatRoomMem) + 1]; } if (0 == dArr.IndexOf(ConChatRoomMem)) {//如果成员的索引是0,前面会多出一个随机的字符 ConChatRoomMem = ConChatRoomMem.Substring(1); } dy.Set("ConChatRoomMem", ConChatRoomMem); dy.Set("ConChatRoomOwner", ConChatRoomOwner); } } if (DynamicConvert.ToSafeString(fd.userName).Contains("@chatroom")) { LsAllGroupFriends.Add(CreateWeChatGroupShow(dy)); } else { friendInfo = new WeChatFriendShow(); CreateWeChatFriendShow(dy, ref friendInfo); LsAllFriends.Add(friendInfo); } } }); } } #endregion }