1. Tải bản cài đặt AutoIT mới nhất

    Chào Khách. Nếu bạn mới tham gia và chưa cài đặt AutoIT.
    Vui lòng vào topic trên để tải bản AutoIT mới nhất nhé
    Dismiss Notice
  2. Quy định và nội quy

    Chào Khách. Vui lòng đọc kỹ nội quy và quy định của diễn đàn
    Để tránh bị ban một cách đáng tiếc nhé!
    Dismiss Notice
  3. Hướng dẫn chèn mã AutoIT trong diễn đàn

    Chào Khách. Vui lòng xem qua bài viết này
    Để biết cách chèn mã AutoIT trong diễn đàn bạn nhé :)
    Dismiss Notice

Hướng dẫn Cơ bản về WinHTTP và hướng dẫn lập trình WinHTTP sử dụng UDF WinHTTP

Thảo luận trong 'Hướng dẫn - Bài tập nâng cao' bắt đầu bởi Tungtata, 8/9/15.

  1. Tungtata

    Tungtata Tà tà mà sống ~ Thành viên BQT Administrator
    • 93/113

    Tham gia ngày:
    25/8/15
    Bài viết:
    289
    Đã được thích:
    924
    Nơi ở:
    Hà Nội
    WinHTTP Basic
    I, Mở đầu

    Bài viết này được hướng dẫn dựa theo WinHTTP Basic.
    Các bạn có thể tham khảo thêm tại link trên để có những hiểu biết sâu hơn :D.

    II,HTTP Request and Response Messages
    II.1 HTTP MESSAGE

    [​IMG]

    Mỗi khi Client (máy khách) hay Server (máy chủ) giao tiếp với nhau đều gửi cho nhau một gói tin có cấu trúc như hình trên.
    Gói tin này bao gồm "message header" và "message body" 2 phần này được ngăn cách nhau bởi một dòng trắng.

    II.2 HTTP REQUEST MESSAGE

    Sử dụng cấu trúc trên, khi Client gửi một yêu cầu lên sever như tải một trang web nào đó, hay đăng nhập vào trang nào đó thì Client sẽ gửi 1 HTTP MESSAGE có cấu trúc như sau:
    [​IMG]
    +> Dòng đầu tiên trong "Request message header" được gọi là "request line" và có cấu trúc:

    Mã (Text):
    request-method-name request-URI HTTP-version
    Trong đó:

    -> request-method-name: là yêu cầu của đoạn message, ví dụ : GET, POST, HEAD, and OPTIONS.

    -> request-URI: là đường dẫn yêu cầu gửi đến, ví dụ: '/'.

    -> HTTP-version: Phiên bản HTTP. Bây giờ phiên bản thông dụng nhất là "HTTP/1.1"
    Ví dụ:
    Mã (Text):
    GET /test.html HTTP/1.1
    POST /index.html HTTP/1.1
    +> Các dòng còn lại từ dòng thứ 2 trở đi của "message header" là các header bổ sung cho request đó.
    ví dụ: Host, User-Agent, Cookie, ...

    Cấu trúc của các header:
    Mã (Text):
    request-header-name: request-header-value1, request-header-value2, ...
     
    Ví dụ:
    Mã (Text):
    Host: www.xyz.com
    Connection: Keep-Alive
    Accept: image/gif, image/jpeg, */*
    Accept-Language: us-en, fr, cn
    +> Tiếp đó, "Request message body", đây là đoạn dữ liệu chính được gửi lên server để xử lí.

    Đây là hình ảnh miêu tả 1 Request Message:
    [​IMG]
    II.3 HTTP Response Message
    [​IMG]
    Cũng như HTTP Requeset Message, HTTP Respone Message cũng là một HTTP Message, do đó nó có cấu trúc của 1 HTTP Message:

    +> Dòng đầu tiên của "Respone message header" được gọi là "Status Line" (dòng trạng thái).

    Dòng trạng thái có cấu trúc:
    Mã (Text):
    HTTP-version status-code reason-phrase
    Ví dụ:
    Mã (Text):
    HTTP/1.1 200 OK
    HTTP/1.0 404 Not Found
    HTTP/1.1 403 Forbidden
    +> Các dòng tiếp theo từ dòng thứ 2 của "Respone message header" là các respone header bổ sung, và có cấu trúc:
    Mã (Text):
    response-header-name: response-header-value1, response-header-value2, ...
    Ví dụ:
    Mã (Text):
    Content-Type: text/html
    Content-Length: 35
    Connection: Keep-Alive
    Keep-Alive: timeout=15, max=100
    Dưới đây là 1 HTTP respone message:
    [​IMG]
    Tới đây các bạn đã có cái nhìn cơ bản về WinHTTP, để tìm hiểu sâu hơn thì chúng ta đi tiếp vào phần sau :D.
    III,HTTP Request Methods
    III.1 "GET" Request Method
    Mã (AutoIt):
    #include <WinHTTP.au3>
    $hOpen = _WinHttpOpen() ; Khởi tạo Winhttp
    $hConnect = _WinHttpConnect($hOpen,'hocautoit.com') ; Kết nối đến 'hocautoit.com'
    $hRequest = _WinHttpOpenRequest($hConnect,'GET','/') ; khởi tạo request 'GET' tới "/" = "http://hocautoit.com"&"/"
    _WinHttpSendRequest($hRequest) ; Gửi request
    _WinHttpReceiveResponse($hRequest) ; Chờ nhận Respone
    $Data = _WinHttpSimpleReadData($hRequest,1) ; Đọc Respone
    $sHeader = _WinHttpQueryHeaders($hRequest) ; Truy vấn Respone Headers
    ConsoleWrite($sHeader & @LF) ; Ghi Respone Headers
    ; Ghi Respone vào file
    $hFile = FileOpen(@ScriptDir&"\Hocautoit.com.html",10+256)
    FileWrite($hFile,$Data)
    FileClose($hFile)
    ; Mở file xem Respone
    ShellExecute(@ScriptDir&"\Hocautoit.com.html")
    Các bạn chạy thử đoạn code này rồi so sánh với lý thuyết HTTP Respone Message xem có đúng không nhé :p.

    III. 2 "POST" Request Method
    Mã (AutoIt):
    #include "WinHTTP.au3"
    $hOpen = _WinHttpOpen("Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0")
    $hConnect1 = _WinHttpConnect($hOpen, "www.facebook.com")
    _FaceBook_PC_login($hConnect1,'username','password')
    _WinHttpCloseHandle($hConnect1)
    _WinHttpCloseHandle($hOpen)
    Func _FaceBook_PC_login(ByRef $hConnect1, $user, $password)
            Local $hRequest
            $hRequest = _WinHttpOpenRequest($hConnect1, "GET", "/", Default, Default, Default, $WINHTTP_FLAG_SECURE)
            _WinHttpSendRequest($hRequest)
            _WinHttpReceiveResponse($hRequest)
            Local $Data
            $Data = _WinHttpSimpleReadData($hRequest, 1)
            Local $Target
            $Target = StringRegExp($Data, "/login\.php\?login_attempt=(.*?)[""|']", 2)
            If IsArray($Target) Then
                    $Target = StringReplace(StringTrimRight($Target[0], 1), '&amp;', '&')
            Else
                    $Target = "/login.php?login_attempt=1"
            EndIf
            Local $lsd
            $lsd = StringRegExp($Data, "(?i)name=[""|']lsd[""|'] value=[""|'](.*?)[""|']", 1)
            If IsArray($lsd) Then
                    $lsd = __WinHttpUrlEncode($lsd[0])
            Else
                    $lsd = __WinHttpUrlEncode("AVqHXfK1")
            EndIf
            Local $timezone
            $timezone = __WinHttpUrlEncode("-420")
            Local $lgnrnd
            $lgnrnd = StringRegExp($Data, "(?i)name=[""|']lgnrnd[""|'] value=[""|'](.*?)[""|']", 1)
            If IsArray($lgnrnd) Then
                    $lgnrnd = __WinHttpUrlEncode($lgnrnd[0])
            Else
                    $lgnrnd = __WinHttpUrlEncode("191444_7Fkq")
            EndIf
            Local $lgnjs
            $lgnjs = StringRegExp($Data, "(?i)name=[""|']lgnjs[""|'] value=[""|'](.*?)[""|']", 1)
            If IsArray($lgnjs) Then
                    $lgnjs = __WinHttpUrlEncode($lgnjs[0])
            Else
                    $lgnjs = __WinHttpUrlEncode("1381544097")
            EndIf
            Local $email
            $email = __WinHttpUrlEncode($user)
            Local $persistent
            $persistent = StringRegExp($Data, "(?i)value=[""|'](.*?)[""|'] name=[""|']persistent[""|']", 1)
            If IsArray($persistent) Then
                    $persistent = __WinHttpUrlEncode($persistent[0])
            Else
                    $persistent = __WinHttpUrlEncode("1")
            EndIf
            Local $default_persistent
            $default_persistent = StringRegExp($Data, "(?i)name=[""|']default_persistent[""|'] value=[""|'](.*?)[""|']", 1)
            If IsArray($default_persistent) Then
                    $default_persistent = __WinHttpUrlEncode($default_persistent[0])
            Else
                    $default_persistent = __WinHttpUrlEncode("1")
            EndIf
            Local $pass
            $pass = __WinHttpUrlEncode($password)
            Local $locale
            $locale = __WinHttpUrlEncode("vi_VN")
            Local $hRequest
            $hRequest = _WinHttpOpenRequest($hConnect1, "POST", $Target, Default, Default, Default, $WINHTTP_FLAG_SECURE)
            _WinHttpSendRequest($hRequest, "Content-Type: application/x-www-form-urlencoded", "lsd=" & $lsd & "&email=" & $email & "&pass=" & $pass & "&persistent=" & $persistent & "&default_persistent=" & $default_persistent & "&timezone=" & $timezone & "&lgnrnd=" & $lgnrnd & "&lgnjs=" & $lgnjs & "&locale=" & $locale)
            _WinHttpReceiveResponse($hRequest)
            Local $Data
            $Data = _WinHttpSimpleReadData($hRequest, 1)
            Local $hFopen
            $hFopen = FileOpen("Request1.html",10+256)
            FileWrite($hFopen,$Data)
            FileClose($hFopen)
            ShellExecute("Request1.html")
            Local $user_info[2], $user_id
            $user_id = StringRegExp($Data, 'id="profile_pic_header_([0-9]+)"', 1)
            If Not IsArray($user_id) Then
                    ConsoleWrite('login err!' & @LF)
                    Return 0
            Else
                    $user_info[0] = $user_id[0]
                    Local $wall_link
                    $wall_link = StringRegExp($Data, 'class="navLink" href="https://www\.facebook\.com/(.*?)\?(.*?)" title="D&#xf2;ng th&#x1edd;i gian"', 1)
                    If IsArray($wall_link) Then
                            $user_info[1] = $wall_link[0]
                    Else
                            Return 0
                    EndIf
                    Return $user_info
            EndIf
    EndFunc   ;==>_FaceBook_PC_login
    Đây là một đoạn code cho phép login FaceBook. Đoạn Code này sử dụng "POST" Request Method để gửi yêu cầu đăng nhập đến facebook.com và nhận Respone từ sever.

    Các bạn nghiên cứu đi nhé, @@ muốn viết nhiều mà rồi lại thành chẳng biết viết gì @@.

    Nguồn bài viết: nlhung - Forum hocautoit.com
     
    Chỉnh sửa cuối: 8/9/15
  2. vuathamlam

    vuathamlam Thành viên mới
    • 1/6

    Tham gia ngày:
    26/9/15
    Bài viết:
    1
    Đã được thích:
    2
    Bạn cho hỏi winhttp mình chạy trên win server 2012 không được vì ko load được #include"WinHTTP.au3". Mình phải cài thêm feature nào để nhận ra thư viện winhttp
     
    kamsamita1 and Phan Dong like this.
  3. Tungtata

    Tungtata Tà tà mà sống ~ Thành viên BQT Administrator
    • 93/113

    Tham gia ngày:
    25/8/15
    Bài viết:
    289
    Đã được thích:
    924
    Nơi ở:
    Hà Nội
    bạn đặt file WinHTTP.au3 cùng thư mục với file chính của bạn
    khi include bạn include như sau
    #include "WinHTTP.au3"
     
    kamsamita1, Phan Dong and vuathamlam like this.
  4. Jkey C Phong

    Jkey C Phong Thành viên hiểu biết
    • 83/90

    Tham gia ngày:
    7/9/15
    Bài viết:
    96
    Đã được thích:
    2,461
    Nơi ở:
    Thành phố Hồ Chí Minh
    Share cho anh em 2 func Get và Post đơn giản nhé!
    Mã (AutoIt):
    #include-once

    Global Const $HTTP_STATUS_OK = 200

    Func HttpPost($sURL, $sData = "")
    Local $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")

    $oHTTP.Open("POST", $sURL, False)
    If (@error) Then Return SetError(1, 0, 0)

    $oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")

    $oHTTP.Send($sData)
    If (@error) Then Return SetError(2, 0, 0)

    If ($oHTTP.Status <> $HTTP_STATUS_OK) Then Return SetError(3, 0, 0)

    Return SetError(0, 0, $oHTTP.ResponseText)
    EndFunc

    Func HttpGet($sURL, $sData = "")
    Local $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")

    $oHTTP.Open("GET", $sURL & "?" & $sData, False)
    If (@error) Then Return SetError(1, 0, 0)

    $oHTTP.Send()
    If (@error) Then Return SetError(2, 0, 0)

    If ($oHTTP.Status <> $HTTP_STATUS_OK) Then Return SetError(3, 0, 0)

    Return SetError(0, 0, $oHTTP.ResponseText)
    EndFunc
     
  5. TheMinh

    TheMinh Thành viên mới
    • 3/6

    Tham gia ngày:
    17/10/15
    Bài viết:
    9
    Đã được thích:
    24
    nhưng mà lấy header như nào vậy ad :D
     
    Phan Dong thích bài này.
  6. shine206

    shine206 Thành viên
    • 13/23

    Tham gia ngày:
    27/9/15
    Bài viết:
    10
    Đã được thích:
    32
    Lấy header sử dụng hàm này _WinHttpQueryHeaders . Hình như trong ví dụ có rồi mà
     
    Phan Dong thích bài này.
  7. hoangnamcbr

    hoangnamcbr Thành viên mới
    • 1/6

    Tham gia ngày:
    28/2/16
    Bài viết:
    1
    Đã được thích:
    1
    _FaceBook_PC_login($hConnect1,'username','password')
    Ad chỉ hộ chức năng ham nay giup e vs
     
    kamsamita1 thích bài này.
  8. Đức master

    Đức master Thành viên mới
    • 3/6

    Tham gia ngày:
    2/6/16
    Bài viết:
    2
    Đã được thích:
    6
    đọc header gửi đi như thế nào vậy chủ thớt
     
    kamsamita1 thích bài này.
  9. Quản lượng

    Quản lượng qlf
    • 18/23

    Tham gia ngày:
    27/4/17
    Bài viết:
    74
    Đã được thích:
    39
    Hay quá, cơ mà cái dòng
    Mã (AutoIt):
     $Target = StringReplace(StringTrimRight($Target[0], 1), '&amp;', '&')
    dùng để làm gì vậy? Em ngẫm mãi vẫn không hiểu
     
  10. mrchinh5000

    mrchinh5000 Thành viên mới
    • 3/6

    Tham gia ngày:
    21/11/15
    Bài viết:
    19
    Đã được thích:
    4
    Xóa kí tự bên phải của mảng Target[0] đi 1 kí tự
    Mã (AutoIt):
     $Target = StringReplace(StringTrimRight($Target[0], 1), '&amp;', '&')
    Thay thế kí tự '&amp;' = kí tự '&' trong cái vừa mới xóa 1 kí tự bên phải ở trên
     

Chia sẻ trang này

Đang tải...