Beispiel #1
0
        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));
        }
Beispiel #2
0
        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));
            }
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        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));
        }