Vấn đề HttpRequest "Get" trả về Response khác với Reponse thao tác trên trình duyệt (3 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

  • ongke0711

    Thành viên gắn bó
    Tham gia
    7/9/06
    Bài viết
    2,311
    Được thích
    3,112
    Giới tính
    Nam
    Chào các bạn,
    Tôi gặp một vấn đề là khi dùng Http request - GET thì nó trả về cái Response nhưng kiểm tra lại thì khác với Response tôi thao tác trực tiếp trên trang web.
    - Tìm theo MST, CCCD dùng "https://masothue.com/Ajax/Search/" thì chạy rất nhanh nhưng khi tìm bằng tên thì không chạy.
    - Tôi dùng "https://masothue.com/Search/?q" & chuỗi tên thì lại trả về Response sai. Đã thử khai báo các header đúng như trên trình duyệt cũng không sửa được lỗi.

    File đính kèm bên dưới. Nhờ các bạn hướng dẫn tìm ra nguyên nhân của vấn đề trên.
    Cảm ơn.


    Mã:
    Dim js As Object
        Set js = CreateObject("Scripting.Dictionary")
    
        Dim formData As String, sTenCty As String, res As String
        Const url As String = "https://masothue.com/Search/"
    
        res = httpPost("https://masothue.com/Ajax/Token", "")
        Set js = JsonConverter.ParseJSON(res)
    
        sTenCty = UCase(Sheet1.Range("A1"))
        formData = "?q=" & URLEncode(CStr(sTenCty), True) & "&type=enterpriseName&token=" & js("token") & "&force-search=1"
        Debug.Print url & formData
    
        res = httpGet(url & formData)
        Debug.Print res

    Mã:
    Function httpGet$(url$)
        'With CreateObject("WinHttp.WinHttpRequest.5.1")
        With CreateObject("MSXML2.serverXMLHTTP.6.0")
            .Open "GET", url, False
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.51"
            .setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
            .send
            httpGet = .responseText
    
            Dim getStatus As String
            If Err.Number <> 0 Then
                'khong co phan hoi tu server
            Else
                getStatus = .Status
                If getStatus <> "300" And getStatus <> "200" Then
                    Debug.Print "Some problems raised."
                Else
                    Debug.Print "Connected."
                End If
            End If
    
            On Error GoTo 0
        End With
    End Function
     

    File đính kèm

    Lần chỉnh sửa cuối:
    Bên nguồn họ đã trả về URL thông tin vào trong Response Header. Chắc là do số người sử dụng trình tải quá lớn, nên họ cần giảm tải cho server của họ.
     
    Upvote 0
    Khi search Anh chỉ cần đổi phương thức GET thay cho POST, post data chuyển lên query parameters của url. Thêm option không cho chuyển trang tự động là http.options(6) = Fasle, trong response header tại Location là đường dẫn.
     
    Upvote 0
    Khi search Anh chỉ cần đổi phương thức GET thay cho POST, post data chuyển lên query parameters của url. Thêm option không cho chuyển trang tự động là http.options(6) = Fasle, trong response header tại Location là đường dẫn.
    Anh làm thử mà nó báo Status=403, không biết bị sai ở phần nào. Em rảnh thì kiểm tra giùm anh nhe.

    Screen Shot 2024-08-06 at 21.13.47.png

    JavaScript:
    Option Explicit
    
    Dim res$, url$
    
    Sub TraCuu()
        'On Error GoTo ErrorHandler
        Application.ScreenUpdating = False
       
        Const WinHttpRequestOption_EnableRedirects = 6
       
        Dim formData As String, sMST As String, newURL As String
        Const Url1 As String = "https://masothue.com/Ajax/Token"
        Const Url2 As String = "https://masothue.com/Ajax/Search/"
        sMST = "2700118201" 'Sheets("TraCuu").Range("B4").Value
       
        Dim js As Object
        Set js = CreateObject("Scripting.Dictionary")
       
        With CreateObject("WinHttp.WinHttpRequest.5.1")
            .Open "POST", Url1, False
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
            .setRequestHeader "Content-type", "application/x-www-form-urlencoded; charset=UTF-8"
            .send ("")
            res = .responseText
            Set js = JsonConverter.ParseJSON(res)
            Debug.Print res
           
            url = Url2 & "?q=" & sMST & "&type=enterpriseTax&token=" & js("token") & "&force-search=1"
            .Option(WinHttpRequestOption_EnableRedirects) = False
            .Open "GET", url, False
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
            .setRequestHeader "Content-type", "text/html; charset=UTF-8"
            .send
            Debug.Print .Status
            res = .responseText
        End With
       
        Debug.Print "--> " & res
    End Sub
     

    File đính kèm

    Upvote 0
    PHP:
    Option Explicit
    
    Dim res$, url$
    Dim datasend, token As String
    
    Sub TraCuu()
        'On Error GoTo ErrorHandler
        Application.ScreenUpdating = False
     
        Const WinHttpRequestOption_EnableRedirects = 6
     
        Dim formData As String, sMST As String, newURL As String
        Const Url1 As String = "https://masothue.com/Ajax/Token"
        Const Url2 As String = "https://masothue.com/Ajax/Search"
        sMST = "2700118201" 'Sheets("TraCuu").Range("B4").Value
     
        Dim js As Object
        Set js = CreateObject("Scripting.Dictionary")
     
        With CreateObject("WinHttp.WinHttpRequest.5.1")
            .Open "POST", Url1, False
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
            .setRequestHeader "Content-type", "application/x-www-form-urlencoded; charset=UTF-8"
            .send ("")
            res = .responseText
            Set js = JsonConverter.ParseJSON(res)
            token = js("token")
            Debug.Print res
       
            datasend = "q=" & sMST & "&type=auto&token=" & token & "&force-search=0"
            ' "q=" & sMST & "&type=enterpriseTax&token=" & js("token") & "&force-search=1"
    
            .Option(WinHttpRequestOption_EnableRedirects) = False
            .Open "POST", Url2, False
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
            .setRequestHeader "Content-type", "text/html; charset=UTF-8"
            .send datasend
            Debug.Print .Status
            res = .responseText
        End With
     
        Debug.Print "--> " & res
    End Sub
    Em sửa lại chút, chủ yếu là thành POST
    PHP:
    .Open "POST", Url2, False
    1722954982935.png
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Bài trên em nhầm "GET", phải là "HEAD"

    Không phải responseText, phải là:
    Debug.Print .GetResponseHeader("Location")
    Sau khi có được đường dẫn này, nối với mainUrl, thực hiện request, mới có được thông tin.


    Không cần đến JsonConverter cho nó tốn tài nguyên. Chỉ cần dùng Split hoặc RegExp là được nha anh, dùng hàm Unescape để giải mã Json.
     
    Upvote 0
    Bài trên em nhầm "GET", phải là "HEAD"

    Không phải responseText, phải là:

    Sau khi có được đường dẫn này, nối với mainUrl, thực hiện request, mới có được thông tin.


    Không cần đến JsonConverter cho nó tốn tài nguyên. Chỉ cần dùng Split hoặc RegExp là được nha anh, dùng hàm Unescape để giải mã Json.
    À làm được rồi. Cảm ơn em nhé.
     
    Upvote 0
    À làm được rồi. Cảm ơn em nhé.
    Vậy theo em hiểu với gợi ý của bác Sanbi thì cần sửa lại như sau có đúng không ạ:
    - Sử dụng phương thức HEAD thay vì POST để lấy thông tin trong phần header của response.
    - Đặt WinHttpRequestOption_EnableRedirects thành False để không cho chuyển trang tự động.
    - Sử dụng .GetResponseHeader("Location") để lấy URL từ phần header của response.
     
    Upvote 0
    À làm được rồi. Cảm ơn em nhé.
    em có thêm mà loay hoay vẫn lỗi, không biết em đã sai ở bước nào ạ!
    Mã:
    Option Explicit
    
    Dim res$, url$
    Dim datasend, token As String
    Sub TraCuu()
        'On Error GoTo ErrorHandler
        Application.ScreenUpdating = False
       
        Const WinHttpRequestOption_EnableRedirects = 6
       
        Dim formData As String, sMST As String, newURL As String
        Const Url1 As String = "https://masothue.com/Ajax/Token"
        Const Url2 As String = "https://masothue.com/Ajax/Search/"
        sMST = "2700118201" 'Sheets("TraCuu").Range("B4").Value
       
        Dim js As Object
        Set js = CreateObject("Scripting.Dictionary")
       
        With CreateObject("WinHttp.WinHttpRequest.5.1")
            .Open "POST", Url1, False
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
            .setRequestHeader "Content-type", "application/x-www-form-urlencoded; charset=UTF-8"
            .Option(WinHttpRequestOption_EnableRedirects) = False 'MOI THEM
            .send ("")
            res = .responseText
            Set js = JsonConverter.ParseJSON(res)
            Debug.Print res
           
            url = Url2 & "?q=" & sMST & "&type=enterpriseTax&token=" & js("token") & "&force-search=1"
            .Option(WinHttpRequestOption_EnableRedirects) = False
            .Open "HEAD", url, False
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
            .setRequestHeader "Content-type", "text/html; charset=UTF-8"
            .Option(WinHttpRequestOption_EnableRedirects) = False 'MOI THEM
            .send
            Debug.Print .Status
            res = .getResponseHeader("Location") 'MOI THEM
            'res = .responseText
        End With
       
        Debug.Print "--> " & res
    End Sub
    1722988180332.png
    1722988463021.png
     
    Upvote 0
    em có thêm mà loay hoay vẫn lỗi, không biết em đã sai ở bước nào ạ!
    Mã:
    Option Explicit
    
    Dim res$, url$
    Dim datasend, token As String
    Sub TraCuu()
        'On Error GoTo ErrorHandler
        Application.ScreenUpdating = False
     
        Const WinHttpRequestOption_EnableRedirects = 6
     
        Dim formData As String, sMST As String, newURL As String
        Const Url1 As String = "https://masothue.com/Ajax/Token"
        Const Url2 As String = "https://masothue.com/Ajax/Search/"
       ...

    Bạn đổi cái Url2 nhé.
    JavaScript:
    Const Url2 As String = "https://masothue.com/Search/"

    (Bạn khai báo cái datasend kiểu đó, nó thành kiểu Variant chứ không phải String nhé.)
     
    Upvote 0
    Bạn đổi cái Url2 nhé.
    JavaScript:
    Const Url2 As String = "https://masothue.com/Search/"

    (Bạn khai báo cái datasend kiểu đó, nó thành kiểu Variant chứ không phải String nhé.)
    dạ, em đã đổi Url2 nhưng vẫn bị lỗi lại res = .getResponseHeader("Location")1722992010867.png
     
    Upvote 0
    dạ, em đã đổi Url2 nhưng vẫn bị lỗi lại res = .getResponseHeader("Location")

    Code này trên máy tôi chạy ra kết quả nhé. Một lưu ý là nếu bấm liên tục thì trang nó sẽ khóa IP của bạn đó. Khởi động lại modem để lấy IP mới.

    JavaScript:
    Option Explicit
    
    Dim res$, url$
    
    Sub TraCuu3()
        'On Error GoTo ErrorHandler
        Application.ScreenUpdating = False
     
        Const WinHttpRequestOption_EnableRedirects = 6
     
        Dim formData As String, sMST As String, newURL As String
        Const Url1 As String = "https://masothue.com/Ajax/Token"
        Const Url2 As String = "https://masothue.com/Search/"
        sMST = "2700118201" 'Sheets("TraCuu").Range("B4").Value
     
        Dim js As Object
        Set js = CreateObject("Scripting.Dictionary")
     
        With CreateObject("WinHttp.WinHttpRequest.5.1")
            .Open "POST", Url1, False
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
            .setRequestHeader "Content-type", "application/x-www-form-urlencoded; charset=UTF-8"
            .send ("")
            res = .responseText
            Set js = JsonConverter.ParseJSON(res)
            Debug.Print res
         
            url = Url2 & "?q=" & sMST & "&type=auto&token=" & js("token") & "&force-search=1"
            .Option(WinHttpRequestOption_EnableRedirects) = False
            .Open "HEAD", url, False
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
            .setRequestHeader "Content-type", "text/html; charset=UTF-8"
            .send
            Debug.Print .Status
            res = .getResponseHeader("Location") 'MOI THEM
        End With
     
        Debug.Print "--> " & res
    End Sub
     
    Upvote 0
    Code này trên máy tôi chạy ra kết quả nhé.

    JavaScript:
    Option Explicit
    
    Dim res$, url$
    
    Sub TraCuu3()
        'On Error GoTo ErrorHandler
        Application.ScreenUpdating = False
     
        Const WinHttpRequestOption_EnableRedirects = 6
     
        Dim formData As String, sMST As String, newURL As String
        Const Url1 As String = "https://masothue.com/Ajax/Token"
        Const Url2 As String = "https://masothue.com/Search/"
        sMST = "2700118201" 'Sheets("TraCuu").Range("B4").Value
     
        Dim js As Object
        Set js = CreateObject("Scripting.Dictionary")
     
        With CreateObject("WinHttp.WinHttpRequest.5.1")
            .Open "POST", Url1, False
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
            .setRequestHeader "Content-type", "application/x-www-form-urlencoded; charset=UTF-8"
            .send ("")
            res = .responseText
            Set js = JsonConverter.ParseJSON(res)
            Debug.Print res
         
            url = Url2 & "?q=" & sMST & "&type=auto&token=" & js("token") & "&force-search=1"
            .Option(WinHttpRequestOption_EnableRedirects) = False
            .Open "HEAD", url, False
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
            .setRequestHeader "Content-type", "text/html; charset=UTF-8"
            .send
            Debug.Print .Status
            res = .getResponseHeader("Location") 'MOI THEM
        End With
     
        Debug.Print "--> " & res
    End Sub
    em cảm ơn bác nhiều ạ!
     
    Upvote 0
    Sẵn chủ đề này.
    Nhờ các anh xem thử và giúp gợi ý hoặc code giúp để có thể lấy thông tin link download từ web timfshare, với key = avatar
    Get từ responseText không nhận được thông tin đầy đủ như khi dùng web browser.
    PHP:
    https://timfshare.com/search?key=avatar
     
    Upvote 0
    Sẵn chủ đề này.
    Nhờ các anh xem thử và giúp gợi ý hoặc code giúp để có thể lấy thông tin link download từ web timfshare, với key = avatar
    Get từ responseText không nhận được thông tin đầy đủ như khi dùng web browser.
    PHP:
    https://timfshare.com/search?key=avatar
    Cái trang này tiện lợi dữ, tự động tổng hợp các đường link.
    Mà bạn lấy những thông tin nào? Tên file, đường link fshare...
     
    Upvote 0
    Em cần đường link fshare thôi anh.
    Chạy code này nhé.

    JavaScript:
    Option Explicit
    
    Dim res$, Url$
    
    Sub TraCuu3()
        'On Error GoTo ErrorHandler
        Application.ScreenUpdating = False
      
        Const WinHttpRequestOption_EnableRedirects = 6
      
        Dim query As String
        Const Url As String = "https://timfshare.com/api/v1/string-query-search?query="
        query = "avatar"
      
        Dim js As Object
        Set js = CreateObject("Scripting.Dictionary")
      
        With CreateObject("WinHttp.WinHttpRequest.5.1")
            '.Option(WinHttpRequestOption_EnableRedirects) = False
            .Open "POST", Url & query, False
            .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
            .setRequestHeader "Content-type", "application/x-www-form-urlencoded; charset=UTF-8"
            .send ("")
            Debug.Print .Status
            res = .responseText
            Set js = JsonConverter.ParseJSON(res)
            Debug.Print res
        End With
      
    End Sub
     
    Upvote 0
    Ồ, ngon lành xịn quá.
    Cho em hỏi sao anh biết được:
    Mã:
    Const Url As String = "https://timfshare.com/api/v1/string-query-search?query="
    Hay công cụ nào, anh chia sẻ thêm với ạ.
     
    Upvote 0
    Web KT

    Bài viết mới nhất

    Back
    Top Bottom