Justin 1 éve
szülő
commit
95f22a00b4

+ 4 - 1
StationProbe/Database.cs

@@ -25,7 +25,10 @@ namespace StationProbe
 
         public void AddImage(Image image)
         {
-            _db.Insert(image);
+            lock (this)
+            {
+                _db.Insert(image);
+            }
         }
 
         public void AddExam(Exam exam)

+ 1 - 1
StationProbe/DingTalk.cs

@@ -29,7 +29,7 @@ namespace StationProbe
             public string ErrorMsg { get; set; } = string.Empty;
 
             [JsonPropertyName("task_id")]
-            public int TaskId {  get; set; }
+            public string TaskId { get; set; } = string.Empty;
 
             [JsonPropertyName("request_id")]
             public string RequestId { get; set; } = string.Empty;

+ 174 - 36
StationProbe/ProbeTask.cs

@@ -1,4 +1,5 @@
 using PuppeteerSharp;
+using static System.Net.Mime.MediaTypeNames;
 
 namespace StationProbe
 {
@@ -34,7 +35,7 @@ namespace StationProbe
         private static string _debugFolder = string.Empty;
         protected readonly Database _db;
 
-        protected ScreenshotOptions _snapshotOpts = new ScreenshotOptions() {Type = ScreenshotType.Jpeg };
+        protected ScreenshotOptions _snapshotOpts = new ScreenshotOptions() {Type = ScreenshotType.Png };
         public static bool DebugMode { get; set; }
 
 
@@ -88,7 +89,6 @@ namespace StationProbe
             if (page != null)
             {
                 await page.GoToAsync(_loginUrl);
-                await page.WaitForNetworkIdleAsync();
 
                 if(DebugMode)
                 {
@@ -98,8 +98,8 @@ namespace StationProbe
                 }
 
                 //username
-                await page.WaitForSelectorAsync("input[_bl_13]");
-                await page.FocusAsync("input[_bl_13]");
+                var userElement = await page.WaitForSelectorAsync("input[id=\"userName\"]");
+                await userElement.FocusAsync();
                 await page.Keyboard.TypeAsync("justin.xing");
 
                 if (DebugMode)
@@ -110,9 +110,9 @@ namespace StationProbe
                 }
 
                 //password
-                await page.WaitForSelectorAsync("input[_bl_14]");
-                await page.FocusAsync("input[_bl_14]");
-                await page.Keyboard.TypeAsync("123456");
+                var passwordElement = await page.WaitForSelectorAsync("input[id=\"password\"]");
+                await passwordElement.FocusAsync();
+                await page.Keyboard.TypeAsync("vinno@123");
 
                 if (DebugMode)
                 {
@@ -122,9 +122,8 @@ namespace StationProbe
                 }
 
                 //login
-                var button = await page.WaitForSelectorAsync("button[_bl_15]");
-                await button.ClickAsync();
-                await page.WaitForNavigationAsync();
+                var loginButtonElement = await page.WaitForSelectorAsync("button[b-kvd270uhz9]");
+                await loginButtonElement.ClickAsync();
                 await page.WaitForNetworkIdleAsync();
 
                 if (DebugMode)
@@ -150,9 +149,12 @@ namespace StationProbe
             var page = inputs[ElementType.Page].As<IPage>();
             if (page != null)
             {
-                var frame = await page.WaitForFrameAsync("");
-                inputs.AddObject(ElementType.Frame, frame);
+                //var frame = await page.WaitForFrameAsync("");
+                //inputs.AddObject(ElementType.Frame, frame);
 
+                var menuElement = await page.QuerySelectorAsync("a[href=\"feedback/list\"]");
+                await menuElement.ClickAsync();
+                await page.WaitForNetworkIdleAsync();
                 if (DebugMode)
                 {
                     var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
@@ -182,9 +184,13 @@ namespace StationProbe
         public override async Task<ElementCollection> ExecuteAsync(ElementCollection inputs)
         {
             var page = inputs[ElementType.Page].As<IPage>();
-            var frame = inputs[ElementType.Frame].As<IFrame>();
-            if(page!= null && frame != null) 
+            //var frame = inputs[ElementType.Frame].As<IFrame>();
+            if(page!= null) //&& frame != null) 
             {
+                var filterElements = await page.QuerySelectorAllAsync("div[class=\"me-3 my-1\"]");
+                var filterElement1 = filterElements[3];
+                var filterElement2 = filterElements[4];
+                
                 //show filter dialog
                 if (DebugMode)
                 {
@@ -194,6 +200,13 @@ namespace StationProbe
                 }
 
                 //input start
+                var openElement1 = await filterElement1.WaitForSelectorAsync("div[class=\"multi-select\"]");
+                await openElement1.ClickAsync();
+                var optionListElement1 = await filterElement1.WaitForSelectorAsync("div[class=\"dropdown-menu shadow\"]");
+                var optionElements = await optionListElement1.QuerySelectorAllAsync("div[class=\"dropdown-item\"]");
+                var targetElement = optionElements[0];
+                await targetElement.ClickAsync();
+
                 if (DebugMode)
                 {
                     var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
@@ -201,6 +214,13 @@ namespace StationProbe
                     SaveDebugSnapshot(fileName, imageData);
                 }
 
+                var openlement2 = await filterElement2.WaitForSelectorAsync("div[class=\"multi-select\"]");
+                await openlement2.ClickAsync();
+                var optionListElement2 = await filterElement2.WaitForSelectorAsync("div[class=\"dropdown-menu shadow\"]");
+                optionElements = await optionListElement2.QuerySelectorAllAsync("div[class=\"dropdown-item\"]");
+                targetElement = optionElements[0];
+                await targetElement.ClickAsync();
+
                 //input end
                 if (DebugMode)
                 {
@@ -209,9 +229,14 @@ namespace StationProbe
                     SaveDebugSnapshot(fileName, imageData);
                 }
 
-                await frame.WaitForSelectorAsync("input[_bl_13]");
-                await frame.FocusAsync("input[_bl_13]");
-                await page.Keyboard.TypeAsync("justin.xing");
+                //await frame.WaitForSelectorAsync("input[_bl_13]");
+                //await frame.FocusAsync("input[_bl_13]");
+                //await page.Keyboard.TypeAsync("justin.xing");
+
+                var searchTableElement = await page.QuerySelectorAsync("div[class=\"table-search\"]");
+                var searchButtonElement = await searchTableElement.QuerySelectorAsync("button[class=\"btn btn-primary btn-xs ms-2\"]");
+                await searchButtonElement.ClickAsync();
+                await page.WaitForNetworkIdleAsync();
 
                 if (DebugMode)
                 {
@@ -219,6 +244,19 @@ namespace StationProbe
                     var fileName = "900000000.jpg";
                     SaveDebugSnapshot(fileName, imageData);
                 }
+
+                var pageinationElement = await page.QuerySelectorAsync("div[class=\"table-pagination\"]");
+                var examCountElement = await pageinationElement.QuerySelectorAsync("div[class=\"d-none d-sm-inline-block\"]");
+                var examCountStr = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", examCountElement);
+                var words = examCountStr.Split(' ');
+                ExamCount = int.Parse(words[1]);
+
+                var pagesElement = await page.QuerySelectorAsync("ul[class=\"pagination\"]");
+                var pageItemElements = await pagesElement.QuerySelectorAllAsync("li");
+                var lastPageElement = pageItemElements[pageItemElements.Length - 2];
+                var textElement = await lastPageElement.QuerySelectorAsync("a");
+                var lastPageStr = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", textElement);
+                PageCount = int.Parse(lastPageStr);
             }
             return inputs;
         }
@@ -232,12 +270,37 @@ namespace StationProbe
             _page = page;
         }
 
+        private async Task JumpToPageAsync(IPage page)
+        {
+            while (true)
+            {
+                var pagesElement = await page.QuerySelectorAsync("ul[class=\"pagination\"]");
+                var pageItemElements = await pagesElement.QuerySelectorAllAsync("li");
+                var currentPageElemment = await pagesElement.QuerySelectorAsync("li[class=\"page-item active\"]");
+                var textElement = await currentPageElemment.QuerySelectorAsync("a");
+                var currentPageStr = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", textElement);
+                var currentPage = int.Parse(currentPageStr);
+                if(currentPage != _page+1)
+                {
+                    var nextPageElement = pageItemElements[pageItemElements.Length - 1];
+                    await nextPageElement.ClickAsync();
+                    await page.WaitForNetworkIdleAsync();
+                }
+                else
+                {
+                    break;
+                }
+            }
+            
+        }
+
         public override async Task<ElementCollection> ExecuteAsync(ElementCollection inputs)
         {
             var page = inputs[ElementType.Page].As<IPage>();
-            var frame = inputs[ElementType.Frame].As<IFrame>();
-            if (page != null && frame != null)
+            //var frame = inputs[ElementType.Frame].As<IFrame>();
+            if (page != null) //&& frame != null)
             {
+                await JumpToPageAsync(page);
                 if (DebugMode)
                 {
                     var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
@@ -264,12 +327,47 @@ namespace StationProbe
             _examIndexInPage = examIndexInPage;
         }
 
+        private async Task JumpToPageAsync(IPage page)
+        {
+            while (true)
+            {
+                var pagesElement = await page.QuerySelectorAsync("ul[class=\"pagination\"]");
+                var pageItemElements = await pagesElement.QuerySelectorAllAsync("li");
+                var currentPageElemment = await pagesElement.QuerySelectorAsync("li[class=\"page-item active\"]");
+                var textElement = await currentPageElemment.QuerySelectorAsync("a");
+                var currentPageStr = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", textElement);
+                var currentPage = int.Parse(currentPageStr);
+                if (currentPage != _pageIndex + 1)
+                {
+                    var nextPageElement = pageItemElements[pageItemElements.Length - 1];
+                    await nextPageElement.ClickAsync();
+                    await page.WaitForNetworkIdleAsync();
+                }
+                else
+                {
+                    break;
+                }
+            }
+
+        }
+
         public override async Task<ElementCollection> ExecuteAsync(ElementCollection inputs)
         {
             var page = inputs[ElementType.Page].As<IPage>();
-            var frame = inputs[ElementType.Frame].As<IFrame>();
-            if (page != null && frame != null)
-            {   //Enter exam
+            //var frame = inputs[ElementType.Frame].As<IFrame>();
+            if (page != null) //&& frame != null)
+            {
+                await JumpToPageAsync(page);
+                var tableElement = await page.QuerySelectorAsync("table[class=\"table table-bordered table-striped table-hover\"]");
+                var examLinkElements = await tableElement.QuerySelectorAllAsync("div[style=\"cursor:pointer;\"]");
+                var eaxmLinkElement = examLinkElements[_examIndexInPage];
+                var patientName = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", eaxmLinkElement);
+                //var examDateStr = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", examLinkElements[6]);
+                var examDate = DateTime.Now; //Parse(examDateStr);
+                //Enter exam
+                await eaxmLinkElement.ClickAsync();
+                //await page.WaitForNavigationAsync();
+                await page.WaitForNetworkIdleAsync();
 
                 if (DebugMode)
                 {
@@ -281,30 +379,70 @@ namespace StationProbe
                 var exmaId = Guid.NewGuid().ToString("N");
                 
                 //Get patient info
-                var patientName = "";
+                //var patientName = "";
                 var patientSex = "";
                 var patientAge = 0;
-                var examDate = DateTime.Now;
+                //var examDate = DateTime.Now;
 
-                //Get report
                 var report = "";
+                var reportElements = await page.QuerySelectorAllAsync("div[class=\"col\"]");
+                foreach ( var reportElement in reportElements)
+                {
+                    var strong = await reportElement.QuerySelectorAsync("strong");
+                    if(strong != null)
+                    {
+                        var content = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", strong);
+                        report += " " + content;
+                    }
+                }
+
+                //Get report
+                //var report = "";
 
                 //Save images.
                 var imageUrls = new List<string>();
-                for (var i = 0; i < imageUrls.Count; i++)
+                var imageDivElements = await page.QuerySelectorAllAsync("div[class=\"bb-img is-preview\"]");
+                if(imageDivElements != null)
                 {
-                    var response = await page.WaitForResponseAsync(imageUrls[i]);
-                    var buffer = await response.BufferAsync();
-                    var image = new Image()
+                    for(var i=0;i<imageDivElements.Length;i++)
+                    {
+                        var imageElement = await imageDivElements[i].WaitForSelectorAsync("img");
+                        var imageUrl = await imageElement.GetPropertyAsync("src");
+                        var url = await imageUrl.JsonValueAsync<string>();
+                        imageUrls.Add(url);
+                    }
+                    await page.ReloadAsync();
+                    Parallel.For(0, imageUrls.Count - 1, async(i) =>
                     {
-                        Id = Guid.NewGuid().ToString("N"),
-                        ExamId = exmaId,
-                        ImageIndex = i,
-                        Data = buffer,
-                        CreateTime = DateTime.Now,
-                    };
-                    _db.AddImage(image);
+                        var url = imageUrls[i];
+                        var response = await page.WaitForResponseAsync(response => (response.Request.Url == url && response.Ok));
+                        var buffer = await response.BufferAsync();
+                        var image = new Image()
+                        {
+                            Id = Guid.NewGuid().ToString("N"),
+                            ExamId = exmaId,
+                            ImageIndex = i,
+                            Data = buffer,
+                            CreateTime = DateTime.Now,
+                        };
+                        _db.AddImage(image);
+                    });
                 }
+                //var imageUrls = new List<string>();
+                //for (var i = 0; i < imageUrls.Count; i++)
+                //{
+                //    var response = await page.WaitForResponseAsync(imageUrls[i]);
+                //    var buffer = await response.BufferAsync();
+                //    var image = new Image()
+                //    {
+                //        Id = Guid.NewGuid().ToString("N"),
+                //        ExamId = exmaId,
+                //        ImageIndex = i,
+                //        Data = buffer,
+                //        CreateTime = DateTime.Now,
+                //    };
+                //    _db.AddImage(image);
+                //}
 
                 //Save exam.
                 var exam = new Exam()

+ 4 - 1
StationProbe/Program.cs

@@ -30,6 +30,7 @@ else
         }
         else
         {
+            ProbeTask.DebugMode = true;
             Console.WriteLine("Downloading headless browser...");
             await new BrowserFetcher().DownloadAsync();
 
@@ -41,7 +42,9 @@ else
                     ProbeTask.InitDebugFolder();
                     await using var browser = (Browser)await Puppeteer.LaunchAsync(new LaunchOptions
                     {
-                        Headless = true
+                        Headless = true,
+                        //Devtools = true
+
                     });
                     await using var page = await browser.NewPageAsync();
                     await page.SetViewportAsync(new ViewPortOptions

+ 8 - 0
StationProbe/Properties/launchSettings.json

@@ -0,0 +1,8 @@
+{
+  "profiles": {
+    "StationProbe": {
+      "commandName": "Project",
+      "commandLineArgs": "run 1"
+    }
+  }
+}

+ 2 - 2
StationProbe/SuperImageTask.cs

@@ -7,7 +7,7 @@ namespace StationProbe
         private readonly Database _db;
         private readonly BatchTask _batchTask;
         private readonly int _examCountInPage;
-        private int _pageIndex = 1;
+        private int _pageIndex = 0;
         private int _examIndex = 0;
         private int _examIndexInPage = 0;
 
@@ -22,7 +22,7 @@ namespace StationProbe
         {
             var outputs = new ElementCollection();
             outputs.AddObject(ElementType.Page, page);
-            var url = "http://192.168.200.85:8080";
+            var url = "http://www.xinglinghui.com:9112/login";//"http://192.168.200.85:8080";
             Logger.WriteLine($"Start login task (url:{url})...");
             try
             {