Skip to content

Commit

Permalink
Use Firefox instead of Edge due to driver issues (#2)
Browse files Browse the repository at this point in the history
* Use Firefox instead of Edge due to driver issues

* Updated Edge usage
  • Loading branch information
pmahend1 authored Mar 22, 2020
2 parents b57bfec + 7874437 commit 8a03b3b
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 85 deletions.
6 changes: 2 additions & 4 deletions .Net Core/MSRewards/Browser.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
namespace MSRewards
{
abstract class Browser
internal abstract class Browser
{
public string DriverLocation { get; set; }
public string DriverExecutableName { get; set; }

public string ExecutableName { get; set; }

}
}
}
4 changes: 2 additions & 2 deletions .Net Core/MSRewards/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ namespace MSRewards
{
public static class Constants
{

public const string LiveLoginUrl = "https://login.live.com";

public const string LoginEntryName = "loginfmt";
Expand All @@ -28,6 +27,7 @@ public static class Constants
public const string PointsBreakdownUrl = "https://account.microsoft.com/rewards/pointsbreakdown";

public const string UserPointsBreakdownId = "userPointsBreakdown";
}

public const string EdgeUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/82.0.4080.0 Safari/537.36 Edg/82.0.453.2";
}
}
4 changes: 2 additions & 2 deletions .Net Core/MSRewards/EdgeBrowser.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace MSRewards
{
class EdgeBrowser : Browser
internal class EdgeBrowser : Browser
{
}
}
}
154 changes: 88 additions & 66 deletions .Net Core/MSRewards/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@

namespace MSRewards
{
class Program
internal class Program
{
static string email, password;
static async Task Main(string[] args)
private static string email, password;
private List<string> wordList = new List<string>();

private static void Main(string[] args)
{
if (args.Length != 2)
{
Expand All @@ -28,16 +30,14 @@ static async Task Main(string[] args)
password = args[1];
try
{
await new Program().RunProcess();

new Program().RunProcess();
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}


}

private T DownloadJsonData<T>(string url) where T : new()
{
using (var w = new WebClient())
Expand All @@ -53,10 +53,8 @@ static async Task Main(string[] args)
}
}


async Task Login(IWebDriver driverlocal, WebDriverWait localwait)
private void Login(IWebDriver driverlocal, WebDriverWait localwait)
{

//page 1
driverlocal.Navigate().GoToUrl(Constants.LiveLoginUrl);
localwait?.Until(d => d.FindElement(By.Name(Constants.LoginEntryName)));
Expand All @@ -66,34 +64,32 @@ async Task Login(IWebDriver driverlocal, WebDriverWait localwait)
//page2
localwait?.Until(d => d.FindElement(By.Name(Constants.PasswordEntryName)));

await Task.Delay(3000);
// await Task.Delay(3000);

var passwordEntry = driverlocal.FindElement(By.Name(Constants.PasswordEntryName));
passwordEntry.SendKeys(password);


var checkbox = driverlocal.FindElement(By.Name(Constants.CheckboxName));
checkbox.Click();
passwordEntry.SendKeys(Keys.Enter);

await Task.Delay(3000);
//await Task.Delay(3000);

localwait?.Until(e => e.Title.Equals(Constants.RewardsPageTitle));
driverlocal.SwitchTo().DefaultContent();

await Task.Delay(3000);

//await Task.Delay(3000);
}

async Task RunProcess()
private void RunProcess()
{
var options = new FirefoxOptions();
var json = DownloadJsonData<List<string>>(Constants.WordsListUrl);
wordList = DownloadJsonData<List<string>>(Constants.WordsListUrl);
Dictionary<string, (int current, int available)> pointsTuple = new Dictionary<string, (int current, int available)>();
using IWebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(120));

await Login(driver, wait);
Login(driver, wait);
var result = CheckBreakDown(driver, wait);

if (result.Count > 0)
Expand All @@ -119,18 +115,15 @@ async Task RunProcess()
driver.FindElement(By.Id("id_n")).Click();
while (currentPC < availablePC)
{

var index = randy.Next(json.Count);
Search(driver, wait, Constants.BingSearchURL + json[index]);
var index = randy.Next(wordList.Count);
Search(driver, wait, Constants.BingSearchURL + wordList[index]);
currentPC += 5;
if (currentPC >= availablePC)
{
var currentBreakDown = CheckBreakDown(driver, wait);
currentPC = currentBreakDown[0].x;
Console.WriteLine("{0} points of {1} completed", currentBreakDown[0].x, currentBreakDown[0].y);
}


}
}

Expand All @@ -146,15 +139,15 @@ async Task RunProcess()
options.SetPreference(Constants.UserAgentKey, Constants.MobileUserAgent);
options.SetPreference(Constants.PrivateBrowingKey, true);
using var driverM = new FirefoxDriver(options);
WebDriverWait waitM = new WebDriverWait(driverM, TimeSpan.FromSeconds(10));
await Login(driverM, waitM);
WebDriverWait waitM = new WebDriverWait(driverM, TimeSpan.FromSeconds(120));
Login(driverM, waitM);

driverM.Navigate().GoToUrl(Constants.BingSearchURL + "Mobile Search");

while (currentMobile < availableMobile)
{
var index = randy.Next(json.Count);
Search(driverM, waitM, Constants.BingSearchURL + json[index]);
var index = randy.Next(wordList.Count);
Search(driverM, waitM, Constants.BingSearchURL + wordList[index]);
currentMobile += 5;

if (currentMobile >= availableMobile)
Expand All @@ -163,7 +156,6 @@ async Task RunProcess()
currentMobile = currentBreakDown[1].x;
Console.WriteLine("{0} points of {1} completed", currentBreakDown[1].x, currentBreakDown[1].y);
}

}
driverM.Close();
driverM?.Dispose();
Expand All @@ -173,17 +165,17 @@ async Task RunProcess()
if (edgeCur < edgeTot)
{
Console.WriteLine("Running Edge Search");
await EdgeSearch(edgeCur, edgeTot);
}

EdgeSearch(edgeCur, edgeTot);
}
}
catch (Exception e)
{
Console.WriteLine(e.StackTrace);
}
}

}

private List<(int x, int y)> CheckBreakDown(IWebDriver webDriver, WebDriverWait waiter)
{
var result = new List<(int x, int y)>();
Expand All @@ -209,66 +201,96 @@ async Task RunProcess()
{
Console.WriteLine(ex.Message + " \n" + ex.InnerException?.Message);
}

}
return result;
}

[Obsolete]
async Task EdgeSearch(int current, int target)
private void EdgeSearch(int current, int target, bool useFirefox = true)
{
var rand = new Random();

using StreamReader r = new StreamReader("Resources.json");
if (useFirefox)
{
var options = new FirefoxOptions();
options.SetPreference(Constants.UserAgentKey, Constants.EdgeUserAgent);
options.SetPreference(Constants.PrivateBrowingKey, true);
using var ffDriverEdge = new FirefoxDriver(options);
WebDriverWait waitFFEdge = new WebDriverWait(ffDriverEdge, TimeSpan.FromSeconds(120));
Login(ffDriverEdge, waitFFEdge);

ffDriverEdge.Navigate().GoToUrl(Constants.BingSearchURL + "Give me edge points");

string json = r.ReadToEnd();
var jsonObject = JObject.Parse(json);
var id_p = ffDriverEdge.FindElement(By.Id("id_p"));
if(id_p != null)
{
id_p.Click();
}


r.Close();
if (jsonObject != null)
while (current < target)
{
Search(ffDriverEdge, waitFFEdge, Constants.BingSearchURL + wordList[rand.Next(wordList.Count)]);
current += 5;
if (current >= target)
{
var currentBreakDown = CheckBreakDown(ffDriverEdge, waitFFEdge);
current = currentBreakDown[2].x;
Console.WriteLine("{0} points of {1} completed", currentBreakDown[2].x, currentBreakDown[2].y);
}
}
ffDriverEdge.Close();
}
else
{
var edgeBrowser = JsonConvert.DeserializeObject<EdgeBrowser>(jsonObject["Edge"].ToString());
using StreamReader r = new StreamReader("Resources.json");

string jsonString = r.ReadToEnd();
var jsonObject = JObject.Parse(jsonString);

r.Close();

var service = EdgeDriverService.CreateDefaultService(edgeBrowser.DriverLocation, edgeBrowser.DriverExecutableName);
service.UseSpecCompliantProtocol = true;
if (jsonObject != null)
{
var edgeBrowser = JsonConvert.DeserializeObject<EdgeBrowser>(jsonObject["Edge"].ToString());

var service = EdgeDriverService.CreateDefaultService(edgeBrowser.DriverLocation, edgeBrowser.DriverExecutableName);
service.UseSpecCompliantProtocol = true;

service.Start();
service.Start();

var caps = new DesiredCapabilities(new Dictionary<string, object>()
var caps = new DesiredCapabilities(new Dictionary<string, object>()
{
{ "ms:edgeOptions", new Dictionary<string, object>() {
{ "binary", edgeBrowser.ExecutableName }
}}
});

var edgeDriver = new RemoteWebDriver(service.ServiceUrl, caps);

var edgeWait = new WebDriverWait(edgeDriver, TimeSpan.FromSeconds(15));
await Task.Delay(3000);
await Login(edgeDriver, edgeWait);
var edgeDriver = new RemoteWebDriver(service.ServiceUrl, caps);

Search(edgeDriver, edgeWait, Constants.BingSearchURL + "Give me Edge points");
edgeDriver.FindElement(By.Id("id_p"))?.Click();
var edgeWait = new WebDriverWait(edgeDriver, TimeSpan.FromSeconds(15));
//await Task.Delay(3000);
Login(edgeDriver, edgeWait);

Search(edgeDriver, edgeWait, Constants.BingSearchURL + "Give me Edge points");
edgeDriver.FindElement(By.Id("id_p"))?.Click();

while (current < target)
{

Search(edgeDriver, edgeWait, Constants.BingSearchURL + "Tick Tick " + current);
current += 5;
if (current >= target)
while (current < target)
{
var currentBreakDown = CheckBreakDown(edgeDriver, edgeWait);
current = currentBreakDown[2].x;
Console.WriteLine("{0} points of {1} completed", currentBreakDown[2].x, currentBreakDown[2].y);
Search(edgeDriver, edgeWait, Constants.BingSearchURL + jsonString[rand.Next(wordList.Count)]);
current += 5;
if (current >= target)
{
var currentBreakDown = CheckBreakDown(edgeDriver, edgeWait);
current = currentBreakDown[2].x;
Console.WriteLine("{0} points of {1} completed", currentBreakDown[2].x, currentBreakDown[2].y);
}
}

edgeDriver.Close();
service.Dispose();
}
edgeDriver.Close();
service.Dispose();
}

}

private void Search(IWebDriver driver, WebDriverWait wait, string url)
{
try
Expand All @@ -285,4 +307,4 @@ private void Search(IWebDriver driver, WebDriverWait wait, string url)
}
}
}
}
}
2 changes: 1 addition & 1 deletion .Net Core/MSRewards/Resources.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"Edge": {
"DriverLocation": "C:\\Users\\Prateek\\EdgiumDriver",
"DriverLocation": "C:\\Users\\Prateek\\MiscExes",
"DriverExecutableName": "msedgedriver.exe",
"ExecutableName": "C:\\Program Files (x86)\\Microsoft\\Edge Dev\\Application\\msedge.exe"
}
Expand Down
20 changes: 10 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@ Check out Medium blog [Earn 500+ daily Microsoft rewards points automatically wi
### Prerequisites

- Python 3+
- requests
- requests

```shell
pip install requests
```
```shell
pip install requests
```

- selenium
- selenium

```shell
pip install selenium
```
```shell
pip install selenium
```

- Turn off 2 step verification on Microsoft account.

Expand All @@ -49,9 +49,9 @@ Check out Medium blog [Earn 500+ daily Microsoft rewards points automatically wi
This will run for both PC Search and Mobile points until all the points are gained.

- Build the project via Visual Studio 2019

<!---
- Edit **Resources.json** file to point to respective locations for Edgium. Be sure to have right version of Edgium driver downloaded and pointed based on your existing Edgium version. You can download [Edgium driver from here](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)

-->
- Run program

```powershell
Expand Down

0 comments on commit 8a03b3b

Please sign in to comment.