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

[TuT] WinHTTP 5.1 Tutorial by Phoenix_PL


Rekomendowane odpowiedzi

Opublikowano

Witam. W tym tutorialu opiszę w miarę szczegółowo zabawę z WinHTTP w AutoIT.

Nie będę korzystał z żadnych osobnych bibliotek, bo nie ma to sensu według mnie.

 

Będziemy korzystać z obiektu winhttp.winhttprequest.5.1 - link do dokumentacji w MSDN podam na końcu tutoriala, jakby ktoś był ciekawy, ale najważniejsze funkcje opiszę tutaj.

 

Jeśli ktoś nie wie co to response, jakie są jej typy, oraz tego typu rzeczy to niech uzupełni swoją wiedzę o protokole HTTP:

 

 

 

A więc zaczynamy.

 

Najpierw musimy stworzyć nasz obiekt którym wyślemy zapytanie. ObjCreate.

$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
Teraz musimy zdefiniować jakie dokładnie zapytanie chcemy wysłać. W naszym wypadku nie będziemy się zajmowali innymi typami niż POST i GET. Na początek po prostu zróbmy proste zapytanie GET.

 

Robimy to funkcją $oHTTP.Open - otwieramy zapytanie. Pierwszy parametr to typ zapytania, drugi to URL do którego zapytanie zostanie wysłane, trzeci to wartość True/False która określa czy zapytanie ma być asynchroniczne czy nie, w naszym wypadku ustawiamy na False.

 

Ja na przykład wyślę zapytanie GET do google.com

$oHTTP.Open("GET", "http://facebook.com/", False)
Teraz co prawda moglibyśmy ustawiać nagłówki HTTP, ale nie jest to w tym momencie potrzebne - dojdę do tego później - możemy wysłać nasze zapytanie.

 

$oHTTP.Send()
Zapytanie poszło w sieć. Serwer nam odpowie i zwróci do naszego obiektu wiadomość zwrotną - w tym (jak i w większości) wypadków - po prostu kod strony. Znajdować się będzie w elemencie ResponseText.

 

Jak możemy go wyświetlić, żeby sprawdzić czy wszystko poszło dobrze? A na przykład zapisując do tymczasowego pliku i otwierając w przeglądarce za pomocą ShellExecute. Ja zrobię do tego specjalną funkcję.

Func debug_response($responsetext)
	Local $hFile = FileOpen(@TempDir&"\tempresponse.html", 10)
	FileWrite($hFile, $responsetext)
	FileClose($hFile)
	ShellExecute(@TempDir&"\tempresponse.html")
EndFunc
Jeśli nam wygodniej możemy zmienić miejsce zapisania pliku na na przykład @DesktopDir, co kto lubi.

 

Możemy teraz nasze response sprawdzić w ten sposób:

debug_response($oHTTP.ResponseText)
Możemy jeszcze ewentualnie sprawdzić, czy nasz response zadziałał prawidłowo. Do tego celu służy element Status. W nim znajduje się kod zwrócony przez stronę, należy zapamiętać że 200 znaczy OK, czyli wszystko się powiodło. W innym wypadku możemy sprawdzić kod w internecie, żeby dowiedzieć się co poszło nie tak.

 

MsgBox(0, "HTTP Error Code", $oHTTP.Status)
Cały kod:

$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "http://facebook.com/", False)
$oHTTP.Send()

debug_response($oHTTP.ResponseText)

Func debug_response($responsetext)
	Local $hFile = FileOpen(@TempDir&"\tempresponse.html", 10)
	FileWrite($hFile, $responsetext)
	FileClose($hFile)
	ShellExecute(@TempDir&"\tempresponse.html")
EndFunc
I już. Możemy to odpalić i samemu się przekonać, że wyświetli nam się strona główna Facebooka w przeglądarce.

 

Krótkie wyjaśnienie - dlaczego, jeśli na jakiejś przeglądarce jesteśmy na facebooku zalogowani, tutaj jest po prostu strona główna?

WinHTTP korzysta z innych cookies niż przeglądarki. Więc działamy "na czysto".

 

Okej, mamy GET, teraz opiszę wysyłanie POST'a.

 

O ile GET było proste, bo po prostu kazało stronie coś zwrócić, to celem POST jest przesłanie do strony (lub konkretnej formy na stronie) jakichś danych. Co i jak już opisuję.

 

Najpierw musimy stworzyć obiekt. I tutaj zaczyna się zabawa z grzebaniem w kodzie strony - dlatego warto wcześniej odpalić poprzedni kod i zbadać kod który został zwrócony poprzez "Zbadaj element". Dlaczego ten z GET, a nie kod strony normalnie załadowanej w przeglądarce? O tym później, po prostu rób co mówię.

 

A więc, przyjmijmy że chcemy się zalogować na facebooku.

Spójrzmy w kod strony i zbadajmy na razie input loginu (e-maila).

 

<input type="text" class="inputtext" name="email" id="email" value="" tabindex="1">
Wygląda to tak, nam przyda się parametr ID lub name, ale lepszym jest ID.

Ale chwila, do tego wrócimy zaraz. Musimy wiedzieć gdzie dokładnie wysłać nasze zapytanie - zazwyczaj jest to jakiś plik PHP, a jego adres znajduje się w parametrze action w formie.

Szukamy kodu formy, nieco "wyżej"

 

<form id="login_form" action="https://www.facebook.com/login.php?login_attempt=1" method="post" onsubmit="return window.Event && Event.__inlineSubmit && Event.__inlineSubmit(this,event)">
Trochę dużo tego jest, ale nas interesuje jedynie parametr "action". Możemy też spojrzeć w parametr "method" - on definiuje nam tak na prawdę jaki typ zapytania ta forma obsługuje. Tutaj jest post, więc nie ma żadnego problemu.

 

A więc, wiemy gdzie wysłać response. Musimy otworzyć obiekt winhttp na tej stronie, z metodą POST.

 

$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("POST", "https://www.facebook.com/login.php?login_attempt=1", False)
Teraz, musimy sobie ułożyć zapytanie. Być może kiedyś widziałeś je na pasku URL podczas przeglądania internetu. Wygląda to tak:

param1=wartosc1&param2=wartosc2&param3=wartosc3
I tak dalej, i tak dalej. To jest właśnie nasza treść zapytania, parametr to ID lub nazwa inputa, wartość to wartość jaką normalnie byśmy do niego wpisali.

 

Szukamy na początek ID inputa z hasłem i emailem, oraz wypełniamy je sobie naszymi danymi. Stwórzmy zmienną w której przechowamy nasze dane.

 

Local $HTTPParam = "[email protected]&pass=password"
Okej. Teraz możemy w sumie spróbować wysłać nasze zapytanie. Parametry przekazujemy w funkcji Send() - jak pamiętamy, podczas GET nie podawaliśmy go, bo po prostu był niepotrzebny. Teraz musimy go podać.

 

Całość powinna wyglądać tak:

$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("POST", "https://www.facebook.com/login.php", False)
Local $HTTPParam = "[email protected]&pass=password"
$oHTTP.Send($HTTPParam)

MsgBox(0, "HTTP Error Code", $oHTTP.Status)

debug_response($oHTTP.ResponseText)

Func debug_response($responsetext)
	Local $hFile = FileOpen(@TempDir&"\tempresponse.html", 10)
	FileWrite($hFile, $responsetext)
	FileClose($hFile)
	ShellExecute(@TempDir&"\tempresponse.html")
EndFunc
Oczywiście z naszymi danymi. Możemy wysłać zapytanie i sprawdzić co się stanie.

 

Cóż. W tym wypadku, niestety, wyrzuciło nam błąd. Nie mamy obsługi ciasteczek w naszym programie, i nie będziemy jej robić, ale przynajmniej mamy pewność że nasz program działa jak należy.

 

Teraz, na koniec, wyjaśnię pewną rzecz.

 

Badamy kod który dostaliśmy z wcześniej wysłanego zapytania GET, zamiast normalnie załadować stronę - dlaczego?

 

Dlatego że wersja strony którą dostaniemy może się różnić w zależności od tego, jakiej przeglądarki będziemy używać. A skąd serwer wie jakiej używamy? Z headera user-agent, który jest wysyłany razem z zapytaniem. user-agent dla każdego silnika przeglądarki jest inny - a dla AutoIT'a domyślnie nazywa się "AutoIT". Dla IE 10 na przykład to jest Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0), a dla silnika Chrome 37 - Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36

 

Listę user-agentów danej przeglądarki znajdziemy na stronie http://www.useragentstring.com/

O tym jak zmieniać headery - poniżej.

 

Jedną z najważniejszych rzeczy, i ostatnią którą dzisiaj opiszę, jest zmienianie nagłówków naszego zapytania.

Nagłówek określa typ, zawartość, oraz parę innych pierdół w naszym zapytaniu. Listę możemy znaleźć tutaj:

http://pl.wikipedia.org/wiki/Lista_nagłówków_HTTP

 

Zmiana jest bardzo prosta - wystarczy użyć funkcji SetRequestHeader. Pierwszy parametr to nazwa nagłówka, drugi to jego wartość. Przykładowo, zmieńmy user-agenta na tego z IE 10.

$oHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)")
I to cała magia. I jak na razie koniec tutoriala. Jeśli ktoś będzie chciał więcej, a ja będę miał wenę i czas - z chęcią dokończę. Pytania składać tutaj. Dobranoc.

 

Dokumentacja obiektu winhttp.winhttpresponse.5.1: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384106(v=vs.85).aspx

846331404756772371599.jpeg
Opublikowano

Poradnik ciekawy, przeczytałem cały. Czy masz zamiar rozwinąć go o jakieś przykłady etc? Jak na razie zostawiam lajka  dla CB.

 

 

@PS w AutoIT nie siedze więc nie wiem jak to tam wygląda, ale jest przyzwoicie

hcq0.png


Opublikowano

hejty na jape:

Teraz musimy zdefiniować jakie dokładnie zapytanie chcemy wysłać. W naszym wypadku nie będziemy się zajmowali innymi typami niż POST i GET. Na początek po prostu zróbmy proste zapytanie GET.

Robimy to funkcją $oHTTP.Open - otwieramy zapytanie. Pierwszy parametr to typ zapytania,

żadne zapytanie ani jego typ bo post i get to metody.. poza tym mowisz ze nie wspomnisz o innych a jest jedynie jeszcze head ktory przesyla nam nie wszystkie informacje, ale ok

 

O ile GET było proste, bo po prostu kazało stronie coś zwrócić, to celem POST jest przesłanie do strony (lub konkretnej formy na stronie) jakichś danych.

to od kiedy get nie przesyla zadnych danych?

 

Krótkie wyjaśnienie - dlaczego, jeśli na jakiejś przeglądarce jesteśmy na facebooku zalogowani, tutaj jest po prostu strona główna?

WinHTTP korzysta z innych cookies niż przeglądarki. Więc działamy "na czysto".

no tak przeciez winhttp nie moze korzystac z cookies -.-

 

ale tak to git i dobrze,ze powstaja jakies poradniki :)

/ 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 |

  • 2 miesiące temu...
Opublikowano

Mam pytanie, zacząłem reslizować ten tutorial i przy logowaniu do facebooka jest błąd. Później doczytałem, że tak miało być, bo żeby to działało, potrzebna jest jakaś obsługa cookies, która nie została tu zaprezentowana. A więc po przerobieniu tego tutoriala można się jedynie nauczyć nieudanego logowania na jakąś stronę. A ktoś ma pomysł, jak zrobić żeby te logowanie było jednak udane? Umiem tak zrobić w FF.au3 ale WinHTTP już nie jest takie proste.

Opublikowano

Jezeli chodzi o facebooka i winhttp to nie jest takie latwe. Nie dosc ze musisz mase rzeczy wyciagnac z kodu to dodatkowo czesci rzeczy tam nie ma i musisz rozkminic w jaki sposob sa one generowane.

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...