c# / bot do stron www

0

Witam. Mam taki problem, że nie potrafię fachowo sprecyzować tego co mi jest potrzebne, a co za tym idzie opornie idzie mi szukanie informacji na ten temat.

Prosił bym o punk zahaczenia mniej więcej gdzie mam szukać rozwiązań.

Ogólnie potrzebuję do aplikacji dorobić pewien moduł.

Zasada działania, otrzymujemy jakiegoś linka. Strona jest pobierana na komputer. Program znajduje sobie sam odpowiedniego hrefta i przechodzi dalej. Uzupełnia, niezbędne dane np takie jak login czy hasło i wysyła je do strony.

Głownie chodzi o to, że chciał bym mieć możliwość poruszania się po stronach internetowych pobierania pewnych informacji oraz wysyłania. Bez konieczności używania przeglądarki internetowej. Mniej więcej taki Bot ;)

Co najważniejsze fajnie by było jakby można było zamaskować i podszywać się pod jakieś przeglądarki.

Z góry dzięki za materiały.

0

Podejrzyj jakie zapytania wysyła przeglądarka, a później wysyłaj to samo za pomocą HttpClient albo HttpWebRequest

0

http://make-cash.pl/jak-zacz%C4%85%C4%87-pisa%C4%87-boty-w-c-z-przyk%C5%82adem-do-bubblews-t4827/

Tutaj znalazłem fajne rozwiązania. Albo dll IEAutomatic czy jakoś tak to szło. Myślę, że będzie to dobre rozwiązanie. Ale nie jestem pewny czy w 100%

Tak samo się położyłem na Busy indactor jak na tym filmiku

Ogólnie spełnia swoje normy jakie ma wykonać lecz problem jest tego typu jak mamy funkcję

public void MainFunction()
{
DoSomthing1(); // Ustawia pliki do komunikacji z api
DoSomthingon_WW(); // Pobieranie danych z api
DoSomthing2(); // Ustawianie danych pobranych z api
}

A DoSomthingOn_WW()
{
Cały kod bloku wykonywania się podczas kiedy okno jest zajęte.
}

Nom i pomiędzy WW a 2 trzeba ustawiać blokadę. Żeby komenda DoSomthing2 nie pobrała pustych lub starych danych z komunikacji.
Więc jest więcej zachodu niż na początku się zdawało pożytku. I rozbijanie np komend na 2 etapy. W trakcie zajętego okna i po. Bo inaczej żadnych manipulacji na widoku nie można wykonać.

Dla tego, zanim się wezmę za projekt i wybiorę za pomocą czego ma być to wykonywane muszę się rozeznać.


Dokładnie mi chodzi o wstrzykiwanie informacji danych do różnego rodzaju formularzy na rożnych stronach internetowych. Nie wykorzystując przeglądarki lecz ją tylko symulując. Obecnie niestety odbywa się to za pomocą szablonów programu i wtyczki wraz z baza danych. Chciał bym pominąć komunikację wtyczka w przeglądarce a program. Tylko bez pośrednio, żeby program to wypełniał.

Dzięki takiej symulacji, będę wstanie wypełniać też więcej na raz. I na tym mi zależy.

Ważne, jest dla mnie to. Żeby website widział moją ingerencję np raz jako chrome raz jakofirefox czysto z przeglądarki. I żeby potrafił rozpoznawać elementy znajdujące się na stronie. Oraz komunikacja do zarządzania. Czy wszystko zostało wypełnione albo czy gdzieś jest problem itp.

Jak ktoś ma radę, z czego skorzystać był bym wdzięczny.

0

Musi być koniecznie c#? Jak nie, to PhantomJS się lepiej do takich rzeczy nadaje (nie wiem jak z podszywaniem się pod daną przeglądarkę).

0

Powiem tak, nie jest to do celów prywatnych tylko dla celów firmowych. Gdy przyszedłem do firmy była napisana wcześniejsza wersja programu. Strasznie była wadliwa, co chwile jakieś niespójności się pojawiały oraz inne dane wysyłała niż powinna. Było w niej parę widoków, przejścia między nimi były zrobione na zasadzie okna MDI oraz jedna instancja główna programu na zasadzie Static. 0 komentarzy oraz 0 dokumentacji. Z 5 klas nazywających się tak samo lecz przyjmujących inne wartości, ogólnie służące do tego samego.("Problem taki że funkcja była w jakimś miejscu zawsze wykorzystywana jedna i ta sama oraz taki sam rodzaj parametrów posyłany. " - nie wiem dla mnie to jest błąd)

Obecnie, program już skończyłem przerabiać, ma przyjemniejszy interface oraz więcej możliwości. Większość błędów o których wiedziałem to poprawiłem. A jakieś tam wyjdą za jakiś czas bo czego można oczekiwać od sytuacji takiej iż przychodzi programista dostaje program z błędami Gdzie TextBox z loginem nazywa się TextBox3 coś w tym stylu. I ma zrobić nową wersje, lepiej działającą. Tyle na ten temat, dałem radę działa wszyscy zadowolenie.

Niestety namęczyłem się przez te 2 miesiące, przerabiając WinForma pod WPF pomijając fakt iż ponad 80% logiki zmieniłem.

Nom i problem jest taki, iż zarząd stwierdził jak mi tak dobrze idzie. To że mamy się przygotować do automatyzacji. Co do panthonJS to mamy wtyczki zrobione na javiesript, nie wiem nie jestem od tego.

Dla tego głownie nam chodzi, żeby zrobić to automatycznie jednak nie pisań na nowo mechanizmów pobierania danych z API oraz ich przetwarzania gdy już, całe zaplecze logiczne istnieje. To wystarczy już dorobić moduł.

1
komur.l napisał(a):

Nom i pomiędzy WW a 2 trzeba ustawiać blokadę. Żeby komenda DoSomthing2 nie pobrała pustych lub starych danych z komunikacji.
Więc jest więcej zachodu niż na początku się zdawało pożytku. I rozbijanie np komend na 2 etapy. W trakcie zajętego okna i po. Bo inaczej żadnych manipulacji na widoku nie można wykonać.

Zachodu? Thread + ManualResetEvent to tak wiele?

            (new Thread(() => {
                MyManualResetEvent = new ManualResetEvent(false);
                try {
                    Work1();
                    MyManualResetEvent.WaitOne();
                    Work2(); 
                }
                finally {
                    MyManualResetEvent.Reset(); 
                }
            })).

I teraz wystarczy gdzieś w kodzie kiedy pierwsza operacja się zakończy:

MyManualResetEvent.Set();
0

Tak jest to zachód oraz o podobnej blokadzie mówiłem, troszkę inne rozwiązanie znalazłem. A tak jeszcze do tego wygląda sama funkcja wywołująca u mnie okno WW

 App_WindowsSettings.Window.WaitWindow.IsBusy = true;   // Wlaczenie busy industora
            App_WindowsSettings.Window.WaitWindow.BusyContent = "Logowanie ...";
            Task.Factory.StartNew(() =>
            {
                //DoWorkonWW() wykonuje się w tle
            }
            ).ContinueWith((task) =>
            {

                App_WindowsSettings.Window.WaitWindow.IsBusy = false;
                // DoWorkFinisch() wykonuje sie już po

            }, TaskScheduler.FromCurrentSynchronizationContext()
            );
 

Ogólnie nie narzekałem na początku, kiedy mechanizmy opierały się maxymalnie na paru etapach wykonywania czynności. Problem zaczyna się robić w momencie jak trzeba.

Pobrać dane z pliku, wrzuciś do storaga, sprawdzić konfigurację wrzucić wszystko do słownika potem wysłać do API. Następnie sprawdzić odpowiedź przeprowadzić despiralizację oraz wyświetlić elementy obiektu i przypisać do klasy manipulacyjnej. A potem jeszcze logi do tego zapisać.

To tak to rozwiązanie jest strasznie uciążliwe. Patrząc na przykład podpięcia klasy WaitWindow w Windows formie. I przyblokowanie okna oraz akcji wykonującej opiera się na prostej czynności

Blok kodu
{
.....xczxcz;
xczcxczz;

Jacksonsoft.WaitWindow.Show(this.DoSomthingOnWW); // Wywołanie okna WaitWindow oraz co ma się zrobić

DoEctr();

}

private void DoSomthingOnWW(object sender, Jacksonsoft.WaitWindowEventArgs e)
{
Co się ma wykonać w tle.
}

I tutaj nie ma problemów. Żadnego niezbędnego poświęcania czasu jak to rozbić, żeby działało itp. Ogólnie większość mi działa poprawnie. Ale jak gdzieś przeoczyłem blokadę. Mojego WW to tracę dane. Np przy automatycznym pobieraniu klienta. Zrobiłem klasę manipulacyjną do pobierania rożnych konfiguracji klientów. I niestety jak w logach sprawdzałem to dla 2 logik, klient dobrze pobrany lecz zapisywanie już informacji końcowych o nim kończyło się że wysyłałem na ID 0.

A tak nawiasem mówiąc, dopiero się uczę ^^ Jest to moja pierwsza praca jako programista i robię od jakiś 2 miesięcy. Do tego jestem całkiem sam od .Net oraz C# ;/// Więc nawet nie mam kogo iść się spytać o pomoc czy radę.

0

Przykro mi ale twoje rozwiązanie jakie zaproponowałeś się wysypuje

new Thread(() =>
            {
                
                SendBreak_ManualResetEvent = new ManualResetEvent(false);
                try
                {
                    
                    MV_AddBreakTime.Mv_Do.Access.SendNewBreakWW(parametry); 
                    SendBreak_ManualResetEvent.WaitOne();
                    
                     MV_AddBreakTime.Mv_Do.Start_Command.StartViewsSettings();
                }
                finally
                {
                    SendBreak_ManualResetEvent.Reset();
                }
            }).Start();

Niestety obie funkcje muszą wykonać się w WW i przy 1 się sypie w tym miejscu
App_WindowsSettings.Window.WaitWindow.IsBusy = true; // Wlaczenie busy industora

nie jest wstanie włączyć czy pobrać jakich danych z obiektu.

Chyba że robię coś źle

0

Spróbuj:

            this.Dispatcher.Invoke((Action)(() =>
            {
                App_WindowsSettings.Window.WaitWindow.IsBusy = true; 
            }));

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