Пример #1
0
        /// <inheritdoc cref="IExchangeService.GetList"/>
        public ServiceResult <IList <Exchange> > GetList(ExchangeFilter filter)
        {
            var result = new ServiceResult <IList <Exchange> >();

            try
            {
                result.InnerResult = _repo.GetList(filter);
                result.IsSuccess   = true;
            }
            catch (Exception ex)
            {
                result.InnerException = ex;
                result.ErrorMessage   = ex.Message;
            }

            return(result);
        }
 /// <inheritdoc cref="IExchangeRepo.GetList"/>
 public IList <Exchange> GetList(ExchangeFilter filter)
 {
     return(base.GetList <ExchangeFilter>(filter));
 }
        /// <inheritdoc cref="IExchangeGrabService.GetList(ExchangeFilter)"/>
        public ServiceResult <IList <Exchange> > GetList(ExchangeFilter filter)
        {
            var method = MethodBase.GetCurrentMethod();
            var result = new ServiceResult <IList <Exchange> >();

            result.InnerResult = new List <Exchange>();
            if (!filter.Date.HasValue)
            {
                filter.Date = DateTime.Now;
            }

            var queryStartDate = filter.Date.Value.AddDays(-10).Date.ToString("yyyy/MM/dd");
            var queryEndDate   = filter.Date.Value.Date.ToString("yyyy/MM/dd");

            var client  = new RestClient("https://www.taifex.com.tw/cht/3/dailyFXRate");
            var request = new RestRequest(Method.POST);

            request.AddHeader("content-type", "application/x-www-form-urlencoded");
            request.AddParameter("application/x-www-form-urlencoded", $"queryStartDate={queryStartDate.UrlEncode()}&queryEndDate={queryEndDate.UrlEncode()}", "application/x-www-form-urlencoded", ParameterType.RequestBody);
            var response = client.Execute(request);

            if (response.IsSuccessful)
            {
                var doc = new HtmlDocument();
                doc.LoadHtml(response.Content);
                _logger.LogTrace(response.Content);
                var count = 0;
                foreach (var row in doc.DocumentNode.SelectNodes("//*[contains(@class, \"table_c\")]/tbody/tr"))
                {
                    count++;
                    if (count == 1)
                    {
                        continue;
                    }

                    // 日期 美元/新台幣 人民幣/新台幣 歐元/美元 美元/日幣 英鎊/美元 澳幣/美元 美元/港幣 美元/人民幣 美元/南非幣 紐幣/美元
                    var items = row.SelectNodes("td");
                    if (items.Count > 0 &&
                        !string.IsNullOrEmpty(items[(int)ExchangeProps.Date].InnerText) &&
                        !string.IsNullOrWhiteSpace(Regex.Unescape(items[(int)ExchangeProps.UsdTwd].InnerText.Replace("-", string.Empty))))
                    {
                        var item = new Exchange()
                        {
                            Date = DateTime.Parse(items[(int)ExchangeProps.Date].InnerText),
                            Data = new List <ExchangeItem>(),
                        };

                        for (var i = (int)ExchangeProps.UsdTwd; i < (int)ExchangeProps.End; i++)
                        {
                            if (!string.IsNullOrWhiteSpace(Regex.Unescape(items[i].InnerText.Replace("-", string.Empty))))
                            {
                                var value   = decimal.Parse(Regex.Unescape(items[i].InnerText));
                                var subItem = new ExchangeItem()
                                {
                                    Id    = ((ExchangeProps)i).ExtGetDescription(),
                                    Value = value
                                };

                                if (subItem.Value > 0)
                                {
                                    item.Data.Add(subItem);
                                }
                            }
                        }

                        if (item.Data.Count > 0)
                        {
                            result.InnerResult.Add(item);
                        }
                    }
                }
            }
            else
            {
                _logger.LogError(result.InnerException, $"{method.Name} raise exception in RESTSharp");
            }

            result.IsSuccess = true;
            return(result);
        }