Quellcode durchsuchen

导出改造
新增txt导出

Suxue vor 1 Jahr
Ursprung
Commit
985505b2e7
4 geänderte Dateien mit 164 neuen und 21 gelöschten Zeilen
  1. 2 4
      Export/ExportInterface.cs
  2. 12 12
      Export/HtmlExport.cs
  3. 146 0
      Export/TXTExport.cs
  4. 4 5
      Pages/Workspace.xaml.cs

+ 2 - 4
Interface/ExportInterface.cs → Export/ExportInterface.cs

@@ -5,15 +5,13 @@ using System.Text;
 using System.Threading.Tasks;
 using WechatBakTool.Model;
 
-namespace WechatBakTool.Interface
+namespace WechatBakTool.Export
 {
     public interface IExport
     {
-        void InitTemplate(WXSession session);
-        void InitTemplate(WXContact session);
+        void InitTemplate(WXContact session,string path);
         void SetMsg(WXUserReader reader, WXContact session);
         void SetEnd();
         void Save(string path = "", bool append = false);
-
     }
 }

+ 12 - 12
HtmlExport.cs → Export/HtmlExport.cs

@@ -6,34 +6,35 @@ using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
-using WechatBakTool.Interface;
 using WechatBakTool.Model;
 using System.Xml;
 
-namespace WechatBakTool
+namespace WechatBakTool.Export
 {
     public class HtmlExport : IExport
     {
         private string HtmlBody = "";
         private WXSession? Session = null;
+        private string Path = "";
         public void InitTemplate(WXSession session)
         {
             Session = session;
-            HtmlBody = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>溯雪微信聊天记录备份工具</title><style>p{margin:0px;}.msg{padding-bottom:10px;}.nickname{font-size:10px;}.content{font-size:14px;}</style></head><body>";
+            HtmlBody = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>WechatBakTool</title><style>p{margin:0px;}.msg{padding-bottom:10px;}.nickname{font-size:10px;}.content{font-size:14px;}</style></head><body>";
 
             HtmlBody += string.Format("<div class=\"msg\"><p class=\"nickname\"><b>与 {0}({1}) 的聊天记录</b></p>", Session.NickName, Session.UserName);
             HtmlBody += string.Format("<div class=\"msg\"><p class=\"nickname\"><b>导出时间:{0}</b></p><hr/>", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
         }
 
-        public void InitTemplate(WXContact contact)
+        public void InitTemplate(WXContact contact, string p)
         {
+            Path = p;
             WXSession session = new WXSession();
             session.NickName = contact.NickName;
             session.UserName = contact.UserName;
             InitTemplate(session);
         }
 
-        public void Save(string path = "",bool append = false)
+        public void Save(string path = "", bool append = false)
         {
             if (!append)
             {
@@ -51,7 +52,7 @@ namespace WechatBakTool
             HtmlBody += "</body></html>";
         }
 
-        public void SetMsg(WXUserReader reader,WXContact contact)
+        public void SetMsg(WXUserReader reader, WXContact contact)
         {
             if (Session == null)
                 throw new Exception("请初始化模版:Not Use InitTemplate");
@@ -88,13 +89,13 @@ namespace WechatBakTool
                     }
                     HtmlBody += string.Format("<p class=\"content\"><video controls style=\"max-height:300px;max-width:300px;\"><source src=\"{0}\" type=\"video/mp4\" /></video></p></div>", path);
                 }
-                else if(msg.Type== 49)
+                else if (msg.Type == 49)
                 {
                     using (var decoder = LZ4Decoder.Create(true, 64))
                     {
                         byte[] target = new byte[10240];
                         int res = 0;
-                        if(msg.CompressContent != null)
+                        if (msg.CompressContent != null)
                             res = LZ4Codec.Decode(msg.CompressContent, 0, msg.CompressContent.Length, target, 0, target.Length);
 
                         byte[] data = target.Skip(0).Take(res).ToArray();
@@ -104,15 +105,15 @@ namespace WechatBakTool
                             xml = xml.Replace("\n", "");
                             XmlDocument xmlObj = new XmlDocument();
                             xmlObj.LoadXml(xml);
-                            if(xmlObj.DocumentElement != null)
+                            if (xmlObj.DocumentElement != null)
                             {
                                 string title = "";
                                 string appName = "";
                                 string url = "";
                                 XmlNodeList? findNode = xmlObj.DocumentElement.SelectNodes("/msg/appmsg/title");
-                                if(findNode != null)
+                                if (findNode != null)
                                 {
-                                    if(findNode.Count > 0)
+                                    if (findNode.Count > 0)
                                     {
                                         title = findNode[0]!.InnerText;
                                     }
@@ -137,7 +138,6 @@ namespace WechatBakTool
 
                             }
                         }
-
                     }
                 }
                 else if (msg.Type == 34)

+ 146 - 0
Export/TXTExport.cs

@@ -0,0 +1,146 @@
+using K4os.Compression.LZ4.Encoders;
+using K4os.Compression.LZ4;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml;
+using WechatBakTool.Model;
+
+namespace WechatBakTool.Export
+{
+    public class TXTExport : IExport
+    {
+        private WXContact? Contact { get; set; } = null;
+        private string Path { get; set; } = "";
+        public void InitTemplate(WXContact contact,string p)
+        {
+            Contact = contact;
+            Path = p;
+            if (File.Exists(Path))
+            {
+                File.WriteAllText(Path, "");
+            }
+            File.AppendAllText(Path, string.Format("WechatBakTool\n"));
+            File.AppendAllText(Path, string.Format("与 {0} 的聊天记录\n", Contact.NickName));
+            File.AppendAllText(Path, string.Format("导出时间:{0}\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
+            File.AppendAllText(Path, string.Format("=================================================================\n\n\n"));
+        }
+
+        void IExport.Save(string path, bool append)
+        {
+            
+        }
+
+        void IExport.SetEnd()
+        {
+            
+        }
+
+        public void SetMsg(WXUserReader reader, WXContact session)
+        {
+            if (Contact == null)
+                throw new Exception("请初始化模版:Not Use InitTemplate");
+
+            List<WXMsg>? msgList = reader.GetWXMsgs(Contact.UserName);
+            if (msgList == null)
+                throw new Exception("获取消息失败,请确认数据库读取正常");
+
+            msgList.Sort((x, y) => x.CreateTime.CompareTo(y.CreateTime));
+
+            foreach (var msg in msgList)
+            {
+                string txtMsg = "";
+                switch (msg.Type)
+                {
+                    case 1:
+                        txtMsg = msg.StrContent;
+                        break;
+                    case 3:
+                        txtMsg = "[图片]";
+                        break;
+                    case 34:
+                        txtMsg = "[语音]";
+                        break;
+                    case 43:
+                        txtMsg = "[视频]";
+                        break;
+                    case 49:
+                        try
+                        {
+                            using (var decoder = LZ4Decoder.Create(true, 64))
+                            {
+                                byte[] target = new byte[10240];
+                                int res = 0;
+                                if (msg.CompressContent != null)
+                                    res = LZ4Codec.Decode(msg.CompressContent, 0, msg.CompressContent.Length, target, 0, target.Length);
+
+                                byte[] data = target.Skip(0).Take(res).ToArray();
+                                string xml = Encoding.UTF8.GetString(data);
+                                if (!string.IsNullOrEmpty(xml))
+                                {
+                                    xml = xml.Replace("\n", "");
+                                    XmlDocument xmlObj = new XmlDocument();
+                                    xmlObj.LoadXml(xml);
+                                    if (xmlObj.DocumentElement != null)
+                                    {
+                                        string title = "";
+                                        string appName = "";
+                                        string url = "";
+                                        XmlNodeList? findNode = xmlObj.DocumentElement.SelectNodes("/msg/appmsg/title");
+                                        if (findNode != null)
+                                        {
+                                            if (findNode.Count > 0)
+                                            {
+                                                title = findNode[0]!.InnerText;
+                                            }
+                                        }
+                                        findNode = xmlObj.DocumentElement.SelectNodes("/msg/appmsg/sourcedisplayname");
+                                        if (findNode != null)
+                                        {
+                                            if (findNode.Count > 0)
+                                            {
+                                                appName = findNode[0]!.InnerText;
+                                            }
+                                        }
+                                        findNode = xmlObj.DocumentElement.SelectNodes("/msg/appmsg/url");
+                                        if (findNode != null)
+                                        {
+                                            if (findNode.Count > 0)
+                                            {
+                                                url = findNode[0]!.InnerText;
+                                            }
+                                        }
+                                        txtMsg = string.Format("{0},标题:{1},链接:{2}", appName, title, url);
+                                    }
+                                    else
+                                    {
+                                        txtMsg = "[分享链接出错了]";
+                                    }
+                                }
+                                else
+                                {
+                                    txtMsg = "[分享链接出错了]";
+                                }
+                            }
+                        }
+                        catch
+                        {
+                            txtMsg = "[分享链接出错了]";
+                        }
+                        break;
+                }
+                string row = string.Format("{2} | {0}:{1}\n", msg.IsSender ? "我" : msg.NickName, txtMsg, TimeStampToDateTime(msg.CreateTime).ToString("yyyy-MM-dd HH:mm:ss"));
+                File.AppendAllText(Path, row);
+            }
+        }
+
+        private static DateTime TimeStampToDateTime(long timeStamp, bool inMilli = false)
+        {
+            DateTimeOffset dateTimeOffset = inMilli ? DateTimeOffset.FromUnixTimeMilliseconds(timeStamp) : DateTimeOffset.FromUnixTimeSeconds(timeStamp);
+            return dateTimeOffset.LocalDateTime;
+        }
+    }
+}

+ 4 - 5
Pages/Workspace.xaml.cs

@@ -16,7 +16,7 @@ using System.Windows.Input;
 using System.Windows.Media;
 using System.Windows.Media.Imaging;
 using System.Windows.Navigation;
-using WechatBakTool.Interface;
+using WechatBakTool.Export;
 using WechatBakTool.Model;
 using WechatBakTool.ViewModel;
 
@@ -91,12 +91,11 @@ namespace WechatBakTool.Pages
                 MessageBox.Show("请选择联系人", "错误");
                 return;
             }
-            IExport export = new HtmlExport();
-            export.InitTemplate(ViewModel.WXContact);
+            string path = Path.Combine(Main2.CurrentUserBakConfig!.UserWorkspacePath, ViewModel.WXContact.UserName + ".txt");
+            IExport export = new TXTExport();
+            export.InitTemplate(ViewModel.WXContact, path);
             export.SetMsg(UserReader, ViewModel.WXContact);
             export.SetEnd();
-            //string path = UserReader.GetSavePath(wXContact);
-            string path = Path.Combine(Main2.CurrentUserBakConfig!.UserWorkspacePath, ViewModel.WXContact.UserName + ".html");
             export.Save(path);
             MessageBox.Show("导出完成");
         }