diff --git a/Functions.cs b/Functions.cs index 999a942..576e03c 100644 --- a/Functions.cs +++ b/Functions.cs @@ -5,10 +5,15 @@ namespace Rehau.Sku.Assist public class Functions : IExcelAddIn { [ExcelFunction(description: "Получение наименования и артикула позиции")] - public static string RAUNAME(string request) + public static object RAUNAME(string request) { SkuAssist.EnsureHttpInitialized(); - return SkuAssist.GetSku(request); + + return ExcelTaskUtil.Run("RAUNAME ASYNC", request, async token => + { + var document = await SkuAssist.GetDocumentAsync(request); + return SkuAssist.GetResultFromDocument(document); + }); } public void AutoClose() diff --git a/SkuAssist.cs b/SkuAssist.cs index b873104..1c0be3b 100644 --- a/SkuAssist.cs +++ b/SkuAssist.cs @@ -18,38 +18,33 @@ namespace Rehau.Sku.Assist } } - public static string GetSku(string request) + public async static Task GetDocumentAsync(string request) { string url = "https://shop-rehau.ru/catalogsearch/result/?q=" + request; - HttpResponseMessage response = GetResponse(url).Result; - var document = GetDocument(response).Result; - var name = document - .All - .Where(e => e.ClassName == "product-item__desc-top") - .Select(e => new { sku = e.Children[0].TextContent, name = e.Children[1].TextContent.Trim(new[] { '\n', ' ' }) }) - .Where(t => !t.sku.Any(c => char.IsLetter(c))) - .FirstOrDefault(); - - return name == null ? "Не найдено" : $"{name.name} ({name.sku})"; - } - - private static async Task GetResponse(string url) - { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; HttpResponseMessage response = await _httpClient.GetAsync(url); response.EnsureSuccessStatusCode(); - return response; - } - private static async Task GetDocument(HttpResponseMessage response) - { + IConfiguration config = Configuration.Default; IBrowsingContext context = BrowsingContext.New(config); string source = await response.Content.ReadAsStringAsync(); return await context.OpenAsync(req => req.Content(source)); } + + public static string GetResultFromDocument(AngleSharp.Dom.IDocument document) + { + var result = document + .All + .Where(e => e.ClassName == "product-item__desc-top") + .Select(e => new { sku = e.Children[0].TextContent, title = e.Children[1].TextContent.Trim(new[] { '\n', ' ' }) }) + .Where(t => !t.sku.Any(c => char.IsLetter(c))) + .FirstOrDefault(); + + return result == null ? "Не найдено" : $"{result.title} ({result.sku})"; + } } }