Znajdź zawartość
Wyświetlanie wyników dla tagów 'booty' .
-
Poradnik Jak zacząć pisać boty w C#? Z przykładem do bubblews.
Zyber opublikował(a) temat w Programowanie
Do napisania programu, który będzie za nas wykonywał jakąś czynność w tym przypadku będzie zakładał konto oraz robił wpis będziemy potrzebować: Microsoft Visual C# 2010 express albo nowszą wersję, którą możemy pobrać tutaj Gecko21, jest to silnik przeglądarki firefox, możemy pobrać go tutaj Xulrunner jest pojedynczym pakietem instalacyjnym, który może być użyty do uruchamiania wielu aplikacji bazujących na XUL+XPCOM takich jak Firefox czy Thunderbird, możemy go pobrać tutaj Deathbycaptcha to właśnie ten serwis będzie rozwiązywał za nas captche. Biblioteki API możemy pobrać ze strony serwisu po zalogowaniu. Następnie musimy przekopiować Xulrunner na dysk systemowy do Program Files (może być inna lokalizacja, ale ta jest uniwersalna). Teraz zostało nam jeszcze dodanie gecko do naszego projektu. Tworzymy nowy projekt VS, otwieramy kolejno Solution Explorer->Referencje klikamy prawym klawiszem myszy na add reference przechodzimy do zakładki browse i dodajemy nasze biblioteki tj. Geckofx-Winformms.dll oraz Geckofx-Core.dll oraz DeathByCaptcha. Żeby było możliwe wyświetlanie stron internetowych musimy dodać do toolbox’a kontrolke. Klikamy na Toolbox->Choose Items-> .NET Framework Components -> Browse i dodajemy Geckofx-Winformms.dll. W toolbox powinna pojawić nam się nowa kontrolka GeckoWebBrowser i dodajemy ją do naszej formy. Teraz możemy przejść do pisania programu. Przechodzimy do kodu programu, dodajemy bibliotekę poprzez: using Gecko tj. na rysunku poniżej, warto jeszcze dodać bibliotekę wejścia/wyjścia będzie ona nam potrzebna do operacji na plikach (using System.IO;), Drawing.Imaging posłuży nam do zapisanie fragmentu strony internetowej do pliku graficznego a potem do strumienia którego wyślemy do deadbycaptha. Warto jeszcze sprawdzić ustawienia projektu czy mamy wybrane Framework 4, robimy to w ten sposób Projekt-> nazwa_projektu Properties… -> Application i w Target framework ustawiamy .NET Framework 4 jeżeli masz inny albo .NET Framework 4 Client Profile to go musisz zmienić (może być nowszy, ale nie starszy). Pod InitializelComponent(): dodajemy dwie linijki kodu. Pierwsza odczytuje Xulrunner, w nawiasach piszemy ścieżkę dostępu do katalogu Xulrunner. Druga linijka odpowiada za wyświetlenie w kontrolce strony głównej bubblews. Jak skompilujesz projekt to wyświetli ci się główna strona bubblews. Teraz nasz program musi kliknąć „Enter Site”, żeby móc przejść dalej. Jak to zrobić? Uruchamiamy naszą ulubioną przeglądarkę (moją jest Firefox i z niej będę korzystał przy dalszym opisie tego poradnika) wciskamy F12 albo włączamy „przełącz narzędzia” (Narzędzia -> dla twórców witryny -> przełącz narzędzia) i sprawdzamy co tam kryje się pod tym przyciskiem (rysunek poniżej). Widzimy że nasz przycisk należy do klasy entersite oraz ma odnośnik „/”. Tak naprawdę wczytuje on jeszcze raz stronę (ale jej nie odświeża). Możemy sobie darować klikanie w niego, możemy od razu przejść do podstrony w której będziemy wypełniać pola przy zakładaniu konta, poprzez wpisanie adresu „bubblews.com/account/create” (specjalnie nie dodałem www). Teraz dla zwiększenia czytelności naszego kodu stworzymy zmienną lokalną „document” typu GeckoDocument taj jak poniżej Teraz utworzymy zmienną Username typu GeckoHtmlElement i przypiszemy jej Id textbox’a ze strony dla username. Widzimy, że id które szukamy to „username”, kolejną rzeczą jak nas interesuje to atrybut value, to właśnie tam będziemy wpisywać naszą wartość tekstową. W ten sposób sczytujemy ID dla wszystkich pól w które będziemy wpisywać tekst. Tekst wysyłam korzystając z metody SetAttribute. W naszym przypadku będzie to wyglądało następująco. Username. SetAttribute(„value”, nazwa_jaką_chcemy przesłać). ( W trakcie testowania aplikacji okazało się że po wpisaniu danych w pole i klikniecie na submit serwer nie odczytywał wartości wpisywanych jest to spowodowane systemem który wychwytuje roboty, które chcą założyć konto dlatego napisałem metodę SetString o której opowiem ci później jak ona działa, ale jeżeli będziesz chciał napisać bota który będzie się logował na twoje konto i wystawiał komentarze np. na Facebook’u to ta metoda wpisywania wartości działa bez zarzutu.) Username bo taką nazwę wymyśliliśmy wcześniej przy tworzeniu zmiennej typu GeckoHtmlElement, SetAttribute przyjmuje dwa parametry pierwszy to nazwa atrybutu do którego będziemy zapisywać natomiast drugi to co będziemy zapisywać. Poniżej przedstawiam Ci jak to wygląda u mnie, nie przejmuj się że w tym momencie nie wszystko rozumiesz z poniższego zapisu w dalszej części wytłumaczę CI co tam się „dzieje”. Jeżeli będziesz pisać program który nie czyta danych z pliku to po value wpiszesz textbox1.Text jak się pewnie już domyślasz tekst który wpisałeś w textbox jest wpisany w jako drugi parametr metody SetAttribute, (SetAttribute(„value”, textbox1.Text)). Kolejnym elementem jaki widzimy na stronie bubblews przy zakładaniu konta są dwa check box do wyboru płci. Teraz mamy do czynienia z klikaniem. W tym przypadku robimy tak samo, sczytujemy id dla checkbox Male nosi nazwę „sex_male”, zamiast metody SetAttribute użyjemy Click. Click nie przyjmuje żadnych parametrów. Wygląda to tak: W kodzie widzimy, że klikanie w nasz checkbook jest wewnątrz pętli warunkowej if. Postanowiłem że dam użytkownikowi programu do wyboru ręcznego czy konto ma być założone na mężczyznę czy kobietę już niedługo sam się przekonasz że jest to element którego nie możemy powierzyć programowi żeby decydował za nas. Wyobraź sobie taką sytuację, do programu ładujesz plik w którym są męskie imiona a program wybiera losową wartość co do płci i zostaje założone konto dla John female. Sam przyznasz że jak administrator by takie coś zauważył to konto od razu jest usuwane bo wygląda nie naturalnie. Następnie jest ładowanie rysunku nasz program tego robić nie będzie, potem mamy wybór Layout oraz Header Color są to naj mniej istotne rzeczy przy tworzeniu konta i pozwolimy aby nasz program sam wybierał jedną z tych opcji. Żeby tak się stało napiszemy sobie funkcję RandomValue, która będzie przyjmować dwie wartości typu int pierwsza to liczba „od” druga to liczba „do” określająca nasz przedział liczbowy, i będzie zwracałam nam wynik typu int. Jak się potem przekonasz często będziemy używać liczb losowych i żeby nie pisać w kółko tego samego kodu, będziemy używać właśnie tej funkcji. Nasza funkcja wygląda tak jak poniżej. Tworzymy zmienną lokalną, w której będziemy przechowywać wynik, następnie tworzymy instancje klasy i do naszej zmiennej przypisujemy pseudolosową wartość. Wracając do pisania wybranej opcji przez nasz program posłużymy się pętlą switch, która wybierze jedną z opcji odpowiadającej numerowi który został „wylosowany” przez nasza funkcję RandomValue. Ja dopisałem jeszcze wyświetlenie na formatce jaką opcję wybrał nam program, która wyświetli się w komponencie label. Teraz zostało nam jeszcze potwierdzenie że zgadzamy się z regulaminem serwisu. Kliknięcie w zatwierdzenie regulaminu nie różni się niczym innym od tego co opisywałem wcześniej tak kliknięcie w Create jest inne bo nie ma określonego Id. Mamy do dyspozycji klasę submit oraz odnośnik href = „#” co za bardzo nam się nie przyda. Do tego elementu odniesiemy się po nazwie klasy. Tworzymy zmienną np.: su typu GeckoHtmlElement do pobrania klasy użyjemy metody GetElementsByClassName. Na końcu linii widzimy [0]. Nazwy klas mogą się po powtarzać dlatego musimy określić konkretnie o którą nam chodzi, w tym przypadku o pierwszą więc wpisujemy 0 (liczymy od 0 nie od 1). Teraz w konsoli błędów na dole programu VS widzimy że mamy błąd. Nie można przekonwertować Gecko.GeckoNode (metoda GetElementsByClassName należy do tej klasy) do Gecko.GeckoHtmlElement. Dla tego musimy zrobić rzutowanie poprzez dodanie w nawiasach okrągłych GeckoHtmlElement tak jak poniżej. Nasz program nie będzie klikał w Create, sami będziemy w niego klikać jest to niekomfortowe dla osoby korzystającej z takiego programu ale zawiera dużo elementów, które zawsze występują i będziesz mógł je „żywcem” przekopiować do swoich programów. Teraz przechodzimy do robienia wpisu na stronie, kopiujemy adres pod którym dodajemy wpis i wpisujemy go do programy, już pewnie wiesz jak będzie wyglądał nasz kod który będzie otwierał tą podstronę (pisałem o nim na samym początku). Jako formularz dodawania wpisu widzimy tytuł. Z tym nie ma żadnego problemu sczytujemy Id i postępujemy tak jak wyżej. Teraz mamy do wyboru temat wpisu. Jedynym sposobem który się sprawdził to wstrzyknięcie spreparowanego kodu do strony. Przesłany kod do serwera będzie wyglądał np. Układ zdjęcia oraz wczytywanie go pominiemy ten krok. Teraz umieścimy tekst który chcemy opublikować. Podglądam jak zrobiony jest element do którego wprowadzamy tekst, jest to wieloliniowe pole tekstowe. Niestety nie możemy do niego odnieś się po id. Do tego posłużymy się właściwością InnerHtml która ustawia lub pobiera zbiór zawartych w danym elemencie znaczników razem z ich treścią. W zmiennej content będziemy przechoywać id które jest w bloku div. Dlaczego tak? Sam to sprawdź J. Do formatki dodaj textbox z tolboxa w właściwościach zmień multiline na true i powiększ go tak żebyś mógł zmieścić kilka linijek kodu które tam prześlesz. W kodzie umieść taką linijkę textbox1.Text = content.InnerHtml. textbox to nazwa twojej kontrolki możesz ją zmienić na dowolną, text to właściwość tej kontrolki , przypisujemy jej zawartość jaką pobrał InnerHtml. Content to zmienna którą wcześniej utworzyliśmy. Przetestuj ten kod dla id które jest przy bloku div oraz dla id przy textarea. W ten sposób możesz sprawdzać co masz w innych zmiennych. InnerHtml przesyła dane w znacznikach ” ”, wartości w kodzie HTML też są podawane w ” ”, dlatego musisz je zmienić ‘ ’. Kompilator odczytuje tekst od ” do ”, jeżeli wstawisz taki kod "<label for="content">Content kompilator odczyta "<label for= " taki kawałek kodu resztę podkreśli ci na czerwono i zasygnalizuje ERROR i będzie miał rację. Żeby połączyć „stały” tekst z tekstem który chcesz przesłać (twój wpis) dodajesz znak + za ” np.: ”teks stały skopiowany ze strony internetowej ” + nasz_teks + ” reszta tekstu skopiowana ze strony”. Teraz pewnie zastanawiasz się w którym miejscu umieścić nasz teks. Możemy wpisać jakiś tekst ja wpisałem Ala ma kota i kliknąłem submit news na samym dole i sprawdziłem jeszcze raz tą część strony jak wygląda kod i widzimy gdzie mamy umieścić nasz kod. Teraz musimy rozwiązać captche, ja skorzystałem z API death by captcha. Do przesłania do serwera loginu i hasła posłużyłem się funkcją String, którą wcześniej napisałem ponieważ okazało się że metoda (ToString) konwertująca zawartość textboxa na tekst zwraca znacznie więcej niż potrzebujemy (zachęcam się do tego aby sprawdzić to co zwraca, pisałem ci wyżej jak to się robi). Opis tej funkcji przedstawię Ci później. Do rozwiązania captcha skorzystamy z sample ze strony producenta, kod znacznie zmienimy pod swoje potrzeby. Metoda Decode jest przciążona znaczy to że metoda o tej samej nazwie może przyjmować różne parametry np.: metoda dodaj może wyglądać tak: Private void dodaj (int a, int b ) Private void dodaj (float a, float b ) Private void dodaj (double a, double b ) teraz jak wywołasz ją to kompilator sam zdecyduje jakie są jej parametry i wybierze tą poprawną. My do Decode prześlemy Stream. Teraz musimy pozyskać captcha ze strony w tym celu zrobimy zdjęcie screenshot całej strony, potem ustawiamy offset tak żeby wskazywał na początek naszego captcha. Robimy to metoda prób i błędów, następnie robimy zdjęcie o danym rozmiarze. To jakie rozmiary ma captcha możemy sprawdzić na stronie a potem musimy jeszcze je zmniejszyć. Jak przetestujesz ten fragment kodu na pewno więcej CI się rozjaśni dlaczego tak, zostawiłem Ci w komentarzach zapis na dysk rysunku, oraz rozmiar rysunku. Najlepiej jak offsety ustawisz na 0 i wtedy testuj różne szerokości i wysokości. Mamy zdjęcie zapisane do bitmapy teraz musimy zapisać je do strumienia i przekazać do funkcji Decode. Po rozwiązaniu captcha zostanie nam zwrócony wynik zapisany w zmiennej typu string. Odwołanie się do adcopy_response (tak nazywa się miejsce w które mamy wpisać rozwiązane captcha) i przekazania wyniku przy użyciu metody SetAttribute jest nieefektowne dlatego musimy kolejny raz pobrać kod ze strony i go zmodyfikować. Każde captcha ma swoje api które musimy odczytać i dodać do kodu które będziemy przesyłać na stronę. Sposób w jaki to zrobiłem opiszę Ci później. Nie różni się to od innych operacji na tekście jakie wykorzystuje w tym programie a tak wygląda to w kodzie Teraz musimy kliknąć w subimit robimy to tak jak pisałem Ci powyżej tutaj też pobieramy nazwę klasy a nie ID. Teraz pokarze Ci jak zmieniać ip, port oraz userageent. Ip zmieniamy tak jak poniżej na rysunku, jeżeli będziesz chciał przetestować ip z poziomu kodu tzn. będziesz zmieniał go w kodzie nie z poziomu użytkownika to podajesz go w cudzysłowie np.: ”192.168.1.100”. Kolejną bardzo ważną rzeczą jest user agent jest to „wizytówka” przeglądarki. Właśnie po tym strona www którą odwiedzasz wie jaką masz przeglądarkę w jakim języku jest, jaki system operacyjny itp. Chyba widzisz teraz jak ważną rolę będzie odgrywał user agent na przy zakładaniu kont YT? Zmian dokonujemy tak jak poniżej na rysunku: Ostatnią rzeczą jaką chciałby Cię nauczyć to czyszczenie ciasteczek robi się to poniższą funkcją: Firefox ma opcje które możemy zmieniać po wpisaniu w pasek adresu about:config. W swoich programach możesz ustawić wszystkie parametry jakie tam widzisz robi się to tak: GeckoPreferences.User["nazwa_parametru_jaki_chcesz_zmienić"] = wartość W przedstawianym programie często kożystamy z List. Lity są to dynamiczne tablice. My będziemy w nich przechowywać pojedyncze znaki, oraz całe słowa. Boty powinny mieć ciągłą prace, użytkownik poświecą np.: 1godz przy konfigurowaniu programu, a on działa nam np. przez długi czas, żeby to było możliwe musimy „gdzieś” przechowywać dane takie jak: Login, hasło, user agent, ip itp. Wygodnym dla użytkownika są pliki tekstowe i właśnie nimi się teraz zajmiemy. Do wczytania pliku do naszego programu posłużymy się klasą File oraz metodą ReadAllLines. Żeby użytkownik mógł sobie wybrać lokalizację swojego pliku użyjemy pętli warunkowej if oFD_pass.ShowDialog() (oFD_pass jest to moja nazwa kontrolki jaką dodałem z toolbox’a. W toolboxie nazywa się openFileDialog) do wyświetlenia okna posłużymy się metodą showDialog jeżeli klasa DialogResult zwróci ok to wykona się kod w pętli if (DialogResult.OK ). W pętli wczytujmy plik i będziemy go przechowywać w tablicy typu string. Widzisz jeszcze wywołanie funkcji WriteList służy ona do przekopiowania nazw z tablicy np.: do listy. Robimy to tylko dla tego żeby móc w prosty sposób odwołać się do jednej wybranej nazwy a nie do wszystkich które wczytaliśmy. (Jeżeli chcemy w textboxa na stronie www wpisać jedno imię a nie cały plik.) Zapis (kopiowanie) do listy słów robimy w dwóch etapach. W pierwszym zapisujemy pojedyncze litery, jeżeli kolejny znak to „ ,” zapisz całą tablice do kolejnej tablicy potem musimy ją wyczyścić (każda nazwa w pliku na końcu musi mieć przecinek w przeciwnym razie nie zostanie wszytana, dlatego że warunek w którym jest sprawdzany znak czy jest przecinek czy inny nie zostanie spełniony a właśnie tam robimy kopiowanie pojedynczych znaków do tablicy jako jeden wyraz). Przed zapisem listy liter które tworzą słowo widzisz wywołanie funkcji RemoveAt. Służy ona do usuwania znaku na danej pozycji. Musimy usunąć przecinek który został dodany do tablicy a nie chcemy go. Żeby móc określić ostania pozycję w naszej liście posłużymy się metodą Count. Zwraca ona wielkość listy. Na jednej pozycji mamy zapisane jedną literę więc wielkość listy odpowiada ilości liter teraz musimy usunąć ostatni element. Robimy to przez dopisania -1, dlatego że tablice liczy się od 0 a nie od 1 czyli 4 element tablicy będzie na 3 pozycji. W ten sposób otrzymaliśmy listę z nazwami na poszczególnych pozycjach. Załóżmy że nasza lista nazywa się imiona, w pamięci programu ona wygląda tak imiona[0] będzie zapisany Kamil, imiona[1] będzie zapisany Jan itd. Teraz rozumiesz po co te całe „zamieszanie”? Tablica w której zapisaliśmy plik wyglądał tak user[0] Kamil, Jan, Kolejnym kodem który chciałbym ci przybliżyć jak dział to zapis danych do kontrolki ListView. Plik który tworzy użytkownik wygląda następująco proxy:port,kraj. Cała procedura zapisu do listy będzie wyglądała identyczne jak powyżej z tym że powyżej naszym znakiem po którym wpisywaliśmy do listy imię był przecinek teraz mamy dwa znaki „:” i „ ,”. Doszło nam również numer odczytywanej linii (trochę strasznie wygląda taki zapis nazwa_zmiennej[][], jest to dwuwymiarowa tablica). Żeby dodać dane do kontrolki ListView musimy stworzyć instancje klasy ListViewItem elementy dodany w tej samej linijce jest pierwszym elementem wyświetlanym w naszej kontrolce. Kolejne dodajemy przez dodanie właściwości subitems i metody add. Teraz dodajmy główne nazwy (Item) do naszej kontrolki. W tym celu przechodzimy do widoku naszej formy klikamy w kontrolkę wcześniej dodaną (ListView) po najechaniu na nią myszką w prawym górnym rogu pojawi się strzałka, po kliknięciu w nią rozwinie się nam menu i wybieramy edit columns, teraz możesz dodać kolumny, nazwę kolumn jak pewnie się już domyślasz zmieniamy w właściwościach. Do elementów ListView odwołujemy się tak: Nazwa_list_view.Item[numer].Subitems[pozycja] do wpisania wartości (np.: port albo ip) wykorzystujemy własnośc Text. Numer jest to numer elementu natomiast pozycja odpowiada numerowi kolumny, jeżeli chcesz zmieniać tylko IP to zmieniasz numer a pozycja zostaje taka sama Teraz przedstawię ci metodę SetString którą byłem zmuszony do pisać w czasie testowania aplikacji. Tak jak pisałem Ci w pierwszej części strona na której chcemy stworzyć konto „rojentuje się” że cos jest nie tak i po kliknięciu w submit wyskakują komunikat Możemy to ominąć symulując wysyłanie znaków z klawiatury (SendKeys.SendWait("nasznak/nazwa klawisza np. ENTER")), klejoną rzeczą jaką możesz poprawić w tej funkcji to czas wyświetlania się kolejnych znaków. Do zapisu jaki jest w tej metodzie już pewnie się przyzwyczaiłeś, powtarza się on zawsze tam gdzie chcemy odczytać poszczególne znaki w tekście, teraz robimy tak samo tylko nie sprawdzamy co to za znak w petli warunkowaj If tylko konwertujemy ją na string i przesyłamy do metody Key. Pewnie teraz zastanawiasz się czemu ją konwertujemy na string skoro typ zmiennej jaki przyjmuje to string. Sam to sprawdź (usuń ToString i zobacz jaki błąd Ci wyskoczy). Metoda Key przyjmuje pojedyncze znaki przekazujemy ją do pętli switch w środku rozpoznaje co to za litera, jeżeli jest to ta którą szukamy to wykonuje się symulowanie wciskania klawiatury przez użytkownika z opóźnieniem (wcześniej zachęcałem Cię do napisania opóźnienia, a też piszę że takie jest, otóż użytkownik wciska klawisze z różną częstotliwością raz to będzie 201ms a kolejny to 211ms, myślę że rozjaśniło Ci się dlaczego takie opóźnienie jest ważne i dlaczego wcześniej jak przesyłaliśmy na serwer dane w metodzie SetAttribute serwer nie uwzględniał tych danych.) Przy zakładaniu konta użytkownik może podać stronę internetową ale nie jest to konieczne dlatego warto dodać checkbox’a. Czy checkbox jest zaznaczony sprawdzamy w pętli warunkowej if i korzystamy z metody Checked i sprawdzamy czy jest na true czyli zaznaczony. Wewnątrz pętli widzisz taki zapis W nawiasach podajemy teks który zawsze się wyświetli, użytkownicy nie lubią wprowadzać http://www. Tylko podać własną stronę dlatego robimy to za nich. Na konie pokaże Ci jak automatycznie odczytać lokalizację pliku (naszego programu) w jakiej danej chwili się znajduje. Wyobraź sobie że piszesz aplikacje i chcesz ją sprzedać, taka aplikacja będzie korzystać z bibliotek, plików zewnętrznych np. tak jak nasza z Xulrunner’a oraz z bibliotek gecko. Tłumaczyć każdemu z osobna „żeby program prawidłowo Ci działał musisz przekopywać …. do …. bo jak tego nie zrobisz to … (strach pomyśleć co się będzie działo J)” prawdopodobnie i tak tego nie zrobi i będzie ze program przy uruchomieniu wyskakują dziwne błędy, albo dołączasz grafikę do programu i też musisz ją gdzieś trzymać. Z pomocą przychodzi nam klasa Application i właściwość StartupPath tu znajdzie się lokalizacja naszej aplikacji. Jeżeli umieścisz w folderze np. nasza_aplikacja a w tym folderze u tworzysz folder np. image w którym będziemy trzymać grafikę np. rys1.jpg wtedy ścieżka dostępu do tego pliku będzie wyglądać tak Application.StartupPath + @"\image" bez względu czy użytkownik życzy sobie trzymać program na dysku C czy D albo w jakimś innym miejscu, ważne żeby nasz program był w tym samym folderze jaki wskazaliśmy w lokalizacji w naszym przypadku to nasza_aplikacja. Podsumowując potrafisz zrobić: - sprawdzić id, klasę pod jaką jest napisany dany element na stronie internetowej - stworzyć zmienną klasy która będzie przechowywać id lub klasę - przesłać tekst na stronę internetową używając do tego metody SetAttribute oraz modyfikować kod w programie -klikać w wybrane elementy na stronie internetowej - zmieniać ip, port, user agent przeglądarki - zrobić screenshot strony internetowej oraz ustawić offsety i wymiar rysunku Teraz w prosty sposób możesz sam napisać program który będzie dodawał wpisy np.: na pastebian albo zrobić prostą przeglądarkę która będzie łączyć się z yt za każdym razem z innego user agent, raz serwer yt będzie „widział Cię” że łączysz się z macintosh, linux’a albo Ipad’a lub z innej wersji przeglądarki, tylko musisz wcześniej sprawdzić czy ten user agent jest obsługiwany przez daną stronę. - wczytywać plik z lokalizacji wybranej przez użytkownika - dokonywać operacji na plikach tj. kopiowanie wybranej nazwy do lisy - umieszczać wybrane nazwy w ListView - symulować wciskanie klawiszy z klawiatury - automatycznie odczytywać ścieżkę dostępu do pliku Tutaj możesz pobrać cały projekt. Tutaj możesz pobrać api Death By Captcha Wszelkie prawa zastrzeżone Żaden fragment publikacji (zawartość taka jak: tekst, grafika, pliki z danymi, oraz wszelkie inne dane) prezentowany w Forum http://make-cash.pl, nie może być powielany lub rozpowszechniany w żadnej formie i w żaden sposób bez uprzedniego zezwolenia. Wszelkie znaki graficzne, pliki z danymi i inne dane są chronione prawem autorskim i należą do autora postu.- 34 odpowiedzi
-
- 33
-
- programowanie C#
- geckofx
-
(i 2 więcej)
Oznaczone tagami: