Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

WINHTTP.AU3 Czyli piszemy bota do gier/aplikacji przegladarkowych


Rekomendowane odpowiedzi

Opublikowano

1. Czemu winhttp

Aby się nie rozpisywać, mamy głównie do wyboru ff.au3, ie.au3 i winhttp.au3(no chyba że jest coś o czym nie wiem).

Plusy

+ Szybkość

Typowa przeglądarka firefox otwierając strone czyta html, wysyła duzo zapytan do serwera z prośba o obrazki, wykonanie js, a potem te obrazki sciąga i segreguje html aby to jakoś wyglądało.

Niestety listy tych wszystkich zapytań nie udało się ująć, ale tak wygląda wczytanie www.mpcforum.pl

http://scr.hu/0rby/amyum

Przechodząc do sedna, winhttp wystarczy ze wyslemy jedno zapytanie i dostaniemy odpowiedź, żadnych obrazków, i innych gówien, interpreter htmla sami będziemy robić, a na pewno nie będzie aż tak skomplikowany i au3 da sobie rade.

Dla przykładu mojego jednego projektu 23 sekund bot zalogował się na 2 kontach = 2 zapytania, wysłał 12 flot = 48 zapytań taka czynność dla człowieka zajmuje jakieś 10 minut.

23 sekund a 600 sekund to jest lekka różnica?

Wszystko wykonując w jednym wątku(czyli po kolei, beż użycia jakiś timerow czy adbilow)

+- Banalna obsługa(wystarczy załapać), nie trzeba się pierdolić z kodem 10 godzin aby kliknąć jeden guzik, albo się wkurząc że kod nie działa, a wina leży po stronie przeglądarki(pozdrawiam IE)

+ Wymagania, do tego to winhttp.dll która na 99% masz zainstalowaną w systemie, więc nie musisz aktualizować przeglądarki do najnowszej wersji, sciągać jakiegoś mozrepla czy innych gowien, odpalasz i smiga.

2. Co będzie nam potrzebne

Biblioteka Winhttp.au3

Firefox

i dodatki do niego

FireBug

Live Http Headers

Jeżeli nie potrafisz tego zainstalować to nie kontynuuj tutoriala.

3. Funkcje które powinny wystarczyć w większości przypadkach

_WinHttpOpen()
_WinHttpConnect()
_WinHttpOpenRequest()
_WinHttpAddRequestHeaders()
_WinHttpSendRequest()
_WinHttpReceiveResponse()
_WinHttpReadData()

4. Tlumaczenie funkcji

Na pewno wam nie będę tłumaczył flage po fladze po co jest dlatego opisze po POLSKU funkcje i dam linka dla zainteresowanych.

_WinHttpOpen($sUserAgent = Default, $iAccessType = Default, $sProxyName = Default, $sProxyBypass = Default, $iFlag = Default)

Funkcja aby winhttp nam śmigało.

msdn.microsoft.com/en-us/library/aa384098(VS.85).aspx

_WinHttpConnect($hSession, $sServerName [, $iServerPort = Default ])

Laczymy się z serwerem.

msdn.microsoft.com/en-us/library/aa384091(VS.85).aspx

... potem uzupelnie, ale reszta funkcji polega na wyslaniu zapytania i odczytania danych z serwera.

5. Piszemy autologin + prosty ruch

Czyli koniec nudzenia i konkrety.

Zrobimy autologin na bitefight. Czyli, wchodzimy na bitefight i na szybko robimy jakieś konto.

Odpalamy firefoxa, z w/w dodatkami.

Wchodzimy na strone http://bitefight.pl/ (taki jest nasz cel).

W przeglądarce narzedzia, Live HTTP headers.

I wyskoczy nam takie okienko.

http://scr.hu/0rby/b0m8k

Jak jest zaznaczony ptaszek obok capture to znaczy że śledzi wszystko co przetacza się miedzy przeglądarką a serwerem, clear czyści ten syf.

Więc, jesteśmy na stronie, zaznaczamy capture, i wtedy wykonujemy krok który chcielibyśmy aby bot za nas zrobił, w tym wypadku logowanie.

Wpisujemy passy i klikamy login, zazwyczaj 1,2 log to będzie ten wyszukany.

Tylko pytanie jest który wybrać? Jest to zależne czy wchodzimy w jakiś link, czy wysylamy formularz.

Formularz(POST), link(GET).

Wracając do pisania wpisalismy, byle jakie dane i wyslaliśmy.

http://scr.hu/0rby/3kthh

A w livehttp headers dostaliśmy.

http://scr.hu/0rby/vqhkd

Na początku mamy serwer.

Potem czy to jest post czy get + lokacje gdzie jest wysyłane zapytanie.

Nagłówki wiadomości które wysyła przeglądarka do serwera np. informacje nt wersji przeglądarki i jakieś inne gówna.

I date, ktora nas interesuje, w tym wypadku wygląda ona następująco.

server=s102.bitefight.pl&serverDisabled=s1.bitefight.pl&user=asdf&pass=asdf&login=Login

No można pomyśleć, co za debil robił to, ale w sumie lepiej to wykorzystać i siedzieć cicho, wszystko na tależu.

Robimy nowy folder, wrzucamy tam biblioteke, robimy skrypta.

Na początku musimy wczytac biblie i uruchomić usluge.

#include "WinHTTP.au3";wlaczamy biblie
_WinHttpOpen(); uruchamiamy usluge winhttp

Tylko powinniśmy pamiętać aby nasz bot był jak najmniej wykrywalny.

Wersje przegladarki już dostaliśmy w live http headers.

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0

A 1 flaga winhttpopen to wlasnie ta informacja, default to "AutoIt/3.3", więc jeżeli serwer by to zapisywał to wg mnie jest to przypałowe.

Można też przy ustawianiu nagłówków ustawić(zaraz do tego dojdziemy) to, lecz szkoda lini kodu, jeżeli mamy dużo typów formularzów.

#include "WinHTTP.au3";wlaczamy biblie
_WinHttpOpen("User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0"); uruchamiamy usługę winhttp

Uruchomiliśmy usługę, to teraz połączymy się z serwerem z którym będziemy rozmawiać który mamy podany na początku.

http://scr.hu/0rby/mciby

Czyli s102.bitefight.pl, laczymy się funkcją _WinHttpConnect() i potrzebujemy do niej handle z winhttpopen i serwera z ktorym ma sie polaczyc

#include "WinHTTP.au3";wlaczamy biblie
$handlewinhttp = _WinHttpOpen("User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0"); uruchamiamy usluge
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie

Wlaczylismy i polaczylismy sie, to teraz musimy stworzyć zapytanie funkcją _WinHttpOpenRequest, moglibyśmy zrobić _WinHttpSimpleRequest, lecz jest to chujowa funkcja, a jak robić, to robić porządnie.

_WinHttpOpenRequest("handle do polaczenia", "rodzaj zapytania","lokalizacja gdzie bedziemy slac date") tak wygląda funkcja

Handle polaczenia mamy, tylko brakuje nam rodzaju zapytania i lokalizacji które mamy podane w live http headers.

POST /user/lobbylogincheck HTTP/1.1

Zcinamy to http i zostaje nam rodzaj zapytania, czyli POST i lokalizacja czyli /user/lobbylogincheck, więc nasz kod będzie aktualnie wyglądał tak

#include "WinHTTP.au3";wlaczamy biblie
$handlewinhttp = _WinHttpOpen("User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0"); uruchamiamy usluge
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie
$zapytanie = _WinHttpOpenRequest($connect, "POST", "/user/lobbylogincheck");otwieramy zapytanie

Teraz przydało by się nam aby formatowanie tekstu, polskie znaki czy inne gówna były wyświetlane tak jak w przeglądarce, więc musimy serwer poprosić aby nam takie wysłał, jedynie nie wysylamy mu tego "Accept-Encoding: gzip, deflate", ustawiamy je funkcją.

_WinHttpAddRequestHeaders($handlezapytania,"tesc naglowka")

Z tego wzgledu iż już user agenta ustawiliśmy przy włączaniu usługi, nie musimy już go ustawiać.

 

#include "WinHTTP.au3";wlaczamy biblie
$handlewinhttp = _WinHttpOpen("User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0"); uruchamiamy usluge
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie
$zapytanie = _WinHttpOpenRequest($connect, "POST", "/user/lobbylogincheck");otwieramy zapytanie
_WinHttpAddRequestHeaders($zapytanie, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
_WinHttpAddRequestHeaders($zapytanie, "Accept-Language: pl,en-us;q=0.7,en;q=0.3")
_WinHttpAddRequestHeaders($zapytanie, "Connection: keep-alive")
_WinHttpAddRequestHeaders($zapytanie, "Content-Type: application/x-www-form-urlencoded")

 

Teraz tylko wyslac i odebrać wiadomość.

 

#include "WinHTTP.au3";wlaczamy biblie
$handlewinhttp = _WinHttpOpen("User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0"); uruchamiamy usluge
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie
$zapytanie = _WinHttpOpenRequest($connect, "POST", "/user/lobbylogincheck");otwieramy zapytanie
_WinHttpAddRequestHeaders($zapytanie, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
_WinHttpAddRequestHeaders($zapytanie, "Accept-Language: pl,en-us;q=0.7,en;q=0.3")
_WinHttpAddRequestHeaders($zapytanie, "Connection: keep-alive")
_WinHttpAddRequestHeaders($zapytanie, "Content-Type: application/x-www-form-urlencoded")
_WinHttpSendRequest($zapytanie, Default, "server=s102.bitefight.pl&serverDisabled=s1.bitefight.pl&user=asdf&pass=asdf&asdf=Login")
_WinHttpReceiveResponse($zapytanie)
$data = ""
Do
$data &= _WinHttpReadData($zapytanie, 0)
Until @error
FileDelete(@ScriptDir & '/login.html')
FileWrite(@ScriptDir & '/login.html', $data)

 

Teraz przydalo by się abyśmy sprawdzili czy się zalogowaliśmy, więc szukamy jakiegoś neutralnego ciągu znaku który będzie zawsze wyświetlany przy zalogowaniu

Więc wchodzimy na firefoxie, logujemy się, i szukamy, wg mnie najlepiej będzie sprawdzić czy jest string Ustawienia, a sprawdzimy to funkcja stringinstr

Od razu do tego dodamy liczbe logowań np 5, i wrzucimy kod w funkcje, i edytujemy aby byla bardziej poreczna

 

#include "WinHTTP.au3";wlaczamy biblie
$handlewinhttp = _WinHttpOpen("User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0"); uruchamiamy usluge
for $i = 1 to 5
consolewrite($i & " Proba logowania" & @CRLF)
if login("asdf","asdf") then ExitLoop
consolewrite("Niepowiedziona" & @crlf)
Next
func login($login,$haslo)
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie
$zapytanie = _WinHttpOpenRequest($connect, "POST", "/user/lobbylogincheck");otwieramy zapytanie
_WinHttpAddRequestHeaders($zapytanie, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
_WinHttpAddRequestHeaders($zapytanie, "Accept-Language: pl,en-us;q=0.7,en;q=0.3")
_WinHttpAddRequestHeaders($zapytanie, "Connection: keep-alive")
_WinHttpAddRequestHeaders($zapytanie, "Referer: http://bitefight.pl/game")
_WinHttpAddRequestHeaders($zapytanie, "Content-Type: application/x-www-form-urlencoded")
_WinHttpSendRequest($zapytanie, Default, "server=s102.bitefight.pl&serverDisabled=s1.bitefight.pl&user=" & $login & "&pass=" & $haslo & "&login=Login")
_WinHttpReceiveResponse($zapytanie)
$data = ""
Do
$data &= _WinHttpReadData($zapytanie, 0)
Until @error
FileDelete(@ScriptDir & 'login.html')
FileWrite(@ScriptDir & '/login.html', $data)
return stringinstr($data,"Ustawienia")
EndFunc

 

To, teraz dodamy do tego jakąś funkcje, np. pójdziemy sobie na cmentarz i rozpoczniemy prace.

Logujemy się wchodzimy w miasto>cmentarz zaznaczamy capture i zobaczymy co tam pokaże nam po kliknieciu Rozpocznij Prace

http://scr.hu/0rby/zuhyc

No i w lokalizacji mamy jakiś token, za każdnym razem jest inny, i wchodzimy znowu do cmentarza, lecz tym razem klikamy prawym na Rozpocznij prace, i wybieramy Zbadaj element za pomocą firebuga

Akuratnie mieliśmy farta i dostaliśmy na tacy co chcieliśmy, czyli nasz token

http://scr.hu/0rby/4wwud

Lecz czasami jest ukryty, i wtedy trzeba by szukac w htmlu co wygląda jak token, najlepiej ctrl+f i szukać.

Dobra, więc najpierw musimy zobaczyć jak wejść do cmentarza, stworzyć i uruchomić funkcje wchodzenia i zapisania pliku do html(najlepiej zapisywać, aby sprawdzać czy wszystko działa poprawnie, w wersji koncowej usunac)

http://scr.hu/0rby/qme87

 

#include "WinHTTP.au3";wlaczamy biblie
$handlewinhttp = _WinHttpOpen("User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0"); uruchamiamy usluge
for $i = 1 to 5
consolewrite($i & " Proba logowania" & @CRLF)
if login("asdf","asdf") then ExitLoop
consolewrite("Niepowiedziona" & @crlf)
Next
uruchomieniepracy()
func login($login,$haslo)
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie
$zapytanie = _WinHttpOpenRequest($connect, "POST", "/user/lobbylogincheck");otwieramy zapytanie
_WinHttpAddRequestHeaders($zapytanie, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
_WinHttpAddRequestHeaders($zapytanie, "Accept-Language: pl,en-us;q=0.7,en;q=0.3")
_WinHttpAddRequestHeaders($zapytanie, "Connection: keep-alive")
_WinHttpAddRequestHeaders($zapytanie, "Referer: http://bitefight.pl/game")
_WinHttpAddRequestHeaders($zapytanie, "Content-Type: application/x-www-form-urlencoded")
_WinHttpSendRequest($zapytanie, Default, "server=s102.bitefight.pl&serverDisabled=s1.bitefight.pl&user=" & $login & "&pass=" & $haslo & "&login=Login")
_WinHttpReceiveResponse($zapytanie)
$data = ""
Do
$data &= _WinHttpReadData($zapytanie, 0)
Until @error
FileDelete(@ScriptDir & '/login.html')
FileWrite(@ScriptDir & '/login.html', $data)
return stringinstr($data,"Ustawienia")
EndFunc
func uruchomieniepracy()
$h_openrequest = _WinHttpOpenRequest($hw_connect, "GET", "/city/graveyard")
_WinHttpAddRequestHeaders($zapytanie, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
_WinHttpAddRequestHeaders($zapytanie, "Accept-Language: pl,en-us;q=0.7,en;q=0.3")
_WinHttpAddRequestHeaders($zapytanie, "Connection: keep-alive")
_WinHttpAddRequestHeaders($zapytanie, "Referer: http://s102.bitefight.pl/demonhunt/index")
_WinHttpSendRequest($zapytanie)
_WinHttpReceiveResponse($zapytanie)
$data = ""
Do
$data &= _WinHttpReadData($zapytanie, 0)
Until @error16:47 2012-12-15
FileDelete(@ScriptDir & '/cmentarz.html')
FileWrite(@ScriptDir & '/cmentarz.html', $data)
EndFunc

 

Wchodzimy w cmentarz i obczajamy czy działa kod, jeżeli tak to otwieramy w notatniku ten kod i szukamy tego fragmentu

http://scr.hu/0rby/4wwud

I teraz aby zczytać użyjemy funkcji _stringbetween(), funkcja zwraca string, między jednym stringiem a drugim

Więc jeżeli mamy

s102.bitefight.pl/city/voodoo?__token=587b268388283c25af0b578ee3c930f1">

a musimy mieć

587b268388283c25af0b578ee3c930f1

to najlepiej poszukać między __token= a "

Więc dodajemy biblioteke string.au3 i array.au3 i szukamy i sprawdzamy tablice _arraydisplay

 

#include "WinHTTP.au3";wlaczamy biblie
#include "string.au3"
#include "array.au3"
$handlewinhttp = _WinHttpOpen("User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0"); uruchamiamy usluge
for $i = 1 to 5
consolewrite($i & " Proba logowania" & @CRLF)
if login("asdf","asdf") then ExitLoop
consolewrite("Niepowiedziona" & @crlf)
Next
uruchomieniepracy()
func login($login,$haslo)
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie
$zapytanie = _WinHttpOpenRequest($connect, "POST", "/user/lobbylogincheck");otwieramy zapytanie
_WinHttpAddRequestHeaders($zapytanie, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
_WinHttpAddRequestHeaders($zapytanie, "Accept-Language: pl,en-us;q=0.7,en;q=0.3")
_WinHttpAddRequestHeaders($zapytanie, "Connection: keep-alive")
_WinHttpAddRequestHeaders($zapytanie, "Referer: http://bitefight.pl/game")
_WinHttpAddRequestHeaders($zapytanie, "Content-Type: application/x-www-form-urlencoded")
_WinHttpSendRequest($zapytanie, Default, "server=s102.bitefight.pl&serverDisabled=s1.bitefight.pl&user=" & $login & "&pass=" & $haslo & "&login=Login")
_WinHttpReceiveResponse($zapytanie)
$data = ""
Do
$data &= _WinHttpReadData($zapytanie, 0)
Until @error
FileDelete(@ScriptDir & '/login.html')
FileWrite(@ScriptDir & '/login.html', $data)
return stringinstr($data,"Ustawienia")
EndFunc
func uruchomieniepracy()
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie
$zapytanie = _WinHttpOpenRequest($connect, "GET", "/city/graveyard")
_WinHttpAddRequestHeaders($zapytanie, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
_WinHttpAddRequestHeaders($zapytanie, "Accept-Language: pl,en-us;q=0.7,en;q=0.3")
_WinHttpAddRequestHeaders($zapytanie, "Connection: keep-alive")
_WinHttpAddRequestHeaders($zapytanie, "Referer: http://s102.bitefight.pl/demonhunt/index")
_WinHttpSendRequest($zapytanie)
_WinHttpReceiveResponse($zapytanie)
$data = ""
Do
$data &= _WinHttpReadData($zapytanie, 0)
Until @error
FileDelete(@ScriptDir & '/cmentarz.html')
FileWrite(@ScriptDir & '/cmentarz.html', $data)
$token = _stringbetween($data,"__token=",'"')
_arraydisplay($token)
EndFunc

 

http://scr.hu/0rby/jxq8m

czyli nasz token będzie w $token[0] i w $token[1], ale pierw zrobimy zabezpieczenie, gdyby nam nie wczytało tokenu, funkcja isarray(czyli czy zmienna jest tablica)

 

#include "WinHTTP.au3";wlaczamy biblie
#include "string.au3"
#include "array.au3"
$handlewinhttp = _WinHttpOpen("User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0"); uruchamiamy usluge
for $i = 1 to 5
consolewrite($i & " Proba logowania" & @CRLF)
if login("asdf","asdf") then ExitLoop
consolewrite("Niepowiedziona" & @crlf)
Next
Do
$ahas = szukanietokenu()
if $ahas = 0 Then
for $i = 1 to 5
consolewrite($i & " Proba logowania" & @CRLF)
if login("asdf","asdf") then ExitLoop
consolewrite("Niepowiedziona" & @crlf)
Next
EndIf
Until $ahas
if $ahas then consolewrite("Udalo nam sie pobrac token " & $ahas & @CRLF)
func login($login,$haslo)
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie
$zapytanie = _WinHttpOpenRequest($connect, "POST", "/user/lobbylogincheck");otwieramy zapytanie
_WinHttpAddRequestHeaders($zapytanie, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
_WinHttpAddRequestHeaders($zapytanie, "Accept-Language: pl,en-us;q=0.7,en;q=0.3")
_WinHttpAddRequestHeaders($zapytanie, "Connection: keep-alive")
_WinHttpAddRequestHeaders($zapytanie, "Referer: http://bitefight.pl/game")
_WinHttpAddRequestHeaders($zapytanie, "Content-Type: application/x-www-form-urlencoded")
_WinHttpSendRequest($zapytanie, Default, "server=s102.bitefight.pl&serverDisabled=s1.bitefight.pl&user=" & $login & "&pass=" & $haslo & "&login=Login")
_WinHttpReceiveResponse($zapytanie)
$data = ""
Do
$data &= _WinHttpReadData($zapytanie, 0)
Until @error
FileDelete(@ScriptDir & '/login.html')
FileWrite(@ScriptDir & '/login.html', $data)
return stringinstr($data,"Ustawienia")
EndFunc
func szukanietokenu()
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie
$zapytanie = _WinHttpOpenRequest($connect, "GET", "/city/graveyard")
_WinHttpAddRequestHeaders($zapytanie, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
_WinHttpAddRequestHeaders($zapytanie, "Accept-Language: pl,en-us;q=0.7,en;q=0.3")
_WinHttpAddRequestHeaders($zapytanie, "Connection: keep-alive")
_WinHttpAddRequestHeaders($zapytanie, "Referer: http://s102.bitefight.pl/demonhunt/index")
_WinHttpSendRequest($zapytanie)
_WinHttpReceiveResponse($zapytanie)
$data = ""
Do
$data &= _WinHttpReadData($zapytanie, 0)
Until @error
FileDelete(@ScriptDir & '/cmentarz.html')
FileWrite(@ScriptDir & '/cmentarz.html', $data)
$token = _stringbetween($data,"__token=",'"')
if isarray($token) Then
return $token[0]
Else
return 0
EndIf
EndFunc

 

Nasz token aktualnie mamy probrany, więc teraz musimy napisac funkcje uruchamiającą

http://scr.hu/0rby/wnbrd

 

func uruchomprace($token)
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie
$zapytanie = _WinHttpOpenRequest($connect, "POST", "/city/graveyard/?__token=" & $token);otwieramy zapytanie
_WinHttpAddRequestHeaders($zapytanie, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
_WinHttpAddRequestHeaders($zapytanie, "Accept-Language: pl,en-us;q=0.7,en;q=0.3")
_WinHttpAddRequestHeaders($zapytanie, "Connection: keep-alive")
_WinHttpAddRequestHeaders($zapytanie, "Referer: http://s102.bitefight.pl/city/graveyard")
_WinHttpAddRequestHeaders($zapytanie, "Content-Type: application/x-www-form-urlencoded")
_WinHttpSendRequest($zapytanie, Default, "startWork=Rozpocznij+prac%C4%99")
_WinHttpReceiveResponse($zapytanie)
$data = ""
Do
$data &= _WinHttpReadData($zapytanie, 0)
Until @error
FileDelete(@ScriptDir & '/uruch.html')
FileWrite(@ScriptDir & '/uruch.html', $data)
EndFunc

 

Teraz wszystko zabezpieczamy, i sprawdzamy czy udalo nam się uruchomic. Udalo? Usuwamy wpisy do plikow.(jak bot już będzie w pełni gotowy, w trakcie pisania najlepiej zostawić)

Nasz koncowy efekt powinien wyglądać tak

 

#include "WinHTTP.au3";wlaczamy biblie
#include "string.au3"
#include "array.au3"
$handlewinhttp = _WinHttpOpen("User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0"); uruchamiamy usluge
for $i = 1 to 5
consolewrite($i & " Proba logowania" & @CRLF)
if login("asdf","asdf") then ExitLoop
consolewrite("Niepowiedziona" & @crlf)
Next
Do
Do
$ahas = szukanietokenu()
if $ahas = 0 Then
for $i = 1 to 5
consolewrite($i & " Proba logowania" & @CRLF)
if login("asdf","asdf") then ExitLoop
consolewrite("Niepowiedziona" & @crlf)
Next
EndIf
Until $ahas
if $ahas then consolewrite("Udalo nam sie pobrac token " & $ahas & @CRLF)
Until uruchomprace($ahas)
Consolewrite("Uruchomilismy prace/byla uruchomiona")
func login($login,$haslo)
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie
$zapytanie = _WinHttpOpenRequest($connect, "POST", "/user/lobbylogincheck");otwieramy zapytanie
_WinHttpAddRequestHeaders($zapytanie, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
_WinHttpAddRequestHeaders($zapytanie, "Accept-Language: pl,en-us;q=0.7,en;q=0.3")
_WinHttpAddRequestHeaders($zapytanie, "Connection: keep-alive")
_WinHttpAddRequestHeaders($zapytanie, "Referer: http://bitefight.pl/game")
_WinHttpAddRequestHeaders($zapytanie, "Content-Type: application/x-www-form-urlencoded")
_WinHttpSendRequest($zapytanie, Default, "server=s102.bitefight.pl&serverDisabled=s1.bitefight.pl&user=" & $login & "&pass=" & $haslo & "&login=Login")
_WinHttpReceiveResponse($zapytanie)
$data = ""
Do
$data &= _WinHttpReadData($zapytanie, 0)
Until @error
return stringinstr($data,"Ustawienia")
EndFunc
func szukanietokenu()
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie
$zapytanie = _WinHttpOpenRequest($connect, "GET", "/city/graveyard")
_WinHttpAddRequestHeaders($zapytanie, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
_WinHttpAddRequestHeaders($zapytanie, "Accept-Language: pl,en-us;q=0.7,en;q=0.3")
_WinHttpAddRequestHeaders($zapytanie, "Connection: keep-alive")
_WinHttpAddRequestHeaders($zapytanie, "Referer: http://s102.bitefight.pl/demonhunt/index")
_WinHttpSendRequest($zapytanie)
_WinHttpReceiveResponse($zapytanie)
$data = ""
Do
$data &= _WinHttpReadData($zapytanie, 0)
Until @error
$token = _stringbetween($data,"__token=",'"')
if isarray($token) Then
return $token[0]
Else
return 0
EndIf
EndFunc
func uruchomprace($token)
$connect = _WinHttpConnect($handlewinhttp, "s102.bitefight.pl"); laczymy sie
$zapytanie = _WinHttpOpenRequest($connect, "POST", "/city/graveyard/?__token=" & $token);otwieramy zapytanie
_WinHttpAddRequestHeaders($zapytanie, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
_WinHttpAddRequestHeaders($zapytanie, "Accept-Language: pl,en-us;q=0.7,en;q=0.3")
_WinHttpAddRequestHeaders($zapytanie, "Connection: keep-alive")
_WinHttpAddRequestHeaders($zapytanie, "Referer: http://s102.bitefight.pl/city/graveyard")
_WinHttpAddRequestHeaders($zapytanie, "Content-Type: application/x-www-form-urlencoded")
_WinHttpSendRequest($zapytanie, Default, "startWork=Rozpocznij+prac%C4%99")
_WinHttpReceiveResponse($zapytanie)
$data = ""
Do
$data &= _WinHttpReadData($zapytanie, 0)
Until @error
if stringinstr($data,"Dotychczasowy czas pracy") Then
return 1
Else
return 0
EndIf
EndFunc

 

 

Pisalem troszke chaotycznie, i nawet nie czytalem tego co piszę, więc jeżeli gdzieś się pomyliłem, lub ktoś nie wie o co chodzi, niech pisze

Opublikowano

loginForm_default_username=%E2%80%A2%CE%B1%CE%B6%C3%98n%CE%B5%E2%80%A2%CE%B1%CE%B6y%CE%B5%D1%8F%C2%BB%C5%A0%D0%BC%C2%AB%D0%9C%D0%9CO%E2%80%A2&loginForm_default_password=xxxxxxxxx&loginForm_default_login_submit=Logowanie

 

 

Utknąłem przy pierwszym kroku 0,0

comment_aKm2b5jSiJgvkhmrlSzZ5Yc80OK7Mzta

Opublikowano

Hmm jak dla mnie zagmatwane kody trochę (zbyt "trudne" dla newbie) ale ogólnie to ok. wytłumaczone

/ GA-970A-UD3 / FX-6300 / Sapphire Xtreme 5830 / OCZ ZS 550W / Brutus M23 /

| MPC Coders Team | MPC Gold Member | C#, C++, PHP, (N)ASM, AutoIT, Python, Java |

Opublikowano

Zmień w:

Można też przy ustawianiu nagłówków ustawić(zaraz do tego dojdziemy) to, lecz szkoda lini kodu, jeżeli mamy dużo typów forumlarzów.

#include "WinHTTP.au3";wlaczamy biblie

_WinHttpOpen("User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0"); uruchamiamy usługę winhttp

 

Z 'forularzów' na 'formularzy' :D

 

A ogólne to dość ładnie napisane i po przeczytaniu takiego tutka można się mniej więcej za jakiegoś prostego bocika brać.

Opublikowano

Hmm jak dla mnie zagmatwane kody trochę (zbyt "trudne" dla newbie) ale ogólnie to ok. wytłumaczone

ale za winhttp nie powinna brać się osoba która nie ogarnia pętli, chociaż w sumie masz racje, te 2 petle for to za dużo, robią zamieszanie, potem poprawie

anyway, starałem się tłumaczyć kroczuś po kroczusiu więc newbie który przeczytaj tuta macka da sobie rade :D

@down

3 pierwsze plusy

Opublikowano

Możesz powiedzieć jakie ta biblioteka ma zalety niż IE.au3?

Jestem początkujący w AutoIT i prawie nic kodu nie rozumiem, najlepiej sobie najpierw opanuję IE do perfekcji, potem zabiorę się za coś innego.

Wszystkie poradniki w "O mnie" i na moim profilu YouTube.


51dd70965ae71.png


!!!HIT!!! -- Pełno klientów na DT nawet na najstarszym kompie bez zamuły!


!!!HIT!!! -- Nowa modyfikacja do Metina FastKill


World of Metin2


Opublikowano

Do korzystania z programu opartego na IE użytkownik musi mieć IE w wersji 8 lub 9.

Program na IE wykonuje wszystko 10x wolniej.

NIe zawsze działa.

 

WinHTTP jest szybki i skuteczny. Użytkownik programu nie musi nic instalować, żeby korzystać z niego :)

Ogólnie WinHTTP ma same plusy z tym że początkującemu ciężko ogarnąć tą bibliotekę, lepiej im z IE :)

Opublikowano

loginForm_default_username=%E2%80%A2%CE%B1%CE%B6%C3%98n%CE%B5%E2%80%A2%CE%B1%CE%B6y%CE%B5%D1%8F%C2%BB%C5%A0%D0%BC%C2%AB%D0%9C%D0%9CO%E2%80%A2&loginForm_default_password=xxxxxxxxx&loginForm_default_login_submit=Logowanie

 

 

Utknąłem przy pierwszym kroku 0,0

Pierwsze to nick z DO, a drugie hasło.

 

@Topic

Według mnie lepsze połączenie to Chrome+Charles.

Opublikowano

@up

to wiadome co jest loginem a co jest haslem, tylko jak wyglada metoda hashowania loginu, dlatego prosilem zulka aby podal strone

 

pewnie tak, lecz na chromie niema tak dobrego dodatku jak na ff(newbie ciezej by bylo sie polapac w tym)

Opublikowano

@up

to wiadome co jest loginem a co jest haslem, tylko jak wyglada metoda hashowania loginu, dlatego prosilem zulka aby podal strone

 

pewnie tak, lecz na chromie niema tak dobrego dodatku jak na ff(newbie ciezej by bylo sie polapac w tym)

URL encoding.

Opublikowano

Z racji, iż programy z WinHTTP nie potrzebują żadnych przeglądarek itp. , to czy będą one działały na linuxie z wykorzystaniem Wine?

Ma ktoś możliwość to sprawdzić?

  • 3 tygodnie później...
Opublikowano

Witam, mam nadzieje że nie odkopie za bardzo tematu ;) piszę bota do Shakes & Fidgets, robię to co prawda troszeczke inaczej, ale również z wykorzystaniem biblioteki winhttp. Zablokowałem się w jednym miejscu, mianowicie

 

po wykonaniu zapytania:

$tmp = _WINHTTPSIMPLEREQUEST($HCONNECT, "GET", "request.php?req=" & $SESSIONID & "513jakisnick" & "&random=%2&rnd=" & RND() & " HTTP/1.1", $URL)

gdzie odpowiednio

$URL = String("s" & $nrserwera & ".sfgame.pl")
$HOPEN = _WINHTTPOPEN("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2")
$HCONNECT = _WINHTTPCONNECT($HOPEN, $URL)

 

w zmiennej $tmp mam odpowiedz którą gra daje po wysłaniu takiego zapytania. Niby wszystko ok, problem w tym że po wykonaniu takiego kodu w firefoxie i podejrzeniu w Live HTTP headers co się dzieje, przeglądarka ściąga dodatkowo grafiki. wygląda to tak:

GET /request.php?req=15751130447L361355EV9423P0M38201513jakisnick8&random=%2&rnd=9645577001357720493412
GET /res/sfgame/res/gfx/itm/6-2/itm6-5-3-2.png
GET /res/sfgame/res/gfx/itm/7-2/itm7-50-1-2.png
GET /res/sfgame/res/gfx/itm/8-1/itm8-2-2-1.png
GET /res/sfgame/res/gfx/itm/1-2/shot2-6-2.png
GET /res/sfgame/res/gfx/itm/9-1/itm9-10-2-1.png

 

Teraz moje pytanie jest następujące - czy da się zmusić mój skrypt do pobierania tych grafik? Ewentualnie pobierania chociażby nazw ścieżek dostępu do tych plików (czyli np tego: /res/sfgame/res/gfx/itm/6-2/itm6-5-3-2.png) :)

Opublikowano

już Ci tłumacze do czego jest mi to potrzebne ;) mianowicie robię bota który bedzie szukał danego przedmiotu u graczy (potrzebne do uzupełnienia klasera w grze).

 

Miałem to zrobić inaczej, ale nie potrafię znaleźć zależności jak powiązać odpowiedź na temat profilu gracza a konkretnym przedmiotem. Tzn żeby uściślić - przedmioty podzielone są na czapki, rękawice, buty itp, a każdy z nich podzielony jest na poziomy (w każdym poziomie po 5 przedmiotów np różnego koloru) + przedmioty specjalne.

Udało mi się wyciągnąć z odpowiedzi na zapytanie: rodzaj przedmiotu, poziom/grupe, ale nie potrafie określić dokładnego przedmiotu (koloru)... z nazwy obrazka danego przedmiotu bez problemu da się określić jaki to przedmiot bo:

 

itm6-5-3-2.png to odpowiednio: itm[typ]-[grupa/poziom]-[kolor]-[profesja].png

 

myśle że odpowiedź po co jest mi to potrzebne napisalem w miarę czytelnie (a przynajmniej starałem się).

Opublikowano

34/0/3/2/5/18/12/0/586/0/3/1006

http://scr.hu/0rby/oxvzq

36/0/3/2/1/22/0/0/582/0/3/1005/

http://scr.hu/0rby/w8zql

36/0/3/5/1/24/0/0/270/0/3/1003

http://scr.hu/0rby/ffogs

z tych 3 , 3 wartość jest taka sama, może to jest kolor?

@down

rzeczywiście

50/0/3/1/5/13/9/0/402/0/3/1005

http://scr.hu/0rby/s10yj

41/0/3/2/1/24/0/0/529/0/3/1005

 

http://scr.hu/0rby/m4wbp

Opublikowano

być może, ale nie koniecznie :P wczoraj przez chwile też mi sie tak zdawało, do momentu aż natknąłem się na przedmiot o identycznym wyglądzie ale... innym podpisie. Czyli np tak jak na Twoim przykładzie, zamiast czapka mistrza cwaniactwa jeden przedmiot był podpisany czapka mistrza ognia. I wartość 3 była inna. Miałem też 2 identyczne różdżki i w jednej... w ogóle nie było na 3 miejscu wartości (było 0). Wpadłem na pomysł że numerowanie może być od 0, ale to też się nie zgadzało bo znowu 2 takie same różdżki miały na tym miejscu różne wartości... nie mogę tego rozgryźć ;/

 

edit. dzisiaj robiłem jeszcze inaczej, porównywałem kod z nazwami wczytywanych obrazków, niestety nie ma 100% trafienia że na 3, 4 czy 5 miejscu jest liczba odpowiadająca za kolor.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...