diff options
Diffstat (limited to 'Source/Assistant/SkuAssist.cs')
-rw-r--r-- | Source/Assistant/SkuAssist.cs | 94 |
1 files changed, 38 insertions, 56 deletions
diff --git a/Source/Assistant/SkuAssist.cs b/Source/Assistant/SkuAssist.cs index 152dbbb..121bc88 100644 --- a/Source/Assistant/SkuAssist.cs +++ b/Source/Assistant/SkuAssist.cs @@ -1,80 +1,62 @@ -using AngleSharp; -using AngleSharp.Dom; +using AngleSharp.Dom; +using AngleSharp.Html.Dom; using System; using System.Linq; -using System.Net; -using System.Net.Http; using System.Threading.Tasks; +using System.Text.RegularExpressions; namespace Rehau.Sku.Assist { + public enum ResponseOrder + { + NoSettings, + Relevance, + Name, + Price, + Series + } + static class SkuAssist { - private static HttpClient _httpClient; - private enum ResponseOrder - { - NoSettings, - Relevance, - Name, - Price, - Series - } - private static void _EnsureHttpClientRunning() + public static async Task<IProduct> GetProduct(string request) { - if (_httpClient == null) - _httpClient = new HttpClient(); - } + Uri uri = request.ConvertToUri(ResponseOrder.NoSettings); - public async static Task<string> GetContent(string request) - { - Uri uri = _ConvertToUri(request, ResponseOrder.NoSettings); - _EnsureHttpClientRunning(); - ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; + Task<string> contentTask = Task.Run(() => HttpClientUtil.GetContentByUriAsync(uri)); + Task<IDocument> documentTask = await contentTask.ContinueWith(content => HttpClientUtil.ContentToDocAsync(content)); - return await _httpClient.GetStringAsync(uri); + IProduct product = await documentTask.ContinueWith(doc => SkuAssist.GetFirstProduct(doc.Result)); + return product; } - public async static Task<IDocument> GetDocument(Task<string> source) + public static IProduct GetFirstProduct(IDocument doc) { - IConfiguration config = Configuration.Default; - IBrowsingContext context = BrowsingContext.New(config); - - return await context.OpenAsync(req => req.Content(source.Result)); - } - - public static IProduct GetProductFromDocument(IDocument document) - { - return document + return doc .All .Where(e => e.ClassName == "product-item__desc-top") - .Select(e => new Product(e.Children[0].TextContent, e.Children[1].TextContent.Trim(new[] { '\n', ' ' }))) + .Where(e => Regex.IsMatch(e.Children[0].TextContent, @"\d{11}", RegexOptions.None)) + .Select(e => + new Product(e.Children[0].TextContent, + e.Children[1].TextContent.Trim(new[] { '\n', ' ' }))) .FirstOrDefault(); } - private static Uri _ConvertToUri(this string request, ResponseOrder order) + public static Uri GetFirstResultLink(IDocument doc) { - string cleanedRequest = request._CleanRequest(); - switch (order) - { - case ResponseOrder.Relevance: - return new Uri("https://shop-rehau.ru/catalogsearch/result/index/?dir=asc&order=relevance&q=" + cleanedRequest); - case ResponseOrder.Name: - return new Uri("https://shop-rehau.ru/catalogsearch/result/index/?dir=asc&order=name&q=" + cleanedRequest); - case ResponseOrder.Price: - return new Uri("https://shop-rehau.ru/catalogsearch/result/index/?dir=asc&order=price&q=" + cleanedRequest); - case ResponseOrder.Series: - return new Uri("https://shop-rehau.ru/catalogsearch/result/index/?dir=asc&order=sch_product_series&q=" + cleanedRequest); - case ResponseOrder.NoSettings: - return new Uri("https://shop-rehau.ru/catalogsearch/result/?q=" + cleanedRequest); - default: - throw new ArgumentException(); - } + var link = new Uri(doc + .Links + .Where(e => e.ClassName == "product-item__title-link js-name") + .Select(l => ((IHtmlAnchorElement)l).Href) + .FirstOrDefault()); + return link; } - private static string _CleanRequest(this string input) + + public static string GetFistResultImageLink(IDocument doc) { - return input.Replace("+", " plus "); + var imageSource = doc.Images + .Where(x => x.ClassName == "product-item__image") + .FirstOrDefault(); + return imageSource != null ? imageSource.Source : "Нет ссылки"; } } -} - - +}
\ No newline at end of file |