Działania na stronie internetowej. Pseudobot.

0

1.Chciałbym napisać małego bota. Chce wciskać pewne przyciski(znaczy bot ma wciskać)(znam ich tagi, czy też nazwy - tych przycisków) na konkretnej stronie internetowej. Czego powinienem użyć, czym się zainteresować, co poczytać? Wiem, że mogę do tego użyć kontrolki WebBrowser, ale wydaje mi się, że nie tędy droga. Proszę o wskazówki.

2.Druga rzecz: po wciśnięciu już jakiegoś przycisku(ciągle mowa o bocie), strona internetowa zawsze musi załadować coś nowego - czyli POTRZEBUJE TROCHĘ CZASU. Dajmy na to, że nacisnę button1 na konkretnej stronie, co przekieruje mnie na inną stronę, gdzie również chce nacisnąć button, tym razem button2. Pytanie moje brzmi czy nie wywali mi exceptiona gdy kod będzie schematycznie wyglądał tak:

nacisnięcieButtona1();
naciśnięcieButtona2();

Dlaczego uważam że exception?: Skoro strona gdzie jest Button2 musi się załadować to wykonanie od razu naciśnięcieButtona2() spowoduje że nie będzie czego nacisnąć? Zgadza się? Czy dobrze myślę? Jak tego uniknąć?

Drugie pytanie troszkę wyprzedza, dlatego najpierw proszę o odpowiedź na pierwsze, ponieważ drugie powstało na podstawie pierwszego. Mam na dzieję, że zostałem dobrze zrozumiany. Bardzo proszę o pomoc. Z góry dziękuję.

0

Owszem wyprzedza, bo problemu nie ma. Ja pisałem kiedyś bota, zaraz dam ci kod odpowiedniej funkcji, bo jest dosyć skomplikowany, muszę go tylko znaleźć. Mam jedno pytanie tylko, czy ten button będzie zawsze ten sam? Jeśli tak, to musisz w kodzie zobaczyć jak się nazywa, oraz gdzie formularz jest wysyłany.

0

Tak, zawsze dwa te same. I jeszcze z ciekawości spytam to będzie za pomocą tej kontrolki o której pisałem czy w inny sposób?

I że tak spytam, co gdyby nie był zawsze ten sam? Jak wtedy rozwiązać problem znalezienia przycisku odpowiedniego?

0
//tego nie zmieniaj
HttpWebRequest strona = null;
private string connParam = "Connection: keep-alive";
private string uagentParam = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4";
CookieContainer cookies = new CookieContainer(); //dla podtrzymania sesji


//button1

//tutaj wpisujesz co trzeba
String PostValues = "zmienna1=wartość1&zmienna2=wartość2"; //tutaj wpisz treść zapytania
strona  = (HttpWebRequest)WebRequest.Create("http://www.strona.pl/plik.php"); //tutaj adres pliku/strony (ten co w target elementu form na stronie)


//nie zapomnij o szczegółach
strona.KeepAlive=true;
strona.Method= WebRequestMethods.Http.Post;//oczywiście wysyłanie metodą post
strona.ContentType = "application/x-www-form-urlencoded";
strona.ContentLength = PostValues.Length+connParam.Length+uagentParam.Length+6;
strona.CookieContainer= cookies;

//wysyłanie zapytania
StreamWriter requestStream = new StreamWriter(strona.GetRequestStream());
try{
        requestStream.WriteLine(PostValues);
	requestStream.WriteLine(uagentParam);
        requestStream.WriteLine(connParam);
	requestStream.Flush();
}catch(Exception ex){
	Console.WriteLine(ex);
}

//odpowiedź
HttpWebResponse odpowiedz = (HttpWebResponse)strona.GetResponse();
StreamReader responseStream = new StreamReader(odpowiedz.GetResponseStream());

while(!responseStream.EndOfStream){
         String s = responseStream.ReadLine();//odczytujesz odpowiedź
         //...
}

//tutaj wpisujesz znowu wszystko dla kolejnego buttona
//...

0

Jak tylko znowu będę mógł się zalogować, to przygotuję ci nawet specjalny obiekt, z funkcją przyjmującą jedynie 2 ciągi String

0
hubert_nnn1 napisał(a)

Jak tylko znowu będę mógł się zalogować, to przygotuję ci nawet specjalny obiekt, z funkcją przyjmującą jedynie 2 ciągi String

Będę ogromnie wdzięczny. Oczywiście już jestem, dziękuję bardzo.

0

Eh, chyba się już nie zaloguję dzisiaj.

	public class Polaczenie
	{
		
		HttpWebRequest strona = null;
		CookieContainer cookies = new CookieContainer();
		
		private string connParam = "Connection: keep-alive";
                private string uagentParam = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4";
		
		
		public Polaczenie()
		{
			
			
		}
		
		
		public StreamReader SendPost(String addres, String PostValues){
			strona = (HttpWebRequest)WebRequest.Create(addres);
			strona.KeepAlive=true;
			strona.Method = WebRequestMethods.Http.Post;
			strona.ContentType = "application/x-www-form-urlencoded";
			strona.ContentLength = PostValues.Length+connParam.Length+uagentParam.Length+6;
			strona.CookieContainer= cookies;
			
			
			StreamWriter requestStream = new StreamWriter(strona.GetRequestStream());
			
			try{
				requestStream.WriteLine(PostValues);
				requestStream.WriteLine(uagentParam);
                                requestStream.WriteLine(connParam);
				requestStream.Flush();
				
			}catch(Exception ex){
				Console.WriteLine(ex);
			}
			
			try{
				HttpWebResponse odpowiedz = (HttpWebResponse)strona.GetResponse();
				StreamReader responseStream = new StreamReader(odpowiedz.GetResponseStream());
	
				return responseStream;
				
			}catch(Exception ex){
				Console.WriteLine(ex);
				return null;
			}
		}
        }

To chyba wystarczy, jakby nie działało, to pisz

0

A potrafilbys sie Hubert zalogować na strone gdzie ID Formularza(a raczej URL pod ktory wyslac POST) do logowania jest za kazdym razem generowane na nowo. Jaki wtedy post wyslac, czy taka zmiana powoduje ze juz nie mozna sie zalogować ? Ktoś mi powiedział ,że skoro z przeglądarki można to i z programu sie da.

W sensie przy kazdym logowaniu URL pod ktory wysylany jest POST sie zmienia i przez to nie mam jak zalogować się z programu. Jest jakas mozliwosc obejscia tego ( w cookies nic nie znalazlem co by pasowało).

 
string PostData = "name=lamson&password=haslo";
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create("url tutaj za kazdym razem inny");
...
0

To musisz przygotować odpowiedni dekoder, który będzie odczytywał, jaki jest ten URL i przekazujesz go jako zwykłego Stringa do następnego wywołania funkcji SendPost();

Funkcja ta zwraca strumień, z którego możesz potem czytać.

Polaczenie p = new Polaczenie();
StreamReader  sr = p.SendPost("http://strona.pl/login.php", "login=abc&haslo=tajne");
String adres = DekoderStrony.Decode(sr);
p.SendPost(adres , "dane=def");

A samą klasę dekodera i funkcję dekodującą to musisz sam zrobić dopasowując ją do strony (znajdź charakterystyczne niezmienne elementy i operuj na stringach do wyszukania w jakiś sposób potrzebnych ci danych)

1 użytkowników online, w tym zalogowanych: 0, gości: 1