private async Task <ActionResult> RedirectAmazonAuthorization(AmazonLoginViewModel model) { string accessToken; string tokenType; using (HttpClient client = new HttpClient()) { client.BaseAddress = new Uri(Request.Url.GetLeftPart(UriPartial.Authority)); // HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "/token"); //var reqContent = $"{{\"grant_type\":\"password\",\"username\":\"{model.Email}\",\"password\":\"{model.Password}\"}}"; var Content = new FormUrlEncodedContent(new[] { new KeyValuePair <string, string>("grant_type", "password"), new KeyValuePair <string, string>("username", model.Email), new KeyValuePair <string, string>("password", model.Password), }); var response = await client.PostAsync("/token", Content); string resultContent = await response.Content.ReadAsStringAsync(); var data = JObject.Parse(resultContent); accessToken = data.GetValue("access_token").ToString(); tokenType = data.GetValue("token_type").ToString(); } string url = $"{model.Redirect_Uri}#state={model.State}&access_token={accessToken}&token_type={tokenType}"; return(Redirect(url)); }
public async Task <ActionResult> AmazonLogin(AmazonLoginViewModel model, string returnUrl) { if (!ModelState.IsValid) { return(View(model)); } // This doesn't count login failures towards account lockout // To enable password failures to trigger account lockout, change to shouldLockout: true var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout : false); switch (result) { case SignInStatus.Success: return(await RedirectAmazonAuthorization(model)); case SignInStatus.LockedOut: return(View("Lockout")); case SignInStatus.RequiresVerification: return(RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe })); case SignInStatus.Failure: default: ModelState.AddModelError("", "Invalid login attempt."); return(View(model)); } }
public ActionResult AmazonLogin(string returnUrl) { var model = new AmazonLoginViewModel(); model.State = Request.QueryString["state"]; model.Redirect_Uri = Request.QueryString["redirect_uri"]; model.ClientId = Request.QueryString["client_id"]; //model.VendorId = Request.QueryString["vendorId"]; if (model.State == null || model.Redirect_Uri == null || model.ClientId == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } ViewBag.ReturnUrl = returnUrl; return(View(model)); }
public ActionResult ImportAmazonPurchases(AmazonLoginViewModel amazonLoginViewModel) { var userId = User.Identity.GetUserId(); var folderName = $@"C:\EcommerceTracker\AmazonFiles\{userId}"; var chromeOptions = new ChromeOptions(); chromeOptions.AddUserProfilePreference("download.default_directory", folderName); chromeOptions.AddUserProfilePreference("intl.accept_languages", "nl"); chromeOptions.AddUserProfilePreference("disable-popup-blocking", "true"); // Amazon uses a captcha to prevent headless browsers from logging in // chromeOptions.AddArgument("--headless"); // TODO: Move to seperate method using (var driver = new ChromeDriver(chromeOptions)) { try { // Navigate to Order History Report page driver.Navigate().GoToUrl("https://www.amazon.com/gp/b2b/reports"); // Login to Amazon, with alternate login page detection // TODO: Check if username or password are incorrect var passwordFormFieldExists = driver.FindElementsById("ap_password").Count > 0; if (passwordFormFieldExists) { driver.FindElementById("ap_email").SendKeys(amazonLoginViewModel.EmailAddress); driver.FindElementById("ap_password").SendKeys(amazonLoginViewModel.Password); driver.FindElementById("signInSubmit").Click(); } else { driver.FindElementById("ap_email").SendKeys(amazonLoginViewModel.EmailAddress); driver.FindElementById("continue").Click(); driver.FindElementById("ap_password").SendKeys(amazonLoginViewModel.Password); driver.FindElementById("signInSubmit").Click(); } var waitForForm = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); waitForForm.Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(By.Id("report-form"))); // Look for existing reports // var generatedReportHistoryTableRows = driver.FindElementsByXPath("//*[@class='order-hist-submitted']/tbody/tr"); var startMonthSelect = new SelectElement(driver.FindElementById("report-month-start")); startMonthSelect.SelectByValue("1"); var startDaySelect = new SelectElement(driver.FindElementById("report-day-start")); startDaySelect.SelectByValue("1"); var startYearSelect = new SelectElement(driver.FindElementById("report-year-start")); startYearSelect.SelectByIndex(startYearSelect.Options.Count - 1); driver.FindElementById("report-use-today").Click(); driver.FindElementById("report-name").SendKeys("Generated for Ecommerce Tracker"); driver.FindElementById("report-confirm").Click(); var reportProcessed = false; var reportFailed = false; do { if (driver.FindElementsById("processing-report-table-row").Count < 1) { reportProcessed = true; } else if (driver.FindElementById("processing-long").Displayed) { driver.FindElementByXPath("//*[@id='report-refresh-button']/img").Click(); } else if (driver.FindElementById("processing-failed").Displayed) { reportFailed = true; } Thread.Sleep(TimeSpan.FromSeconds(3)); } while (!reportProcessed && !reportFailed); } catch (Exception e) { Debug.Write(e.Message); TempData["HTML"] = driver.PageSource; return(RedirectToAction("SeleniumError")); } } // TODO: Check if directory exists var fileNames = Directory.GetFiles(folderName); // TODO: Check if files exist var totalFileUploadResults = new FileUploadResultsViewModel { ExistingPurchases = _db.Purchases.Count(x => x.UserId == userId) }; var existingPurchaseFiles = _db.TrackedPurchaseFiles.Where(x => x.UserId == userId).ToList(); foreach (var fileName in fileNames) { if (existingPurchaseFiles.Select(x => x.FileName).Contains(fileName)) { continue; } var fileUploadResult = ImportAmazonFile(fileName); totalFileUploadResults.NewSites += fileUploadResult.NewSites; totalFileUploadResults.NewCategories += fileUploadResult.NewCategories; totalFileUploadResults.NewPurchases += fileUploadResult.NewPurchases; _db.TrackedPurchaseFiles.Add(new TrackedPurchaseFile { UserId = userId, FileName = fileName, FolderName = folderName, Website = "Amazon.com", ImportDate = DateTime.Now }); } _db.SaveChanges(); return(RedirectToAction("FileUploadResults", totalFileUploadResults)); }