aboutsummaryrefslogtreecommitdiff
path: root/Source/Assistant
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Assistant')
-rw-r--r--Source/Assistant/HttpClientUtil.cs74
-rw-r--r--Source/Assistant/IProduct.cs6
-rw-r--r--Source/Assistant/Product.cs14
-rw-r--r--Source/Assistant/SkuAssist.cs94
4 files changed, 127 insertions, 61 deletions
diff --git a/Source/Assistant/HttpClientUtil.cs b/Source/Assistant/HttpClientUtil.cs
new file mode 100644
index 0000000..f9c144b
--- /dev/null
+++ b/Source/Assistant/HttpClientUtil.cs
@@ -0,0 +1,74 @@
+using AngleSharp;
+using AngleSharp.Dom;
+using System;
+using System.Net;
+using System.Net.Http;
+using System.Threading.Tasks;
+using System.Text;
+
+namespace Rehau.Sku.Assist
+{
+ static class HttpClientUtil
+ {
+ private static HttpClient _httpClient = AddIn.httpClient;
+
+ public async static Task<string> GetContentByUriAsync(Uri uri)
+ {
+ ServicePointManager.SecurityProtocol =
+ SecurityProtocolType.Tls12 |
+ SecurityProtocolType.Tls11 |
+ SecurityProtocolType.Tls;
+
+ return await _httpClient.GetStringAsync(uri);
+ }
+
+ public async static Task<IDocument> ContentToDocAsync(Task<string> content)
+ {
+ IConfiguration config = Configuration.Default;
+ IBrowsingContext context = BrowsingContext.New(config);
+
+ return await context.OpenAsync(req => req.Content(content.Result));
+ }
+
+ public static Uri ConvertToUri(this string request, ResponseOrder order)
+ {
+ UriBuilder baseUri = new UriBuilder("https", "shop-rehau.ru");
+
+ baseUri.Path = "/catalogsearch/result/index/";
+ string cleanedRequest = request._CleanRequest();
+
+ switch (order)
+ {
+ case ResponseOrder.Relevance:
+ baseUri.Query = "dir=asc&order=relevance&q=" + cleanedRequest;
+ break;
+ case ResponseOrder.Name:
+ baseUri.Query = "dir=asc&order=name&q=" + cleanedRequest;
+ break;
+ case ResponseOrder.Price:
+ baseUri.Query = "dir=asc&order=price&q=" + cleanedRequest;
+ break;
+ case ResponseOrder.Series:
+ baseUri.Query = "dir=asc&order=sch_product_series&q=" + cleanedRequest;
+ break;
+ case ResponseOrder.NoSettings:
+ baseUri.Query = "q=" + cleanedRequest;
+ break;
+ default:
+ throw new ArgumentException();
+ }
+
+ return baseUri.Uri;
+ }
+
+ private static string _CleanRequest(this string input)
+ {
+ return new StringBuilder(input)
+ .Replace("+", " plus ")
+ .Replace("РХ", "")
+ .Replace("º", " ")
+ .Replace(".", " ")
+ .ToString();
+ }
+ }
+} \ No newline at end of file
diff --git a/Source/Assistant/IProduct.cs b/Source/Assistant/IProduct.cs
index aca3ff5..de0eccf 100644
--- a/Source/Assistant/IProduct.cs
+++ b/Source/Assistant/IProduct.cs
@@ -1,9 +1,11 @@
-namespace Rehau.Sku.Assist
+using System;
+
+namespace Rehau.Sku.Assist
{
interface IProduct
{
string Sku { get; }
string Name { get; }
- string Uri { get; }
+ Uri Uri { get; }
}
}
diff --git a/Source/Assistant/Product.cs b/Source/Assistant/Product.cs
index 17a7065..22905af 100644
--- a/Source/Assistant/Product.cs
+++ b/Source/Assistant/Product.cs
@@ -1,11 +1,12 @@
-namespace Rehau.Sku.Assist
+using System;
+
+namespace Rehau.Sku.Assist
{
public class Product : IProduct
{
public string Sku { get; }
public string Name { get; }
-
- public string Uri => throw new System.NotImplementedException();
+ public Uri Uri { get; }
public Product(string sku, string name)
{
@@ -13,6 +14,13 @@
Name = name;
}
+ public Product(string sku, string name, string uri)
+ {
+ Sku = sku;
+ Name = name;
+ Uri = new Uri(uri);
+ }
+
public override string ToString()
{
return $"{this.Name} ({this.Sku})";
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