2
0

Main.xaml.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Collections.ObjectModel;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Reflection.PortableExecutable;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows;
  11. using System.Windows.Controls;
  12. using System.Windows.Data;
  13. using System.Windows.Documents;
  14. using System.Windows.Input;
  15. using System.Windows.Media;
  16. using System.Windows.Media.Imaging;
  17. using WechatPCMsgBakTool.Helpers;
  18. using WechatPCMsgBakTool.Interface;
  19. using WechatPCMsgBakTool.Model;
  20. namespace WechatPCMsgBakTool
  21. {
  22. /// <summary>
  23. /// Main.xaml 的交互逻辑
  24. /// </summary>
  25. public partial class Main : Window
  26. {
  27. private UserBakConfig? CurrentUserBakConfig = null;
  28. private WXUserReader? UserReader = null;
  29. private ObservableCollection<UserBakConfig> userBakConfigs = new ObservableCollection<UserBakConfig>();
  30. public Main()
  31. {
  32. InitializeComponent();
  33. LoadWorkspace();
  34. }
  35. private void LoadWorkspace()
  36. {
  37. userBakConfigs.Clear();
  38. string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "workspace");
  39. if (Directory.Exists(path))
  40. {
  41. string[] files = Directory.GetFiles(path);
  42. foreach(string file in files)
  43. {
  44. string type = file.Substring(file.Length - 5, 5);
  45. if(type == ".json")
  46. {
  47. string jsonString = File.ReadAllText(file);
  48. UserBakConfig? userBakConfig = JsonConvert.DeserializeObject<UserBakConfig>(jsonString);
  49. if(userBakConfig != null)
  50. {
  51. userBakConfigs.Add(userBakConfig);
  52. }
  53. }
  54. }
  55. }
  56. list_workspace.ItemsSource = userBakConfigs;
  57. }
  58. private void btn_decrypt_Click(object sender, RoutedEventArgs e)
  59. {
  60. if(CurrentUserBakConfig != null)
  61. {
  62. if (!CurrentUserBakConfig.Decrypt)
  63. {
  64. byte[]? key = DecryptionHelper.GetWechatKey();
  65. if (key == null)
  66. {
  67. MessageBox.Show("微信密钥获取失败,请检查微信是否打开,或者版本不兼容");
  68. return;
  69. }
  70. string key_string = BitConverter.ToString(key, 0).Replace("-", string.Empty).ToLower().ToUpper();
  71. string source = Path.Combine(CurrentUserBakConfig.UserWorkspacePath, "OriginalDB");
  72. string to = Path.Combine(CurrentUserBakConfig.UserWorkspacePath, "DecDB");
  73. try
  74. {
  75. WechatDBHelper.DecryUserData(key, source, to);
  76. MessageBox.Show("解密完成,请点击读取数据");
  77. CurrentUserBakConfig.Decrypt = true;
  78. WXWorkspace.SaveConfig(CurrentUserBakConfig);
  79. LoadWorkspace();
  80. }
  81. catch (Exception ex)
  82. {
  83. MessageBox.Show("解密过程出现错误:" + ex.Message);
  84. }
  85. }
  86. }
  87. }
  88. private void btn_read_Click(object sender, RoutedEventArgs e)
  89. {
  90. if(CurrentUserBakConfig == null)
  91. {
  92. MessageBox.Show("请先选择工作区");
  93. return;
  94. }
  95. UserReader = new WXUserReader(CurrentUserBakConfig);
  96. list_sessions.ItemsSource = UserReader.GetWXContacts();
  97. }
  98. private void list_workspace_SelectionChanged(object sender, SelectionChangedEventArgs e)
  99. {
  100. CurrentUserBakConfig = list_workspace.SelectedItem as UserBakConfig;
  101. if(CurrentUserBakConfig != null)
  102. {
  103. user_path.Content = "用户路径:" + CurrentUserBakConfig.UserResPath;
  104. if (CurrentUserBakConfig.Decrypt)
  105. {
  106. btn_decrypt.IsEnabled = false;
  107. btn_read.IsEnabled = true;
  108. }
  109. else
  110. {
  111. btn_decrypt.IsEnabled = true;
  112. btn_read.IsEnabled = false;
  113. }
  114. }
  115. }
  116. private void list_sessions_MouseDoubleClick(object sender, MouseButtonEventArgs e)
  117. {
  118. }
  119. private void Button_Click(object sender, RoutedEventArgs e)
  120. {
  121. WXContact? wXContact = list_sessions.SelectedItem as WXContact;
  122. if(UserReader == null)
  123. {
  124. MessageBox.Show("请先点击读取已解密工作区");
  125. return;
  126. }
  127. if(wXContact == null || CurrentUserBakConfig == null)
  128. {
  129. MessageBox.Show("请先选择要导出的联系人");
  130. return;
  131. }
  132. IExport export = new HtmlExport();
  133. export.InitTemplate(wXContact);
  134. export.SetMsg(UserReader, wXContact);
  135. export.SetEnd();
  136. //string path = UserReader.GetSavePath(wXContact);
  137. string path = Path.Combine(CurrentUserBakConfig.UserWorkspacePath, wXContact.UserName + ".html");
  138. export.Save(path);
  139. MessageBox.Show("导出完成");
  140. }
  141. private void Button_Click_1(object sender, RoutedEventArgs e)
  142. {
  143. SelectWechat selectWechat = new SelectWechat();
  144. selectWechat.ShowDialog();
  145. if(selectWechat.SelectProcess != null)
  146. {
  147. string path = selectWechat.SelectProcess.DBPath.Replace("\\Msg\\MicroMsg.db", "");
  148. try
  149. {
  150. WXWorkspace wXWorkspace = new WXWorkspace(path);
  151. wXWorkspace.MoveDB();
  152. MessageBox.Show("创建工作区成功");
  153. LoadWorkspace();
  154. }
  155. catch (Exception)
  156. {
  157. MessageBox.Show("创建工作区失败,请检查路径是否正确");
  158. }
  159. }
  160. }
  161. private void btn_search_Click(object sender, RoutedEventArgs e)
  162. {
  163. if(UserReader == null)
  164. {
  165. MessageBox.Show("请先读取工作区数据");
  166. return;
  167. }
  168. if(cb_del_search.IsChecked != null)
  169. {
  170. if (!(bool)cb_del_search.IsChecked)
  171. list_sessions.ItemsSource = UserReader.GetWXContacts(find_user.Text);
  172. else
  173. {
  174. List<WXMsg>? wXMsgs = UserReader.GetWXMsgs(find_user.Text);
  175. if(wXMsgs != null)
  176. {
  177. if(wXMsgs.Count > 0)
  178. {
  179. List<WXContact> wXContacts = new List<WXContact>() { new WXContact() { NickName = wXMsgs[0].StrTalker, UserName = wXMsgs[0].StrTalker } };
  180. list_sessions.ItemsSource = wXContacts;
  181. }
  182. }
  183. }
  184. }
  185. }
  186. private void btn_analyse_Click(object sender, RoutedEventArgs e)
  187. {
  188. if(UserReader == null || CurrentUserBakConfig == null)
  189. {
  190. MessageBox.Show("请先读取数据");
  191. return;
  192. }
  193. Analyse analyse = new Analyse(CurrentUserBakConfig, UserReader);
  194. analyse.Show();
  195. }
  196. }
  197. }