using System; using System.Collections.Generic; using System.Linq; using sharpknife.Controls; using System.Windows.Navigation; using System.Threading; using System.Drawing; using System.Net; #if WIN32 using MSHTML; #else using mshtml; #endif using System.Runtime.InteropServices; using sharpknife.Utils; using sharpknife.Strategies; namespace sharpknife.Commands { public class AdCommand : TimedCommand { private WebBrowserControl browser; private bool navigated = false; private bool inputRequired = false; private PTCSource source; public PTCSource Source { get { return source; } set { source = value; SourceName = source.Name; OnPropertyChanged("SourceName"); } } public string SourceName { get; set; } private Strategy strategy; public enum BonusValue { Cents, Points, Share, GameTokens } private BonusValue bonus; public BonusValue Bonus { get { return bonus; } set { bonus = value; OnPropertyChanged("Bonus"); } } private decimal value; public decimal Value { get { return value; } set { this.value = value; OnPropertyChanged("Value"); } } private string link; public string Link { get { return link; } set { link = value; OnPropertyChanged("Link"); } } public bool RequiresCaptcha { get; set; } public bool Validated { get; set; } public AdCommand() : base(30) { } public AdCommand(string link, int duration, BonusValue bonus, decimal value, string name) : base(duration) { this.Group = "Browser"; this.Link = link; this.Timeout = 45; this.Bonus = bonus; this.value = value; this.RequiresCaptcha = true; this.Validated = false; browser = WebBrowserControl.GetWebBrowserControl(); Source = PTCSource.GetSource(name); strategy = Strategy.GetStrategy(name); } public override void Execute() { if (!string.IsNullOrWhiteSpace(source.AllowedHost) && source.AllowedHost != "*" && !StringUtils.Contains(Environment.MachineName, source.AllowedHost)) { Cancel(); return; } base.Execute(); navigated = false; browser.LoadCompleted += AdCommand_LoadCompleted; Debug = "Navigate"; browser.Navigate(Link); Debug = "Navigating"; while (inputRequired || (!TimedOut && !navigated && !Validated)) { Thread.Sleep(1000); //CheckValidation(); #region Clicksia if (StringUtils.Contains(Source.Name, "Clicksia")) { browser.Dispatcher.BeginInvoke(new ThreadStart(() => { if (!string.IsNullOrEmpty(browser.Html) && StringUtils.Contains(browser.Html, "Click the upside down picture")) { browser.LoadCompleted -= AdCommand_LoadCompleted; navigated = true; } })); } #endregion #region ClixSense //if (StringUtils.Contains(Source.Name, "ClixSense")) //{ // browser.Dispatcher.BeginInvoke(new ThreadStart(() => // { // if (!string.IsNullOrEmpty(browser.Html) && StringUtils.Contains(browser.Html, "Click on the Cat")) // { // browser.LoadCompleted -= AdCommand_LoadCompleted; // navigated = true; // } // })); //} #endregion #region GetPaidMail if (StringUtils.Contains(Source.Name, "GetPaidMail")) { browser.Dispatcher.BeginInvoke(new ThreadStart(() => { if (!string.IsNullOrEmpty(browser.Html)) { IHTMLWindow2[] windows = HtmlUtils.GetFrames(browser.Document); foreach (IHTMLWindow2 window in windows) { try { if (navigated) { break; } if (window.document == null || window.document.body == null) { continue; } string html = window.document.body.innerHTML; if (StringUtils.Contains(html, "Thank you for supporting our sponsors!")) { Debug = "Wating"; } else if (StringUtils.Contains(window.document.body.innerHTML, "Your account has been credited")) { Debug = "Your account has been credited"; browser.LoadCompleted -= AdCommand_LoadCompleted; Complete(); navigated = true; } else if (StringUtils.Contains(browser.Html, "You must let ad timers expire before clicking on another ad!")) { browser.LoadCompleted -= AdCommand_LoadCompleted; Failed("You must let ad timers expire before clicking on another ad!"); navigated = true; } } catch (UnauthorizedAccessException) { } } } })); } #endregion #region Incentria if (StringUtils.Contains(Source.Name, "Incentria")) { browser.Dispatcher.BeginInvoke(new ThreadStart(() => { if (!string.IsNullOrEmpty(browser.Html) && StringUtils.Contains(browser.Html, "Click the upside down picture")) { browser.LoadCompleted -= AdCommand_LoadCompleted; navigated = true; } })); } #endregion } if (IsCompleted) { return; } int waiting = 0; if (TimedOut) { browser.LoadCompleted -= AdCommand_LoadCompleted; Status = StatusCode.Expired; } else { #region Clicksia if (Source.Name == "Clicksia") { waiting = 0; bool proceed = false; while (waiting < Timeout && !proceed) { Thread.Sleep(1000); waiting++; Debug = "Sleeping"; browser.Dispatcher.BeginInvoke(new ThreadStart(() => { if (!proceed && !string.IsNullOrEmpty(browser.Html) && StringUtils.Contains(browser.Html, "Click the upside down picture")) { proceed = true; } })); } if (!TimedOut) { Debug = "Solving captcha"; browser.Dispatcher.BeginInvoke(new ThreadStart(() => { Status = StatusCode.Paused; if (strategy.SolveCaptcha(browser, Source)) { browser.LoadCompleted -= AdCommand_LoadCompleted; Debug = "Captcha solved"; Status = StatusCode.Executing; } else { Debug = "Input required"; inputRequired = true; } })); Thread.Sleep(1000); while (Status == StatusCode.Paused) { Debug = "Waiting for redirection"; Thread.Sleep(1000); } Thread.Sleep(5000); Status = StatusCode.Completed; } else { Expire(); } return; } #endregion #region ClixSense if (StringUtils.Contains(Source.Name, "ClixSense")) { if (Duration < 5) Duration = 5; if (RequiresCaptcha) { Debug = "Solving captcha"; Status = StatusCode.Paused; //browser.Dispatcher.BeginInvoke(new ThreadStart(() => //{ // //This Ad is no longer active // if (StringUtils.Contains(browser.Html, "This Ad is no longer active")) // { // Status = StatusCode.Failed; // return; // } // else if (strategy.SolveCaptcha(browser, Source)) // { // browser.LoadCompleted -= AdCommand_LoadCompleted; // Status = StatusCode.Executing; // browser.SetFocus(); // } // else // { // Debug = "Input required"; // inputRequired = true; // } //})); } while (Status == StatusCode.Paused) { Sleep(1); //CheckValidation(); } if (Validated) { Complete(); return; } Sleep(Duration); Complete(); return; } #endregion #region DonkeyMails //else if (Source.Name == "DonkeyMails") //{ // Debug = "Solving captcha"; // Status = StatusCode.Paused; // browser.LoadCompleted -= AdCommand_LoadCompleted; // browser.Dispatcher.BeginInvoke(new ThreadStart(() => // { // if (strategy.SolveCaptcha(browser, Source)) // { // Status = StatusCode.Executing; // } // else // { // Debug = "Input required"; // } // })); // Sleep(1); // while (Status == StatusCode.Paused) // { // Sleep(1); // CheckValidation(); // } // if (Validated) // { // return; // } // Sleep(Duration); // Complete(); // return; //} else if (StringUtils.Contains(Source.Name, "DonkeyMails")) { Debug = "Solving captcha"; browser.Dispatcher.BeginInvoke(new ThreadStart(() => { Status = StatusCode.Paused; browser.LoadCompleted -= AdCommand_LoadCompleted; if (string.IsNullOrEmpty(browser.Html) || StringUtils.Contains(browser.Html, "CashCrusader Version:")) { Failed("Expired session"); return; } strategy.SolveCaptcha(browser, Source); Status = StatusCode.Executing; })); Thread.Sleep(1000); while (Status == StatusCode.Paused) { Thread.Sleep(1000); } if (Duration < 5) Duration = 5; waiting = 0; while (waiting < Duration) { Thread.Sleep(1000); waiting++; Debug = string.Format("Sleeping {0}s", Duration - waiting); } Status = StatusCode.Completed; return; } #endregion #region EuroPinata else if (Source.Name == "EuroPinata") { //if (Duration < 5) Duration = 5; //Sleep(Duration); //Debug = "Solving captcha"; //Status = StatusCode.Paused; ////browser.Dispatcher.BeginInvoke(new ThreadStart(() => ////{ //// //This Ad is no longer active //// if (StringUtils.Contains(browser.Html, "This Ad is no longer active")) //// { //// Status = StatusCode.Failed; //// return; //// } //// else if (strategy.SolveCaptcha(browser, Source)) //// { //// browser.LoadCompleted -= AdCommand_LoadCompleted; //// Status = StatusCode.Executing; //// browser.SetFocus(); //// } //// else //// { //// Debug = "Input required"; //// inputRequired = true; //// } ////})); //Complete(); //return; if (Duration < 5) Duration = 5; waiting = 0; while (waiting < Duration) { Thread.Sleep(1000); waiting++; Debug = string.Format("Sleeping {0}s", Duration - waiting); } Debug = "Solving captcha"; browser.Dispatcher.BeginInvoke(new ThreadStart(() => { Status = StatusCode.Paused; if (strategy.SolveCaptcha(browser, Source)) { browser.LoadCompleted -= AdCommand_LoadCompleted; Status = StatusCode.Executing; } else { Debug = "Input required"; inputRequired = true; } })); Thread.Sleep(1000); while (Status == StatusCode.Paused) { Thread.Sleep(1000); } Thread.Sleep(5000); Status = StatusCode.Completed; return; } #endregion #region GetPaidMail else if (Source.Name == "GetPaidMail") { if (Duration < 5) Duration = 5; waiting = 0; while (waiting < Duration) { Thread.Sleep(1000); waiting++; Debug = string.Format("Sleeping {0}s", Duration - waiting); } Complete(); return; } #endregion #region Incentria else if (Source.Name == "Incentria") { waiting = 0; bool proceed = false; while (waiting < Timeout && !proceed) { Thread.Sleep(1000); waiting++; Debug = "Sleeping"; browser.Dispatcher.BeginInvoke(new ThreadStart(() => { if (!proceed && !string.IsNullOrEmpty(browser.Html) && StringUtils.Contains(browser.Html, "Click the upside down picture")) { proceed = true; } })); } if (!TimedOut) { Debug = "Solving captcha"; browser.Dispatcher.BeginInvoke(new ThreadStart(() => { Status = StatusCode.Paused; if (strategy.SolveCaptcha(browser, Source)) { browser.LoadCompleted -= AdCommand_LoadCompleted; Debug = "Captcha solved"; Status = StatusCode.Executing; } else { Debug = "Input required"; inputRequired = true; } })); Thread.Sleep(1000); while (Status == StatusCode.Paused) { Debug = "Waiting for redirection"; Thread.Sleep(1000); } Thread.Sleep(5000); Status = StatusCode.Completed; } else { Expire(); } return; } #endregion #region JillsClickCorner else if (Source.Name == "JillsClickCorner") { browser.LoadCompleted -= AdCommand_LoadCompleted; Debug = "Solving captcha"; browser.Dispatcher.BeginInvoke(new ThreadStart(() => { Status = StatusCode.Paused; strategy.SolveCaptcha(browser, Source); Status = StatusCode.Executing; })); Thread.Sleep(1000); while (Status == StatusCode.Paused) { Thread.Sleep(1000); } Debug = "Parsing duration"; browser.Dispatcher.BeginInvoke(new ThreadStart(() => { Status = StatusCode.Paused; string html = string.Empty; FramesCollection frames = browser.Document.frames; try { for (int i = 0; i < frames.length; i++) { object refIndex = i; IHTMLWindow2 frame = (IHTMLWindow2)frames.item(ref refIndex); if (frame.name == "timer") { if (frame.document != null && frame.document.body != null) { html = frame.document.body.innerHTML; } break; } } } catch (UnauthorizedAccessException uae) { LogItem item = new LogItem(uae.Message); item.Save(); Failed("Unauthorized Access Exception"); return; } //Please visit the site for 25 seconds and then you will be credited if (StringUtils.Contains(html, "Please visit the site for")) { string[] tokens = StringUtils.GetTokens(html, "{}Please visit the site for {} seconds and then you will be credited{}"); string timer = tokens[1]; Duration = int.Parse(timer) + 5; } else if (StringUtils.Contains(html, "You have been credited")) { Duration = 0; } Status = StatusCode.Executing; })); Thread.Sleep(1000); while (Status == StatusCode.Paused) { Thread.Sleep(1000); } if (Duration < 5) Duration = 5; Sleep(Duration); Complete(); return; } #endregion #region MyFreeShares else if (Source.Name == "MyFreeShares") { browser.LoadCompleted -= AdCommand_LoadCompleted; if (Duration < 5) Duration = 5; waiting = 0; while (waiting < Duration) { Thread.Sleep(1000); waiting++; Debug = string.Format("Sleeping {0}s", Duration - waiting); } Status = StatusCode.Completed; return; } #endregion #region NeoBux else if (Source.Name == "NeoBux") { if (Duration < 5) Duration = 5; Sleep(Duration); Complete(); return; } #endregion #region NoMininum else if (StringUtils.Contains(Source.Name, "No-Minimum")) { Debug = "Solving captcha"; browser.Dispatcher.BeginInvoke(new ThreadStart(() => { Status = StatusCode.Paused; browser.LoadCompleted -= AdCommand_LoadCompleted; strategy.SolveCaptcha(browser, Source); Status = StatusCode.Executing; })); Thread.Sleep(1000); while (Status == StatusCode.Paused) { Thread.Sleep(1000); } if (Duration < 5) Duration = 5; waiting = 0; while (waiting < Duration) { Thread.Sleep(1000); waiting++; Debug = string.Format("Sleeping {0}s", Duration - waiting); } Status = StatusCode.Completed; return; } #endregion #region ProBux else if (Source.Name == "ProBux") { if (Duration < 5) Duration = 5; Sleep(Duration); Complete(); return; } #endregion #region SamBux else if (Source.Name == "SamBux") { if (Duration < 5) Duration = 5; Sleep(Duration); Complete(); return; } #endregion #region VoBux else if (Source.Name == "VoBux") { if (Duration < 5) Duration = 5; Sleep(Duration); Complete(); return; } #endregion #region WordLinx else if (StringUtils.Contains(Source.Name, "WordLinx")) { if (Duration < 5) Duration = 5; waiting = 0; while (waiting < Duration) { Thread.Sleep(1000); waiting++; Debug = string.Format("Sleeping {0}s", Duration - waiting); } Debug = "Removing frame"; browser.Dispatcher.BeginInvoke(new ThreadStart(() => { Status = StatusCode.Paused; browser.LoadCompleted -= AdCommand_LoadCompleted; IHTMLElementCollection elements = HtmlUtils.GetElementCollection(browser.Document, "a"); foreach (IHTMLElement element in elements) { IHTMLAnchorElement anchor = (IHTMLAnchorElement)element; if (StringUtils.Contains(element.innerText, "Remove Frame")) { element.click(); break; } } Status = StatusCode.Executing; })); Thread.Sleep(1000); while (Status == StatusCode.Paused) { Thread.Sleep(1000); } Thread.Sleep(5000); Status = StatusCode.Completed; return; } #endregion #region YouRoMail else if (Source.Name == "YouRoMail") { if (Duration < 5) Duration = 5; waiting = 0; while (waiting < Duration) { Thread.Sleep(1000); waiting++; Debug = string.Format("Sleeping {0}s", Duration - waiting); } browser.LoadCompleted -= AdCommand_LoadCompleted; Status = StatusCode.Completed; return; } #endregion throw new Exception(string.Format("Undefined strategy: {0}", source.Name)); } } public override void Expire() { base.Expire(); browser.LoadCompleted -= AdCommand_LoadCompleted; browser.Stop(); } public override void Cancel() { base.Cancel(); browser.LoadCompleted -= AdCommand_LoadCompleted; browser.Stop(); } public override void Complete() { base.Complete(); browser.LoadCompleted -= AdCommand_LoadCompleted; browser.Stop(); } void AdCommand_LoadCompleted(object sender, NavigationEventArgs e) { string uri = StringUtils.CleanUri(e.Uri.AbsoluteUri); string baseUrl = StringUtils.CleanUri(Source.BaseUrl); string loginUrl = StringUtils.CleanUri(Source.LogInUrl); string balanceUrl = StringUtils.CleanUri(Source.BalanceUrl); if (Status != StatusCode.Executing && Status != StatusCode.Waiting) { return; } browser.SetFocus(); #region Clicksia if (StringUtils.Contains(Source.Name, "Clicksia")) { if (!inputRequired) { string head = ((IHTMLElement)HtmlUtils.GetHead(browser.Document)).innerHTML; //init_s( 10 ) if (StringUtils.Contains(head, "init_s( ")) { string timer = StringUtils.GetTokens(head, "{}init_s( {} ){}")[1]; Duration = int.Parse(timer) + 5; } navigated = true; } else { browser.LoadCompleted -= AdCommand_LoadCompleted; Status = StatusCode.Executing; } return; } #endregion #region ClixSense else if (StringUtils.Contains(Source.Name, "ClixSense")) { navigated = true; return; } #endregion #region DonkeyMails else if (StringUtils.Contains(Source.Name, "DonkeyMails")) { //if (strategy.CheckLogin(browser, source) && !StringUtils.Contains(uri, loginUrl)) //{ // browser.Navigate(source.LogInUrl); // return; //} //else if (StringUtils.Contains(uri, "www.donkeymails.com/pages/enter.php")) //{ // browser.Navigate(link); // return; //} ////else if (strategy.CheckLogin(browser, source) && StringUtils.Contains(uri, loginUrl)) ////{ //// strategy.Login(browser, source); //// return; ////} ////else if (StringUtils.Contains(uri, loginUrl)) ////{ //// browser.Navigate(link); //// return; ////} ////else //else { navigated = true; return; } } #endregion #region EuroPinata else if (StringUtils.Contains(Source.Name, "EuroPinata")) { navigated = true; return; } #endregion #region GetPaidMail else if (StringUtils.Contains(Source.Name, "GetPaidMail")) { //navigated = true; return; } #endregion #region Incentria else if (StringUtils.Contains(Source.Name, "Incentria")) { if (!inputRequired) { string head = ((IHTMLElement)HtmlUtils.GetHead(browser.Document)).innerHTML; //init_s( 10 ) if (StringUtils.Contains(head, "init_s( ")) { string timer = StringUtils.GetTokens(head, "{}init_s( {} ){}")[1]; Duration = int.Parse(timer) + 5; } navigated = true; } else { browser.LoadCompleted -= AdCommand_LoadCompleted; Status = StatusCode.Executing; } return; } #endregion #region JillsClickCorner else if (StringUtils.Contains(Source.Name, "JillsClickCorner")) { navigated = true; return; } #endregion #region MyFreeShares else if (StringUtils.Contains(Source.Name, "MyFreeShares")) { navigated = true; return; } #endregion #region NeoBux else if (StringUtils.Contains(Source.Name, "NeoBux")) { navigated = true; return; } #endregion #region NoMinimum else if (StringUtils.Contains(Source.Name, "No-Minimum")) { navigated = true; return; } #endregion #region ProBux else if (StringUtils.Contains(Source.Name, "ProBux")) { navigated = true; return; } #endregion #region SamBux else if (StringUtils.Contains(Source.Name, "SamBux")) { navigated = true; return; } #endregion #region VoBux else if (StringUtils.Contains(Source.Name, "VoBux")) { navigated = true; return; } #endregion #region WordLinx else if (StringUtils.Contains(Source.Name, "WordLinx")) { if (StringUtils.Contains(uri, loginUrl)) { strategy.Login(browser, source); return; } else { string head = ((IHTMLElement)HtmlUtils.GetHead(browser.Document)).innerHTML; //var counter = new Number(); //var counter = 5; if (StringUtils.Contains(head, "var counter = ")) { string[] tokens = StringUtils.GetTokens(head, "{}\r\nvar counter = new Number();\r\nvar counter = {};{}"); string timer = tokens[1]; Duration = int.Parse(timer) + 5; } navigated = true; return; } } #endregion #region YouRoMail else if (StringUtils.Contains(Source.Name, "YouRoMail")) { navigated = true; return; } #endregion browser.LoadCompleted -= AdCommand_LoadCompleted; throw new Exception(string.Format("Undefined strategy: {0}", source.Name)); } private void CheckValidation() { #region ClixSense if (Source.Name == "ClixSense") { browser.Dispatcher.BeginInvoke(new ThreadStart(() => { if (StringUtils.Contains(browser.Html, "Your click has been validated")) { Debug = "Validated"; Complete(); Validated = true; } })); } #endregion #region DonkeyMails if (Source.Name == "DonkeyMails") { browser.Dispatcher.BeginInvoke(new ThreadStart(() => { if (StringUtils.Contains(browser.Html, "Your account has been credited")) { Debug = "Validated"; Complete(); Validated = true; } })); } #endregion } } }