public async Task <List <PortfolioItem> > UpdateListingToDb(StockXAccount login)
            {
                List <PortfolioItem> ListedItems = await login.GetAllListings();

                if (ListedItems == null)
                {
                    Db.UpdateOnly(() => new StockXAccount()
                    {
                        AccountThread = "", NextAccountInteraction = DateTime.Now.AddMinutes(1)
                    }, A => A.Id == login.Id);

                    return(null);
                }

                bool Created = await CreateAnyNewInventory(login, ListedItems);

                if (Created)
                {
                    ListedItems = await login.GetAllListings();
                }

                foreach (var A in ListedItems)
                {
                    UpdateListingInDb(login, A);
                }

                return(ListedItems);
            }
Esempio n. 2
0
        // Define other methods, classes and namespaces here

        public static HttpClient GetHttpClient(this StockXAccount stockAuth)
        {
            WebProxy Proxy = null;

            if (!string.IsNullOrEmpty(stockAuth.ProxyHost))
            {
                Proxy = new WebProxy($"http://{stockAuth.ProxyHost}:{stockAuth.ProxyPort}");

                if (stockAuth.ProxyUsername != null && stockAuth.ProxyPassword != null)
                {
                    Proxy.Credentials = new NetworkCredential(stockAuth.ProxyUsername, stockAuth.ProxyPassword);
                }
            }

            HttpClientHandler proxyhandler = new HttpClientHandler
            {
                AutomaticDecompression = DecompressionMethods.GZip,
                UseCookies             = true,
                //Proxy = Proxy,
                AllowAutoRedirect = true,
                UseProxy          = false,
            };

            return(new HttpClient(proxyhandler));
        }
            public async Task <List <PortfolioItem> > UpdateSoldToDb(StockXAccount login)
            {
                List <PortfolioItem> ListedItems = await login.GetAllPending();

                if (ListedItems == null)
                {
                    Db.UpdateOnly(() => new StockXAccount()
                    {
                        AccountThread = "", NextAccountInteraction = DateTime.Now.AddMinutes(1)
                    }, A => A.Id == login.Id);

                    return(null);
                }

                foreach (var A in ListedItems)
                {
                    if (UpdateToSold(login, A))
                    {
                        ListingExtensions.CreateStockXListingEvent("Sold", A.ChainId, A.SkuUuid, (int)A.LocalAmount, login.UserId, "Sold");

                        Db.UpdateAdd(() => new Inventory()
                        {
                            TotalSold = 1
                        }, Db.From <Inventory>().Where(Ab => Ab.UserId == login.UserId && Ab.Sku == A.SkuUuid));

                        await StockxListingEvent.Sold(A, login);
                    }
                }

                return(ListedItems);
            }
Esempio n. 4
0
        public async Task <StockXAccount> VerifyStockXAccount(StockXAccount Account)
        {
            StockXApiResult <LoginCookieToken> Data;

            Data = await StockxApi.StockXApi.GetLogin(Account);

            switch (Data.Code)
            {
            case HttpStatusCode.OK:
                Db.UpdateOnly(() => new StockXAccount()
                {
                    Token                  = Data.RO.AccessToken,
                    CustomerID             = Data.RO.CustomerInfo.Id,
                    Currency               = Data.RO.CustomerInfo.DefaultCurrency,
                    Verified               = true,
                    LoginFails             = 0,
                    Disabled               = false,
                    NextVerification       = DateTime.Now.AddMinutes(5),
                    NextAccountInteraction = DateTime.Now,
                    AccountThread          = ""
                }, A => A.Id == Account.Id);

                break;

            default:
                try
                {
                    var ErrorMessage = JsonConvert.DeserializeObject <FunBoyAutoErrorResponse>(Data.ResultText);
                    if (ErrorMessage != null)
                    {
                        AuditExtensions.CreateAudit(Db, Account.Id, "FunBoy/VerifyStockXAccount", "Login Failed", ErrorMessage.error);
                        if (ErrorMessage.error.Contains(".wait() for") || ErrorMessage.error.Contains("capchta but solved"))
                        {
                            PushFailedLoginBackIntoqueue(Account);
                            return(Account);
                        }
                    }
                }
                catch (Exception ex)
                {
                }
                Account.LoginFails++;
                Account.NextVerification = DateTime.Now.AddMinutes(Account.LoginFails - 1 * 1.5 + 1);
                if (Account.LoginFails > 12)
                {
                    DisableAccountDuetoLoginFailure(Account);
                    AuditExtensions.CreateAudit(Db, Account.Id, "FunBoy/VerifyStockXAccount", "Login Disabled", Data.ResultText);
                }
                else
                {
                    PushFailedLoginBackIntoqueue(Account);
                }

                break;
            }

            return(Account);
        }
Esempio n. 5
0
 private void PushFailedLoginBackIntoqueue(StockXAccount Account)
 {
     Db.UpdateOnly(() => new StockXAccount()
     {
         LoginFails       = Account.LoginFails,
         NextVerification = Account.NextVerification,
         AccountThread    = ""
     }, A => A.Id == Account.Id);
 }
            private async Task <bool> CreateAnyNewInventory(StockXAccount login, List <PortfolioItem> ListedItems)
            {
                var Created           = false;
                var AllInventory      = Db.Select(Db.From <Inventory>().Where(A => A.UserId == login.UserId && A.StockXAccountId == login.Id && A.Active && A.Quantity > 0));
                var AllListed         = Db.Select(Db.From <StockXListedItem>().Where(A => A.UserId == login.UserId && A.Id == login.Id && !A.Sold));
                var UnListedInventory = AllInventory.Where(A => !ListedItems.Any(B => B.SkuUuid == A.Sku));

                if (ListedItems.Count > 0)
                {
                    var Deleted = AllListed.Where(A => !ListedItems.Any(B => B.ChainId == A.ChainId));
                    foreach (var Delete in Deleted)
                    {
                        Db.Delete(Delete);
                    }
                }
                foreach (var Listling in ListedItems)
                {
                    if (Db.Exists(Db.From <StockXListedItem>().Where(A => A.UserId == login.UserId && A.AccountId == login.Id && A.ChainId == Listling.ChainId)))
                    {
                        continue;
                    }
                    StockXListedItem Item = Listling;
                    Item.UserId    = login.UserId;
                    Item.AccountId = login.Id;

                    Db.Insert(Item);
                }
                foreach (var tory in UnListedInventory)
                {
                    var Listing = await login.MakeListing(tory.StockXUrl, tory.Sku, tory.StartingAsk, StockXAccount.MakeTimeString());

                    if ((int)Listing.Code > 399 && (int)Listing.Code < 500)
                    {
                        throw new NeedsVerificaitonException(login);
                    }
                    if (Listing.Code == System.Net.HttpStatusCode.OK)
                    {
                        StockXListedItem Item = Listing.RO.PortfolioItem;
                        Item.UserId    = login.UserId;
                        Item.AccountId = tory.StockXAccountId;
                        Db.Insert(Item);

                        Db.UpdateAdd(() => new Inventory()
                        {
                            Quantity = -1
                        }, Ab => Ab.Id == tory.Id);
                        AuditExtensions.CreateAudit(Db, login.Id, "StockxListingGetter", "Inventory Created", Listing.RO.PortfolioItem.ChainId);
                        Created = true;
                        await StockxListingEvent.Listed(Item, login);

                        continue;
                    }
                    return(false); //error 500+ -- their server is down end task.
                }

                return(Created);
            }
Esempio n. 7
0
        public static async Task <StockXApiResult <object> > DeleteListin(this StockXAccount stockAuth, string ChainID)
        {
            using (var httpClient = stockAuth.GetHttpClient())
            {
                using (var request = new HttpRequestMessage(new HttpMethod("DELETE"), "https://stockx.com/api/portfolio/" + ChainID))
                {
                    request.Headers.TryAddWithoutValidation("authority", "stockx.com");
                    request.Headers.TryAddWithoutValidation("origin", "https://stockx.com");
                    request.Headers.TryAddWithoutValidation("authorization", "Bearer " + stockAuth.Token);
                    request.Headers.TryAddWithoutValidation("content-type", "application/json");
                    request.Headers.TryAddWithoutValidation("appos", "web");
                    request.Headers.TryAddWithoutValidation("x-requested-with", "XMLHttpRequest");
                    request.Headers.TryAddWithoutValidation("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36");
                    request.Headers.TryAddWithoutValidation("dnt", "1");
                    request.Headers.TryAddWithoutValidation("appversion", "0.1");
                    request.Headers.TryAddWithoutValidation("accept", "*/*");
                    request.Headers.TryAddWithoutValidation("sec-fetch-site", "same-origin");
                    request.Headers.TryAddWithoutValidation("sec-fetch-mode", "cors");
                    request.Headers.TryAddWithoutValidation("referer", "https://stockx.com/sell/" + ChainID);
                    request.Headers.TryAddWithoutValidation("accept-encoding", "gzip, deflate, br");
                    request.Headers.TryAddWithoutValidation("accept-language", "en-US,en;q=0.9");
                    var json = new
                    {
                        chain_id = "",
                        notes    = "User Canceled Bid"
                    };
                    request.Content = new StringContent(JsonConvert.SerializeObject(json));
                    request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");

                    var response = await httpClient.SendAsync(request);

                    var txt = await response.Content.ReadAsStringAsync();

                    if ((int)response.StatusCode > 399)
                    {
                        return(new StockXApiResult <object>()
                        {
                            Code = response.StatusCode,
                            ResultText = txt,
                        });
                    }
                    var settings = new JsonSerializerSettings
                    {
                        NullValueHandling     = NullValueHandling.Ignore,
                        MissingMemberHandling = MissingMemberHandling.Ignore
                    };
                    return(new StockXApiResult <object>()
                    {
                        Code = response.StatusCode,
                        ResultText = txt,
                        RO = JsonConvert.DeserializeObject <GetPagedPortfolioItemsResponse>(txt, settings)
                    });
                }
            }
        }
Esempio n. 8
0
 private void DisableAccountDuetoLoginFailure(StockXAccount Account)
 {
     Db.UpdateOnly(() => new StockXAccount()
     {
         Disabled         = true,
         LoginFails       = Account.LoginFails,
         NextVerification = Account.NextVerification,
         AccountThread    = ""
     }, A => A.Id == Account.Id);
     Task.WaitAll(StockxListingEvent.Disabled(Account));
 }
            private async Task <bool> ProcessListedItem(StockXAccount login, PortfolioItem Item)
            {
                Inventory Invntory = Db.Single <Inventory>(A => A.Active && A.Sku == Item.SkuUuid && A.UserId == login.UserId);

                if (Invntory == null)
                {
                    //  continue;
                    return(false);
                }

                return(await ProcessNewBid(login, Item, Invntory) || await ProcessNewAsk(login, Item, Invntory));
            }
            public async Task <bool> UpdateListingsBidAsk(StockXAccount login, List <PortfolioItem> ListedItems)
            {
                var UpdatedAny = false;

                foreach (var Item in ListedItems)
                {
                    if (await ProcessListedItem(login, Item))
                    {
                        UpdatedAny = true;
                    }
                }
                return(UpdatedAny);
            }
            private void UpdateListingInDb(StockXAccount login, PortfolioItem A)
            {
                var Existing = Db.Single <StockXListedItem>(b => b.ChainId == A.ChainId && b.UserId == login.UserId);

                if (Existing != null)
                {
                    StockXListedItem itm = A;
                    itm.Id        = Existing.Id;
                    itm.Sold      = Existing.Sold;
                    itm.AccountId = Existing.AccountId;
                    itm.UserId    = login.UserId;
                    Db.Update(itm);
                }
            }
Esempio n. 12
0
        private async Task <bool> GetOrListNewInventory(CreateInventoryRequest request, Inventory NewInventory)
        {
            StockXAccount tmp = new StockXAccount()
            {
            };
            var List = await tmp.GetProductFromUrl(request.StockXUrl);

            if (List == null)
            {
                return(false);
            }
            if (List.Product == null)
            {
            }
            var Offers = List.Product.Children.Keys.Select(A => List.Product.Children[A]).ToList();

            if (Offers == null || Offers.Count == 0)
            {
                return(false);
            }

            if (request.Size == "")
            {
                var Item = Offers[0];
                NewInventory.Sku  = Offers[0].Uuid;
                NewInventory.Size = "";
            }
            else
            {
                var Sized = Offers.Where(A => A.ShoeSize == request.Size).FirstOrDefault();
                if (Sized == null)
                {
                    return(false);
                }
                NewInventory.Active          = true;
                NewInventory.StockXAccountId = request.StockXAccountId;
                NewInventory.ParentSku       = Sized.ParentUuid;
                NewInventory.Sku             = Sized.Uuid;
            }

            foreach (var Offer in Offers)
            {
                if (!Db.Exists <StockXChildListing>(A => A.Uuid == NewInventory.Sku))
                {
                    Offer.Url = NewInventory.StockXUrl;
                    Db.Insert(Offer);
                }
            }
            return(true);
        }
Esempio n. 13
0
        public static async Task <List <PortfolioItem> > GetAllListings(this StockXAccount login)
        {
            List <PortfolioItem> OutputItems = new List <PortfolioItem>();
            StockXApiResult <GetPagedPortfolioItemsResponse> GetListings;

            try
            {
                GetListings = await login.GetCurrentListings(login.CustomerID.ToString(), 1);
            }
            catch (Exception ex)
            {
                AuditExtensions.CreateAudit(login.Id, "StockXApi", "GetAllListings", "Error", ex.Message, ex.StackTrace);
                return(null);
            }
            if ((int)GetListings.Code > 399 && (int)GetListings.Code < 500)
            {
                throw new NeedsVerificaitonException(login);
            }
            GetPagedPortfolioItemsResponse Items = GetListings.RO;

            if (Items.PortfolioItems.Count == 0)
            {
                return(OutputItems);
            }
            if (Items.PortfolioItems == null)
            {
                return(null);
            }
            OutputItems.AddRange(Items.PortfolioItems);
            var i = 2;

            while (Items.Pagination != null && Items.Pagination.NextPage != null)
            {
                GetListings = await login.GetCurrentListings(login.CustomerID.ToString(), i ++);

                if ((int)GetListings.Code > 399 && (int)GetListings.Code < 500)
                {
                    throw new NeedsVerificaitonException(login);
                }
                Items = GetListings.RO;
                if (Items.PortfolioItems == null || Items.PortfolioItems.Count == 0)
                {
                    break;
                }
                OutputItems.AddRange(Items.PortfolioItems);
            }
            return(OutputItems);
        }
            private bool UpdateToSold(StockXAccount login, PortfolioItem A)
            {
                var Existing = Db.Single <StockXListedItem>(b => b.ChainId == A.ChainId && b.UserId == login.UserId && !b.Sold);

                if (Existing == null)
                {
                    return(false);
                }

                StockXListedItem itm = A;

                itm.Id        = Existing.Id;
                itm.AccountId = Existing.AccountId;
                itm.UserId    = login.UserId;
                itm.Sold      = true;
                Db.Update(itm);
                return(true);
            }
Esempio n. 15
0
        public static async Task <List <PortfolioItem> > GetAllPending(this StockXAccount login)
        {
            List <PortfolioItem> OutputItems = new List <PortfolioItem>();
            var GetListings = await login.GetCurrentPending(login.CustomerID.ToString(), 1);

            if ((int)GetListings.Code > 399 && (int)GetListings.Code < 500)
            {
                throw new NeedsVerificaitonException(login);
            }
            GetPagedPortfolioItemsResponse Items = GetListings.RO;

            if (Items.PortfolioItems == null)
            {
                return(Array.Empty <PortfolioItem>().ToList());
            }
            if (Items.PortfolioItems.Count == 0)
            {
                return(Items.PortfolioItems);
            }
            OutputItems.AddRange(Items.PortfolioItems);
            var i = 2;

            while (Items.Pagination != null && Items.Pagination.NextPage != null)
            {
                GetListings = await login.GetCurrentPending(login.CustomerID.ToString(), i ++);

                if ((int)GetListings.Code > 399 && (int)GetListings.Code < 500)
                {
                    throw new NeedsVerificaitonException(login);
                }
                Items = GetListings.RO;
                if (Items.PortfolioItems == null || Items.PortfolioItems.Count == 0)
                {
                    return(null);
                }
                OutputItems.AddRange(Items.PortfolioItems);
            }
            return(OutputItems);
        }
            private async Task <bool> ProcessNewBid(StockXAccount login, PortfolioItem Item, Inventory Invntory)
            {
                var Bids = Db.Select(Db.From <StockXBid>().Where(I => I.Sku == Item.SkuUuid && I.Bid >= Invntory.MinSell && I.Bid < Invntory.StartingAsk).OrderByDescending(A => A.Bid));
                var Bid  = Bids.FirstOrDefault();

                if (Bid != null && Bid.Bid != Item.Amount)
                {
                    var Result = await login.UpdateListing(Item.ChainId, Invntory.Sku, Item.ExpiresAt, (int)Bid.Bid);

                    string actionTaken = $"Update Because Bid ({Item.Amount}) -> ({Bid.Bid})";
                    AuditExtensions.CreateAudit(Db, login.Id, "StockxListingGetter", actionTaken, JsonConvert.SerializeObject(Result));
                    ListingExtensions.CreateStockXListingEvent("Bid", Item.ChainId, Invntory.Sku, (int)Bid.Bid, login.UserId, actionTaken);
                    if ((int)Result.Code > 399 && (int)Result.Code < 500)
                    {
                        throw new NeedsVerificaitonException(login);
                    }
                    if (Result.Code == System.Net.HttpStatusCode.OK)
                    {
                        return(true);
                    }
                }
                return(false);
            }
            private async Task <bool> ProcessNewAsk(StockXAccount login, PortfolioItem Item, Inventory Invntory)
            {
                var Asks = Db.Select(Db.From <StockXAsk>().Where(I => I.Sku == Item.SkuUuid && I.Ask >= Invntory.MinSell + 1 && I.Ask < Item.Amount).OrderBy(A => A.Ask));
                var Ask  = Asks.FirstOrDefault();

                if (Ask != null)
                {
                    var Result = await login.UpdateListing(Item.ChainId, Invntory.Sku, Item.ExpiresAt, (int)Ask.Ask - 1);

                    if ((int)Result.Code > 399 && (int)Result.Code < 500)
                    {
                        throw new NeedsVerificaitonException(login);
                    }
                    if (Result.Code == System.Net.HttpStatusCode.OK)
                    {
                        string actionTaken = $"Update Because Ask ({Item.Amount}) -> ({Ask.Ask})";
                        AuditExtensions.CreateAudit(Db, login.Id, "StockxListingGetter", actionTaken, Item.ChainId);
                        ListingExtensions.CreateStockXListingEvent("Bid", Item.ChainId, Invntory.Sku, (int)Ask.Ask, login.UserId, actionTaken);
                        return(true);
                    }
                    return(true);
                }
                return(false);
            }
Esempio n. 18
0
        public static async Task <GetProductSizesReponse> GetProductFromUrl(this StockXAccount stockAuth, string Url)
        {
            using (var httpClient = stockAuth.GetHttpClient())
            {
                string requestUri = $"{Url.Replace("https://stockx.com/", $"https://stockx.com/api/products/")}?includes=market,360&currency={stockAuth.Currency}&country={stockAuth.Country}";
                using (var request = new HttpRequestMessage(new HttpMethod("GET"), requestUri))
                {
                    request.Headers.TryAddWithoutValidation("authority", "stockx.com");
                    request.Headers.TryAddWithoutValidation("dnt", "1");

                    request.Headers.TryAddWithoutValidation("appos", "web");
                    request.Headers.TryAddWithoutValidation("x-requested-with", "XMLHttpRequest");
                    request.Headers.TryAddWithoutValidation("x-anonymous-id", "undefined");
                    request.Headers.TryAddWithoutValidation("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36");
                    request.Headers.TryAddWithoutValidation("appversion", "0.1");
                    request.Headers.TryAddWithoutValidation("accept", "*/*");
                    request.Headers.TryAddWithoutValidation("sec-fetch-site", "same-origin");
                    request.Headers.TryAddWithoutValidation("sec-fetch-mode", "cors");
                    request.Headers.TryAddWithoutValidation("referer", Regex.Replace(Url.Replace("https://stockx.com/", "https://stockx.com/sell"), @"\??.*", ""));
                    request.Headers.TryAddWithoutValidation("accept-encoding", "gzip, deflate, br");
                    request.Headers.TryAddWithoutValidation("accept-language", "en-US,en;q=0.9");

                    var response = await httpClient.SendAsync(request);

                    var txt = await response.Content.ReadAsStringAsync();

                    var settings = new JsonSerializerSettings
                    {
                        NullValueHandling     = NullValueHandling.Ignore,
                        MissingMemberHandling = MissingMemberHandling.Ignore
                    };

                    return(JsonConvert.DeserializeObject <GetProductSizesReponse>(txt, settings));
                }
            }
        }
 public NeedsVerificaitonException(StockXAccount login)
 {
     Login = login;
 }
Esempio n. 20
0
        // [RequiresAnyRole("")]
        public async Task <CreateStockXAccountResponse> Post(CreateStockXAccountRequest request)
        {
            var Validation = new ValidateCreateStockXAccount();
            var Valid      = Validation.Validate(request);

            if (!Valid.IsValid)
            {
                return(new CreateStockXAccountResponse()
                {
                    Message = Valid.Errors.Select(A => A.ErrorMessage).Join("\n"),
                    Success = false
                });
            }

            AppUser User = this.GetCurrentAppUser();
            var     ExistingStockXAccount = Db.Single <StockXAccount>(A => User.Id == A.UserId && A.Email == request.Email);

            if (ExistingStockXAccount != null)
            {
                return(new CreateStockXAccountResponse()
                {
                    Success = false,
                    Message = "StockXAccount already exists"
                });
            }

            var NewStockXAccount = new StockXAccount()
            {
                Email         = request.Email,
                UserId        = User.Id,
                Password      = request.Password,
                ProxyUsername = request.ProxyUsername,
                ProxyPassword = request.ProxyPassword,
                ProxyHost     = request.ProxyHost,
                ProxyPort     = request.ProxyPort,
                ProxyActive   = request.ProxyActive,
            };

            try
            {
                NewStockXAccount.Country                = request.Country;
                NewStockXAccount.Active                 = request.Active;
                NewStockXAccount.CustomerID             = request.CustomerID;
                NewStockXAccount.Currency               = request.Currency;
                NewStockXAccount.Country                = request.Country;
                NewStockXAccount.NextVerification       = DateTime.Now;
                NewStockXAccount.NextAccountInteraction = DateTime.Now;
                var InsertedId = Db.Insert(NewStockXAccount, true);
                return(new CreateStockXAccountResponse()
                {
                    InsertedId = InsertedId,
                    Success = true,
                });
            }
            catch (Exception ex)
            {
                return(new CreateStockXAccountResponse()
                {
                    Message = ex.Message,
                    Success = false
                });
            }
        }
Esempio n. 21
0
        public static async Task <StockXApiResult <ListItemResponse> > MakeListing(this StockXAccount stockAuth, string RefUrl, string skuUuid, int Amount, string ExpiresDate)
        {
            using (var httpClient = stockAuth.GetHttpClient())
            {
                using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://stockx.com/api/portfolio?a=ask"))
                {
                    request.Headers.TryAddWithoutValidation("authority", "stockx.com");
                    request.Headers.TryAddWithoutValidation("origin", "https://stockx.com");
                    request.Headers.TryAddWithoutValidation("authorization", "Bearer " + stockAuth.Token);
                    request.Headers.TryAddWithoutValidation("content-type", "application/json");
                    request.Headers.TryAddWithoutValidation("appos", "web");
                    request.Headers.TryAddWithoutValidation("x-requested-with", "XMLHttpRequest");
                    request.Headers.TryAddWithoutValidation("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36");
                    request.Headers.TryAddWithoutValidation("dnt", "1");
                    request.Headers.TryAddWithoutValidation("appversion", "0.1");
                    request.Headers.TryAddWithoutValidation("accept", "*/*");
                    request.Headers.TryAddWithoutValidation("sec-fetch-site", "same-origin");
                    request.Headers.TryAddWithoutValidation("sec-fetch-mode", "cors");
                    request.Headers.TryAddWithoutValidation("referer", RefUrl.Replace("//stockx.com/", "//stockx.com/sell/"));

                    request.Headers.TryAddWithoutValidation("accept-encoding", "gzip, deflate, br");
                    request.Headers.TryAddWithoutValidation("accept-language", "en-US,en;q=0.9");
                    var NewListing = new ListItemRequest()
                    {
                        Action        = "ask",
                        PortfolioItem = new ListItemRequestPortfolioItem()
                        {
                            LocalAmount   = Amount,
                            ExpiresAt     = ExpiresDate,
                            SkuUuid       = skuUuid,
                            LocalCurrency = stockAuth.Currency,
                            Meta          = new ListItemRequestMeta
                            {
                                DiscountCode = "",
                            }
                        }
                    };
                    var PostJson = JsonConvert.SerializeObject(NewListing);
                    request.Content = new StringContent(PostJson);
                    request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                    var response = await httpClient.SendAsync(request);

                    var txt = await response.Content.ReadAsStringAsync();

                    if ((int)response.StatusCode > 399)
                    {
                        return(new StockXApiResult <ListItemResponse>()
                        {
                            Code = response.StatusCode,
                            ResultText = txt
                        });
                    }

                    var settings = new JsonSerializerSettings
                    {
                        NullValueHandling     = NullValueHandling.Ignore,
                        MissingMemberHandling = MissingMemberHandling.Ignore
                    };
                    return(new StockXApiResult <ListItemResponse>()
                    {
                        RO = JsonConvert.DeserializeObject <ListItemResponse>(txt, settings),
                        Code = response.StatusCode,
                        ResultText = txt
                    });
                }
            }
        }
Esempio n. 22
0
        public static async Task <StockXApiResult <ProductActivityResponse> > GetASks(this StockXAccount stockAuth, Inventory Item, int Page = 1)
        {
            using (var httpClient = stockAuth.GetHttpClient())
            {
                using (var request = new HttpRequestMessage(new HttpMethod("GET"), $"https://stockx.com/api/products/{Item.Sku}/activity?state=400&currency={stockAuth.Currency}&limit=100&page={Page}&sort=amount&order=ASC&country={stockAuth.Country}"))
                {
                    request.Headers.TryAddWithoutValidation("authority", "stockx.com");
                    request.Headers.TryAddWithoutValidation("dnt", "1");

                    request.Headers.TryAddWithoutValidation("appos", "web");
                    request.Headers.TryAddWithoutValidation("x-requested-with", "XMLHttpRequest");
                    request.Headers.TryAddWithoutValidation("x-anonymous-id", "undefined");
                    request.Headers.TryAddWithoutValidation("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36");
                    request.Headers.TryAddWithoutValidation("appversion", "0.1");
                    request.Headers.TryAddWithoutValidation("accept", "*/*");
                    request.Headers.TryAddWithoutValidation("sec-fetch-site", "same-origin");
                    request.Headers.TryAddWithoutValidation("sec-fetch-mode", "cors");
                    request.Headers.TryAddWithoutValidation("referer", Item.StockXUrl);
                    request.Headers.TryAddWithoutValidation("accept-encoding", "gzip, deflate, br");
                    request.Headers.TryAddWithoutValidation("accept-language", "en-US,en;q=0.9");

                    var response = await httpClient.SendAsync(request);

                    var txt = await response.Content.ReadAsStringAsync();

                    if ((int)response.StatusCode > 399)
                    {
                        return(new StockXApiResult <ProductActivityResponse>()
                        {
                            Code = response.StatusCode,
                            ResultText = txt,
                        });
                    }
                    var settings = new JsonSerializerSettings
                    {
                        NullValueHandling     = NullValueHandling.Ignore,
                        MissingMemberHandling = MissingMemberHandling.Ignore
                    };
                    return(new StockXApiResult <ProductActivityResponse>()
                    {
                        Code = response.StatusCode,
                        ResultText = txt,
                        RO = JsonConvert.DeserializeObject <ProductActivityResponse>(txt, settings)
                    });
                }
            }
        }
Esempio n. 23
0
        public static async Task <StockXApiResult <LoginCookieToken> > GetLogin(this StockXAccount stockAuth)
        {
            var tmpdr = Path.GetTempFileName();
            var Json  = Base64Encode(JsonConvert.SerializeObject(stockAuth));
            ProcessStartInfo Processstartinfo;

            if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            {
                Processstartinfo = new ProcessStartInfo("/usr/bin/xvfb-run", $" /usr/bin/node --require ts-node/register StockLoginator.ts --BaseJson={Json} --JobID={tmpdr}   ")
                {
                    UseShellExecute = false,

                    WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory + "NodeStuff"
                };
            }
            else
            {
                string arguments = $"--require ts-node/register StockLoginator.ts --BaseJson={Json} --JobID={tmpdr} ";
                Processstartinfo = new ProcessStartInfo("node", arguments)
                {
                    UseShellExecute = true,

                    WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory + Path.DirectorySeparatorChar + "NodeStuff"
                };
            }

            string jsontxt   = "";
            string outputtxt = "";

            try
            {
                var Proc = new Process
                {
                    StartInfo = Processstartinfo
                };
                Proc.Start();

                //Error = Proc.StandardError.ReadToEnd();
                //   Output = Proc.StandardOutput.ReadToEnd();
                var MaxWait = 40;
                while (!Proc.WaitForExit(5000) && MaxWait-- > 0)
                {
                    await Task.Delay(500);
                }
                if (MaxWait == 0)
                {
                    try
                    {
                        Proc.Kill();
                        AuditExtensions.CreateAudit(stockAuth.Id, "StockXApi", "GetLogin", "Killed Process");
                    }
                    catch (Exception ex)
                    {
                        AuditExtensions.CreateAudit(stockAuth.Id, "StockXApi", "GetLogin", "Error Killing Process", ex.Message, ex.StackTrace);
                    }
                }
                if (File.Exists(tmpdr + ".txt"))
                {
                    outputtxt = File.ReadAllText(tmpdr + ".txt");
                    File.Delete(tmpdr + ".txt");
                }
                if (File.Exists(tmpdr))
                {
                    jsontxt = File.ReadAllText(tmpdr);
                    File.Delete(tmpdr);
                    var settings = new JsonSerializerSettings
                    {
                        NullValueHandling     = NullValueHandling.Ignore,
                        MissingMemberHandling = MissingMemberHandling.Ignore
                    };
                    var JsonObj = JsonConvert.DeserializeObject <LoginCookieToken>(jsontxt, settings);

                    if (JsonObj != null && JsonObj.error == null)
                    {
                        return new StockXApiResult <LoginCookieToken>()
                               {
                                   Code       = HttpStatusCode.OK,
                                   ResultText = jsontxt + outputtxt,
                                   RO         = JsonObj
                               }
                    }
                    ;
                }
                else
                {
                    using (var Db = HostContext.Resolve <IDbConnectionFactory>().Open())
                    {
                        AuditExtensions.CreateAudit(Db, stockAuth.Id, "FunBoy/GetLogin", "Login Attempt", "Login Failed: " + jsontxt + outputtxt);
                    }
                }
                return(new StockXApiResult <LoginCookieToken>()
                {
                    Code = HttpStatusCode.Ambiguous,
                    ResultText = jsontxt + outputtxt + tmpdr,
                });
            }
            catch (Exception ex)
            {
                using (var Db = HostContext.Resolve <IDbConnectionFactory>().Open())
                {
                    AuditExtensions.CreateAudit(Db, stockAuth.Id, "FunBoy/GetLogin", "Login Attempt", "Login Failed: " + jsontxt + outputtxt, ex.Message, ex.StackTrace);
                }
                return(new StockXApiResult <LoginCookieToken>()
                {
                    Code = HttpStatusCode.InternalServerError,
                    ResultText = AppDomain.CurrentDomain.BaseDirectory + "NodeStuff" + ex.Message + ex.StackTrace + outputtxt + jsontxt + tmpdr,
                });
            }
        }
Esempio n. 24
0
        public static async Task <StockXApiResult <GetPagedPortfolioItemsResponse> > GetCurrentListings(this StockXAccount stockAuth, string CusomterID, int Page, string IfNoneMatch = "")
        {
            using (var httpClient = stockAuth.GetHttpClient())
            {
                using (var request = new HttpRequestMessage(new HttpMethod("GET"), $"https://stockx.com/api/customers/{CusomterID}/selling/current?sort=created_at&order=DESC&limit=20&page={Page}&currency={stockAuth.Currency}&country={stockAuth.Country}"))
                {
                    request.Headers.TryAddWithoutValidation("authority", "stockx.com");
                    request.Headers.TryAddWithoutValidation("dnt", "1");
                    request.Headers.TryAddWithoutValidation("authorization", "Bearer " + stockAuth.Token);
                    request.Headers.TryAddWithoutValidation("appos", "web");
                    request.Headers.TryAddWithoutValidation("x-requested-with", "XMLHttpRequest");
                    request.Headers.TryAddWithoutValidation("x-anonymous-id", "undefined");
                    request.Headers.TryAddWithoutValidation("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36");
                    request.Headers.TryAddWithoutValidation("appversion", "0.1");
                    request.Headers.TryAddWithoutValidation("accept", "*/*");
                    request.Headers.TryAddWithoutValidation("sec-fetch-site", "same-origin");
                    request.Headers.TryAddWithoutValidation("sec-fetch-mode", "cors");
                    request.Headers.TryAddWithoutValidation("referer", "https://stockx.com/selling");
                    request.Headers.TryAddWithoutValidation("accept-encoding", "gzip, deflate, br");
                    request.Headers.TryAddWithoutValidation("accept-language", "en-US,en;q=0.9");

                    var response = await httpClient.SendAsync(request);

                    var txt = await response.Content.ReadAsStringAsync();

                    if ((int)response.StatusCode > 399)
                    {
                        return(new StockXApiResult <GetPagedPortfolioItemsResponse>()
                        {
                            Code = response.StatusCode,
                            ResultText = txt,
                        });
                    }

                    var settings = new JsonSerializerSettings
                    {
                        NullValueHandling     = NullValueHandling.Ignore,
                        MissingMemberHandling = MissingMemberHandling.Ignore
                    };

                    return(new StockXApiResult <GetPagedPortfolioItemsResponse>()
                    {
                        Code = response.StatusCode,
                        ResultText = txt,
                        RO = JsonConvert.DeserializeObject <GetPagedPortfolioItemsResponse>(txt, settings)
                    });
                }
            }
        }