CrazyIter_Bin 2 éve
szülő
commit
e2bf758b35

+ 1 - 0
.gitignore

@@ -266,3 +266,4 @@ TEAMModelOS.FunctionV4/Properties/ServiceDependencies/TEAMModel-Test - Zip Deplo
 
 TEAMModelOS.FunctionV4/Properties/ServiceDependencies/teammodelfunction-rc - Zip Deploy/
 /TEAMModelOS.FunctionV4/Properties/serviceDependencies.teammodelfunction-rc - Zip Deploy.json
+/TEAMModelOS/.local-chromium/Win64-970485/chrome-win

+ 2 - 2
TEAMModelOS.FunctionV4/ServiceBus/ActiveTaskTopic.cs

@@ -1312,7 +1312,7 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
                         {
                             //更新课堂时长
                             case "up-duration":
-                                var duration = double.Parse($"{update.data}");
+                                double.TryParse($"{update.data}",out double duration);
                                 lessonRecord.duration = duration;
                                 msgs.Add(update);
                                 try
@@ -1370,7 +1370,7 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
                                     // await _dingDing.SendBotMsg($"{_option.Location},课堂id:{_lessonId} 收到更新", GroupNames.醍摩豆服務運維群組);
                                     BlobDownloadResult baseblobDownload = await _azureStorage.GetBlobContainerClient(blobname).GetBlobClient($"/records/{_lessonId}/IES/base.json").DownloadContentAsync();
                                     LessonBase lessonBase = baseblobDownload.Content.ToObjectFromJson<LessonBase>();
-                                    await  _dingDing.SendBotMsg($"课例记录文件base.json:{lessonBase.ToJsonString()}", GroupNames.成都开发測試群組);
+                                    //await  _dingDing.SendBotMsg($"课例记录文件base.json:{lessonBase.ToJsonString()}", GroupNames.成都开发測試群組);
                                     if (lessonBase != null && lessonBase.summary != null)
                                     {
                                         //lessonRecord.name = lessonBase.summary.activityName;

+ 1 - 0
TEAMModelOS.FunctionV4/TEAMModelOS.FunctionV4.csproj

@@ -18,6 +18,7 @@
 	<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
 		<DefineConstants>DEBUG;TRACE</DefineConstants>
 	</PropertyGroup>
+	 
 	<ItemGroup>
 		<!--<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.CosmosDB" Version="3.0.10" />-->
 		<!--<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.0.1" />-->

+ 43 - 17
TEAMModelOS.FunctionV4/TimeTrigger/IESTimerTrigger.cs

@@ -1,5 +1,7 @@
 using Azure.Cosmos;
 using Azure.Storage.Blobs.Models;
+using DinkToPdf;
+using DinkToPdf.Contracts;
 using HTEXLib.COMM.Helpers;
 using Microsoft.Azure.Cosmos.Table;
 using Microsoft.Azure.Functions.Worker;
@@ -32,33 +34,57 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
         private readonly DingDing _dingDing;
         private readonly AzureStorageFactory _azureStorage;
         private readonly AzureRedisFactory _azureRedis;
-        public IESTimerTrigger(AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis)
+        private readonly IConverter _converter;
+        public IESTimerTrigger(IConverter converter, AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis)
         {
             _azureCosmos = azureCosmos;
             _dingDing = dingDing;
             _azureStorage = azureStorage;
             _azureRedis = azureRedis;
+            _converter = converter;
         } /// <summary>
           /// </summary>
           /// <param name="req"></param>
           /// <param name="log"></param>
           /// <returns></returns>
-        //[Function("FireWallFileLog")]
-        ////https://docs.azure.cn/zh-cn/azure-functions/functions-bindings-timer?tabs=in-process&pivots=programming-language-csharp
-        ////0 1 * * * * 一天中每小时的第 1 分钟
-        ////0 */1 * * * *  每五分钟一次
-        //public async Task FireWallFileLog([TimerTrigger("0 */1 * * * *")] TimerInfo myTimer, ILogger log)
-        //{
-        //    await _dingDing.SendBotMsg($"FireWallFileLog 防火墙日志记录(测试): {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}", GroupNames.成都开发測試群組);
-        //    string location = Environment.GetEnvironmentVariable("Option:Location");
-        //    if (location.Contains("China"))
-        //    {
+        [Function("FireWallFileLog")]
+        //https://docs.azure.cn/zh-cn/azure-functions/functions-bindings-timer?tabs=in-process&pivots=programming-language-csharp
+        //0 1 * * * * 一天中每小时的第 1 分钟
+        //0 */1 * * * *  每五分钟一次
+        public async Task FireWallFileLog([TimerTrigger("0 1 * * * *")] TimerInfo myTimer, ILogger log)
+        {
+            try
+            {
+                string location = Environment.GetEnvironmentVariable("Option:Location");
+                var datetime = DateTimeOffset.UtcNow.AddHours(-1);
+                var y = datetime.Year;
+                var m = datetime.Month >= 10 ? $"{datetime.Month}" : $"0{datetime.Month}";
+                var d = datetime.Day >= 10 ? $"{datetime.Day}" : $"0{datetime.Day}";
+                var h = datetime.Hour >= 10 ? $"{datetime.Hour}" : $"0{datetime.Hour}";
+                if (location.Contains("China"))
+                {
+                    string path = $"resourceId=/SUBSCRIPTIONS/73B7F9EF-D8B7-4444-9E8D-D80B43BF3CD4/RESOURCEGROUPS/TEAMMODELCHENGDU/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/OSFIREWARE/y={y}/m={m}/d={d}/h={h}/m=00/PT1H.json";
+                    var retn = await BILogAnalyseService.GetPathAnalyse(_azureStorage, path, "LogStorage");
+                    if (retn.recCnts.IsNotEmpty())
+                    {
+                        
+                        var topApi = retn.recCnts.SelectMany(x => x.apiCnt).OrderByDescending(o => o.count).Take(5).Select(x => new { x.api, x.ip, x.count });
+                        var topIp = retn.recCnts.SelectMany(x => x.ipCnt).OrderByDescending(o => o.count).Take(5).Select(x => new { x.api, x.ip, x.count });
+                        //https://teammodelos.blob.core.chinacloudapi.cn/0-public/pie-borderRadius.html
+                       
+                        await _dingDing.SendBotMarkdown("防火墙日志记录", $"#### 防火墙日志记录\n> 记录时间:{datetime.AddHours(8).ToString("yyyy-MM-dd HH")}\n> ![screenshot]()\n> ###### 发布时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} [地址]({retn.saveUrls.First()}) \n", GroupNames.成都开发測試群組);
+                    }
+                }
+                else if (location.Contains("Global"))
+                {
+
+                }
+            }
+            catch (Exception ex)
+            {
+               // await _dingDing.SendBotMsg($"FireWallFileLog 防火墙日志记录: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}\n{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
+            }
 
-        //    }
-        //    else if (location.Contains("Global")) { 
-            
-        //    }
-        //    await BILogAnalyseService.GetPathAnalyse(_azureStorage, "", "LogStorage");
-        //}
+        }
     }
 }

+ 1 - 1
TEAMModelOS.FunctionV4/local.settings.json

@@ -4,7 +4,7 @@
     "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=teammodellog;AccountKey=lxVDrgs+6rKtmASL3k1WrarrEd5Rk42wS1Mu5+sqQlPya1JLSlFDtnZUvMPeHHe7zlESfn/1NY7CZdGviy2UCw==;EndpointSuffix=core.chinacloudapi.cn",
     "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
     "Azure:Storage:ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodeltest;AccountKey=O2W2vadCqexDxWO+px+QK7y1sHwsYj8f/WwKLdOdG5RwHgW/Dupz9dDUb4c1gi6ojzQaRpFUeAAmOu4N9E+37A==;EndpointSuffix=core.chinacloudapi.cn",
-    //"Azure:LogStorage:ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodellog;AccountKey=lxVDrgs+6rKtmASL3k1WrarrEd5Rk42wS1Mu5+sqQlPya1JLSlFDtnZUvMPeHHe7zlESfn/1NY7CZdGviy2UCw==;EndpointSuffix=core.chinacloudapi.cn",
+    "Azure:LogStorage:ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodellog;AccountKey=lxVDrgs+6rKtmASL3k1WrarrEd5Rk42wS1Mu5+sqQlPya1JLSlFDtnZUvMPeHHe7zlESfn/1NY7CZdGviy2UCw==;EndpointSuffix=core.chinacloudapi.cn",
     "Azure:ServiceBus:ConnectionString": "Endpoint=sb://teammodelos.servicebus.chinacloudapi.cn/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=Sy4h4EQ8zP+7w/lOLi1X3tGord/7ShFHimHs1vC50Dc=",
     "Azure:Cosmos:ConnectionString": "AccountEndpoint=https://cdhabookdep-free.documents.azure.cn:443/;AccountKey=JTUVk92Gjsx17L0xqxn0X4wX2thDPMKiw4daeTyV1HzPb6JmBeHdtFY1MF1jdctW1ofgzqkDMFOtcqS46by31A==;",
     "Azure:Redis:ConnectionString": "52.130.252.100:6379,password=habook,ssl=false,abortConnect=False,writeBuffer=10240",

+ 0 - 4
TEAMModelOS.SDK/DI/AzureStorage/AzureStorageBlobExtensions.cs

@@ -347,11 +347,8 @@ namespace TEAMModelOS.SDK.DI
 
         public static async Task<string> UploadFileByContainer(this BlobContainerClient blobContainer,   string json, string root, string blobpath, bool contentTypeDefault = true)
         {
-
             // string groupName =folder;
-
             //BlobContainerClient blobContainer = azureStorage.GetBlobContainerClient(name.ToLower().Replace("#", "")); //blobClient.GetContainerReference(groupName);            
-
             var blockBlob = blobContainer.GetBlobClient($"{root}/{blobpath}");
             string content_type = "application/octet-stream";
             if (!contentTypeDefault)
@@ -367,7 +364,6 @@ namespace TEAMModelOS.SDK.DI
             Stream streamBlob = new MemoryStream(bytes);
             await blockBlob.UploadAsync(streamBlob, true);
             blockBlob.SetHttpHeaders(new BlobHttpHeaders { ContentType = content_type });
-
             return blockBlob.Uri.ToString();
         }
 

+ 26 - 0
TEAMModelOS.SDK/DI/DingDing/DingDing.cs

@@ -24,7 +24,33 @@ namespace TEAMModelOS.SDK.DI
         {
             _httpClient = httpClient;
         }
+        /// <summary>
+        /// 發送需要加簽驗證的Bot訊息(msgtype為text)
+        /// </summary>
+        /// <param name="robotUrl">釘釘Robot發送Url</param>
+        /// <param name="secret">加簽密鑰</param>
+        /// <param name="msg">發送訊息</param>
+        /// <returns></returns>
+        public async Task SendBotMarkdown(string title , string text, GroupNames groupkey)
+        {
+            // TODO 有空處理自動抓取方法名,代碼行數顯示
+            //StackTrace st = new StackTrace(new StackFrame(1, true));
+            //StackFrame sf = st.GetFrame(0);            
+            //var f = $"Func:{sf.GetMethod().Name},Line : {sf.GetFileLineNumber()}";
 
+            var content = new { msgtype = "markdown", markdown = new { title= title, text = text } };
+#if DEBUG
+            var keys = GroupNames.成都开发測試群組.GetDescriptionText().Split(',');
+#else
+            var keys = groupkey.GetDescriptionText().Split(',');
+#endif
+            if (keys.Length == 1) await _httpClient.PostAsJsonAsync($"{url}{keys[0]}", content);
+            else
+            {
+                var timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                await _httpClient.PostAsJsonAsync($"{url}{keys[0]}&timestamp={timestamp}&sign={BotAddSign(keys[1], timestamp)}", content);
+            }
+        }
         /// <summary>
         /// 發送需要加簽驗證的Bot訊息(msgtype為text)
         /// </summary>

+ 3 - 1
TEAMModelOS/Controllers/Student/StudentCommonController.cs

@@ -533,8 +533,10 @@ namespace TEAMModelOS.Controllers
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [HttpPost("stu-course")]
+#if !DEBUG
         [Authorize(Roles = "IES")]
-        // [AuthToken(Roles = "student")]
+#endif
+        [AuthToken(Roles = "student")]
         public async Task<IActionResult> StuCourse(JsonElement request)
         {
             var (id, name, pic, school) = HttpContext.GetAuthTokenInfo();

+ 53 - 0
TEAMModelOS/Controllers/System/CoreController.cs

@@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
+using PuppeteerSharp;
 using System;
 using System.Collections.Generic;
 using System.Drawing.Imaging;
@@ -232,6 +233,58 @@ namespace TEAMModelOS.Controllers
             return Ok(new { version, description, nowtime, region, ip });
         }
         /// <summary>
+        /// 网页截图参数
+        /// </summary>
+        public class ScreenshotDto {
+            public int? width { get; set; } = 1920;
+            public int? height { get; set; } = 1080;
+            public string url { get; set; }
+            public string screenshotFile { get; set; }
+        }
+        /// <summary>
+        /// C#使用Puppeteer  http://t.zoukankan.com/zhaotianff-p-13528507.html
+        ///  文档https://learnku.com/docs/puppeteer/3.1.0/class-request/8559
+        ///  https://www.w3cschool.cn/puppeteer/puppeteer-gp1737se.html
+        /// </summary>
+        /// <param name="screenshot"></param>
+        /// <returns></returns>
+        [HttpPost("screenshot")]
+        public async Task<IActionResult> Screenshot(ScreenshotDto screenshot)
+        {
+            //string url = "https://teammodelos.blob.core.chinacloudapi.cn/0-public/pie-borderRadius.html";
+            try {
+                string dir = ".local-chromium";
+                if (!Directory.Exists(dir))
+                {
+                    Directory.CreateDirectory(dir);
+                }
+                await new BrowserFetcher().DownloadAsync("970485");
+                var browser = await Puppeteer.LaunchAsync(new LaunchOptions
+                {
+                    Headless = true,
+                    //ExecutablePath="",
+                    Args = new string[] { "--no-sandbox" }
+                });
+                var page = await browser.NewPageAsync();
+                bool fullPage = true;
+                if (screenshot.width.HasValue && screenshot.height.HasValue)
+                {
+                    await page.SetViewportAsync(new ViewPortOptions
+                    {
+                        Width = screenshot.width.Value,
+                        Height = screenshot.height.Value
+                    });
+                    fullPage = false;
+                }
+                await page.GoToAsync(System.Web.HttpUtility.UrlDecode(screenshot.url));
+                Stream stream = await page.ScreenshotStreamAsync(new ScreenshotOptions { FullPage = fullPage, BurstMode = true });
+                string screenshot_url = await _azureStorage.GetBlobContainerClient("0-public").UploadFileByContainer(stream, "webscreenshot", screenshot.screenshotFile, contentTypeDefault: true);
+                return Ok(new { url = screenshot_url });
+            } catch (Exception ex) {
+                return BadRequest($"{ex.Message}\n{ex.StackTrace}");
+            }
+        }
+        /// <summary>
         /// 等待P1V3,啟動Dcoker,支持EMF GDI+
         /// </summary>
         /// <param name="request"></param>

+ 1 - 0
TEAMModelOS/TEAMModelOS.csproj

@@ -23,6 +23,7 @@
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\TEAMModelOS.SDK\TEAMModelOS.SDK.csproj" />
+	<PackageReference Include="PuppeteerSharp" Version="7.1.0" />
   </ItemGroup>
   <ItemGroup>
     <Reference Include="topsdk-net-core">