Esempio n. 1
0
        /// <summary>
        /// 添加新衣物
        /// </summary>
        /// <param name="clothesPic">新衣物照片</param>
        /// <param name="wardrobeID">衣物所属衣橱ID</param>
        /// <param name="name">新衣物名称</param>
        /// <param name="type">新衣物类型</param>
        /// <param name="thickness">新衣物厚度指数</param>
        /// <returns></returns>
        public static bool add(IFormFile clothesPic, int wardrobeID, string name, ClothesType type, int thickness)
        {
            //确保衣橱存在
            if (!WardrobeManager.exist(wardrobeID))
            {
                return(false);
            }

            Clothes clothes = new Clothes(wardrobeID, name, type, thickness);

            clothes.id = clothesDb.InsertReturnIdentity(clothes);

            savePic(clothesPic, clothes);

            TaobaoItem taobaoItem = TaobaoApi.getTaobaoItem(clothes.picPath);

            //处理购衣推荐
            if (taobaoItem != null)
            {
                Thread setCommendThread = new Thread(new ParameterizedThreadStart(UserManager.setRecommend_thread));
                setCommendThread.Start(new SetRecommendInfo(UserManager.similarUsers(WardrobeManager.user(wardrobeID)), taobaoItem));
                //已改为多线程执行
                //UserManager.setRecommend(userID,taobaoItem);
            }

            return(true);
        }
        protected override async Task <List <TaskData> > ExecuteAsyncInternal(TaobaoGetItemTaskData taskData)
        {
            var client = await GetHttpClient();

            var url  = string.Format(Options.UrlTemplate, taskData.ItemId);
            var html = await client.GetStringAsync(url);

            var cq    = new CQ(html);
            var title = cq["#J_Title h3"].Attr("data-title").Trim();
            //china url
            var match = Regex.Match(html, @"descUrl\s*\:\slocation.*(?<url>\/\/.*?)',").Groups["url"];

            //world url
            if (!match.Success)
            {
                match = Regex.Match(html, "descUrlSSL\\s*\\:\\s*\"(?<url>\\/\\/.*?)\".*").Groups["url"];
            }
            var descUrl = match.Value;

            if (descUrl.StartsWith("//"))
            {
                descUrl = $"https:{descUrl}";
            }
            var descJsonp = await client.GetStringAsync(descUrl);

            var descHtml = Regex.Match(descJsonp, @"var\s*desc\s*=\s*'\s*(?<html>[\s\S]*)\s*'\s*;")
                           .Groups["html"].Value;
            var descCq = new CQ(descHtml);
            var images = (await Options.GetImageTaskDataFunc(title, descCq)).Cast <TaskData>().ToList();

            if (Options.CrawlRecordDbFunc != null)
            {
                var db     = Options.CrawlRecordDbFunc();
                var record = await db.TaobaoItems.FirstOrDefaultAsync(t => t.ItemId == taskData.ItemId);

                if (record == null)
                {
                    record = new TaobaoItem
                    {
                        ItemId = taskData.ItemId
                    };
                    db.Add(record);
                }
                record.LastCheckDt = DateTime.Now;
                await db.SaveChangesAsync();
            }

            return(images);
        }
        protected override async Task HandleInternalUnstatable(TaobaoGetItemTaskData taskData,
                                                               CancellationToken ct)
        {
            var client = await GetHttpClient();

            var url  = string.Format(Options.Value.UrlTemplate, taskData.ItemId);
            var html = await client.GetStringAsync(url);

            var cq    = new CQ(html);
            var title = cq["#J_Title h3"].Attr("data-title").Trim();
            //china url
            var match = Regex.Match(html, @"descUrl\s*\:\slocation.*(?<url>\/\/.*?)',").Groups["url"];

            //world url
            if (!match.Success)
            {
                match = Regex.Match(html, "descUrlSSL\\s*\\:\\s*\"(?<url>\\/\\/.*?)\".*").Groups["url"];
            }

            var descUrl = match.Value;

            if (descUrl.StartsWith("//"))
            {
                descUrl = $"https:{descUrl}";
            }

            var descJsonp = await client.GetStringAsync(descUrl);

            var descHtml = Regex.Match(descJsonp, @"var\s*desc\s*=\s*'\s*(?<html>[\s\S]*)\s*'\s*;")
                           .Groups["html"].Value;
            var descCq  = new CQ(descHtml);
            var urlList = await ImageUrlListExtractor.ExtractImageUrlList(descCq);

            var index       = 0;
            var newTaskData = urlList.Select(t =>
            {
                var filename = $"{index++}_{t.Substring(t.LastIndexOf('/') + 1)}";
                if (filename.Contains("?"))
                {
                    filename = filename.Substring(0, filename.IndexOf('?'));
                }

                var data = new DownloadTaskData
                {
                    RelativeFilename = $"{title}/{filename}",
                    Url = t
                };
                return(data);
            }).ToList();

            if (DbContextProvider != null)
            {
                var db = await DbContextProvider.Get();

                var record = await db.TaobaoItems.FirstOrDefaultAsync(t => t.ItemId == taskData.ItemId, ct);

                if (record == null)
                {
                    record = new TaobaoItem
                    {
                        ItemId = taskData.ItemId
                    };
                    db.Add(record);
                }

                record.LastCheckDt = DateTime.Now;
                await db.SaveChangesAsync(ct);
            }

            await TaskDistributor.Distribute(newTaskData);
        }