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); }
// 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); }
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); }
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); }
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) }); } } }
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); } }
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); }
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); }
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); }
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¤cy={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; }
// [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 }); } }
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 }); } } }
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¤cy={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) }); } } }
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, }); } }
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}¤cy={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) }); } } }