Vấn đề HttpRequest "Get" trả về Response khác với Reponse thao tác trên trình duyệt

Liên hệ QC

ongke0711

Thành viên gắn bó
Tham gia
7/9/06
Bài viết
1,954
Được thích
2,534
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

  • getWebData.xlsm
    84.5 KB · Đọc: 24
Lần chỉnh sửa cuối:
Với Request Headers thì anh quan tâm chủ yếu cái:
"Content-Type"
"Cookie"
 
Upvote 0
Cái cookie thì xử lý như thế nào befaint. Anh lấy luôn cái cookie trong Request Header của trình duyệt gán vô hàm nhưng cũng không sửa lỗi được.
Thế sao được anh. :)

Cái cookie đó chứa Session ID của client khi kết nối server. Anh kết nối trình duyệt và dùng code là 2 phiên làm việc khác nhau, nên Session ID khác nhau rồi.
Anh có code Python thử được không? Mấy cái này bên Python có Session của Request nó giữ phiên làm việc luôn, và lấy cookie rất dễ.

Cách lấy cookie: Anh kết nối trang chủ, tạo kết nối đầu tiên tới server, nó sinh ra 1 cookie, anh tìm mọi ngóc ngách xem nằm ở đâu, lấy cái đó gán cho headers.

1620787053763.png
Anh thử tìm hiểu phần mềm Postman ấy. Công cụ bắt gói tin, giúp mình tìm API, các thông số cần thiết. Hoặc trên trình duyệt có nhiều Addons như HTTP header live...
 
Upvote 0
Cách lấy cookie: Anh kết nối trang chủ, tạo kết nối đầu tiên tới server, nó sinh ra 1 cookie, anh tìm mọi ngóc ngách xem nằm ở đâu, lấy cái đó gán cho headers.

View attachment 258459

Anh lấy cái PHPSESSID từ Chrome như hình thêm vô Header mà cũng không ra đúng yêu cầu. Về web thì anh không biết nó cho lắm, không biết sai công đoạn nào.
Mỗi lần POST hay GET là nó tạo một "Cookie: PHPSESSID" mới. Anh lấy cái Cookie từ POST gắn vô GET cũng không ra ResponseText đúng. Không biết xử lý vụ này ra sao.

Screen Shot 2021-05-12 at 12.34.43.png


Mã:
.setRequestHeader "cookie", "PHPSESSID=a3q7cpkp95ebh4f43fiqqj64q7"
 
Lần chỉnh sửa cuối:
Upvote 0
Mình không biết xài cookie lấy đoạn code trên mạng về chạy thử tự nhiên ra kết quả, hay máy mình bị virus nhỉ

Mã:
Sub hello()
Dim sResponse As String, Url As String, objHTTP

Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
Url = "https://masothue.com/Ajax/Search"
objHTTP.Open "POST", Url, False
objHTTP.setRequestHeader "User-Agent", "ahihi"
objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHTTP.send ("q=0304408986&type=auto&force-search=1")
sResponse = objHTTP.responseText
MsgBox sResponse
End Sub
 
Upvote 0
Hình như chủ thớt nói chỉ vướng phần tìm theo tên. :)
 
Upvote 0
Đúng như befaint nói là khi tôi tìm theo tên thì ResponseText từ code nó không đúng với ResponseText trả về từ thao tác thủ công trên trình duyệt.
 
Upvote 0
Thớt có biết với tìm theo tên thì ra mấy trường hợp ? và ứng với từng trường hợp cần làm gì chưa ? Hãy nói thêm để làm rõ vấn đề
 
Upvote 0
Thớt có biết với tìm theo tên thì ra mấy trường hợp ? và ứng với từng trường hợp cần làm gì chưa ? Hãy nói thêm để làm rõ vấn đề

Nếu response đúng như web trả về thì tôi chỉ cần liệt kê tên cty để người dùng tự chọn tên cty mình cần truy vấn tiếp. Các bước xử ly HTMLDocument hoặc chuỗi Json thì tôi xử lý được bạn.
 
Upvote 0
Nếu response đúng như web trả về thì tôi chỉ cần liệt kê tên cty để người dùng tự chọn tên cty mình cần truy vấn tiếp. Các bước xử ly HTMLDocument hoặc chuỗi Json thì tôi xử lý được bạn.

Ở trên tôi có hỏi là tìm theo tên thì ra mấy trường hợp ? Bạn không muốn trả lời thì thôi, tôi hỏi vì ứng với từng trường hợp thì code sẽ khác, và cũng không dễ, có trả lời thì con đường đi ngắn hơn.
Vậy tôi có đoạn code tìm kiếm theo tên công ty, bạn ghi lại Response chép vào file text rồi tự phân tích kết quả cần lấy nhé.

Mã:
Sub hello()
Dim sResponse As String, Url As String, objHTTP

Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
Url = "https://masothue.com/Search/?q=C%C3%B4ng+ty+Vi%E1%BB%87t+H%C3%A0&type=auto&force-search=1"
objHTTP.Open "GET", Url, False
objHTTP.setRequestHeader "User-Agent", "ahihi"
objHTTP.send
sResponse = objHTTP.responseText
End Sub
 
Upvote 0
Ở trên tôi có hỏi là tìm theo tên thì ra mấy trường hợp ? Bạn không muốn trả lời thì thôi, tôi hỏi vì ứng với từng trường hợp thì code sẽ khác, và cũng không dễ, có trả lời thì con đường đi ngắn hơn.
Vậy tôi có đoạn code tìm kiếm theo tên công ty, bạn ghi lại Response chép vào file text rồi tự phân tích kết quả cần lấy nhé.

Mã:
Sub hello()
..
sResponse = objHTTP.responseText
End Sub

Ôi trời...đọc code của bạn xong tôi mới thấy mình mắc một cái lỗi ngớ ngẩn nhưng trả giá bằng thời gian là: Kiểm tra kết quả sai cách. Tôi làm biếng, không thêm code ghi ResponseText ra file Text mà chỉ Debug.Print vào cửa số Immediate mà cửa sổ này hiển thị có giới hạn số lượng ký tự. Tượng tự ghi xuống Cell Excel cũng bị giới hạn ký tự --> Copy ra Notepad++ thấy thiếu quá trời dòng (tổng ~ 900 dòng - 76.320 ký tự). :wallbash:
Nói chung code trong file bài đầu của tôi ra kết quả đúng mà phương pháp kiểm của tôi sai quá sai nên làm phiền mọi người.

Còn vụ bạn hỏi ở trên thì chắc do tôi không hiểu rõ trong câu hỏi. Response trả về khi tìm theo từ khoá tên sẽ liệt kê ra nhiều cty có tên trùng từ khoá. Từ đó tôi mới đọc file HTML này để lấy toàn bộ tên Cty trong đây (đường link, MST...) ghi xuống Listbox để người dùng tự chọn -> lập lại bước truy vấn theo MST hoặc theo URL tên Cty.
Đây là trả lời của tôi theo cách tôi hiểu câu "Tìm theo tên thì ra mấy trường hợp?" của bạn.

Cảm ơn bạn đã quan tâm trả lời.

(Cập nhật file chạy không lỗi.)
 

File đính kèm

  • getWebData.xlsm
    91.5 KB · Đọc: 31
Lần chỉnh sửa cuối:
Upvote 0
Chào bạn !
Mình có tùy chỉnh đoạn code của bạn để tìm mã số thuế TNCN từ số CMND ( hoặc căn cước)
mình thay "type=enterpriseName&force-search=1" thành "type=personalTax&force-search=2" thì nó chạy và ra kết quả như mong muốn.
Tuy nhiên nếu số CMND ( hoặc căn cước) chưa dò tìm trực tiếp trong trang web thì nó không ra kết quả và ngược lại nếu đã dò tìm trực tiếp trước đó trên trang web masothue.com thì nó lại ra kết quả.
Bạn có thể giúp mình tình huống này không ?
Cảm ơn bạn !
 
Upvote 0
Sao em nhập thử mã số thuế vào ô tìm kiếm mà không ra kết quả nhỉ?

Snag_475f2d.png

Snag_4783ad.png

Hay Code chưa hiểu tìm theo kiểu text/number? Search trên web thì có ra kết quả.
Cảm ơn anh.
 
Upvote 0
Sao em nhập thử mã số thuế vào ô tìm kiếm mà không ra kết quả nhỉ?

View attachment 264990

View attachment 264991

Hay Code chưa hiểu tìm theo kiểu text/number? Search trên web thì có ra kết quả.
Cảm ơn anh.

Em đổi dòng URL:
formData = "?q=" & URLEncode(CStr(sTenCty), True) & "&type=enterpriseName&force-search=1"

Thành
formData = "?q=" & URLEncode(CStr(sTenCty), True) & "&type=enterpriseTax&force-search=1"

Trong chương trình nên tạo tùy chọn kiểu tiemf kiếm, ứng vói mỗi kiểm tìm mà thay thế tham số "type" trong URL tương ứng.

Danh sách các tham số của TYPE:
Mẫu lệnh:
formData = "?q=" & URLEncode(CStr(sTenCty), True) & "&type=TypeValue&force-search=1"
TypeValue là các giá trị:
+ enterpriseName : nếu tìm tên công ty
+ enterpriseTax : nếu tìm MST
+ identity : tìm CMND/CCCD
+ legalName : tìm tên giám đốc
+ auto : tự tìm theo đặc điểm giá trị tìm (thường chính xác với MST và tên cty)
 
Lần chỉnh sửa cuối:
Upvote 0
Em đổi dòng URL:
formData = "?q=" & URLEncode(CStr(sTenCty), True) & "&type=enterpriseName&force-search=1"

Thành
formData = "?q=" & URLEncode(CStr(sTenCty), True) & "&type=enterpriseTax&force-search=1"

Trong chương trình nên tạo tùy chọn kiểu tiemf kiếm, ứng vói mỗi kiểm tìm mà thay thế tham số "type" trong URL tương ứng.

Danh sách các tham số của TYPE:
Mẫu lệnh:
formData = "?q=" & URLEncode(CStr(sTenCty), True) & "&type=TypeValue&force-search=1"
TypeValue là các giá trị:
+ enterpriseName : nếu tìm tên công ty
+ enterpriseTax : nếu tìm MST
+ identity : tìm CMND/CCCD
+ legalName : tìm tên giám đốc
+ auto : tự tìm theo đặc điểm giá trị tìm (thường chính xác với MST và tên cty)
Em có đổi sang enterpriseTax, thì lại ra kết quả không liên quan gì luôn anh ạ.

Snag_7a0cc0.png
 
Upvote 0
Sao em nhập thử mã số thuế vào ô tìm kiếm mà không ra kết quả nhỉ?

View attachment 264990



Hay Code chưa hiểu tìm theo kiểu text/number? Search trên web thì có ra kết quả.
Cảm ơn anh.

File này tôi chỉ làm tìm kiếm theo Tên Cty thôi chứ không tìm theo MST.
Trước đây code này có thể tìm theo MST được nhưng sau này trang masothue.vn nó thay đổi, chuỗi Json trả về không còn kèm theo cái link trực tiếp tới đích danh MST Cty nữa nên kết quả trả về chạy lung tung.

Screen Shot 2021-08-29 at 12.18.25.png

Tôi hiện thời chưa biết cách xử lý, chỉ xử lý được là tìm theo tên rồi mới tìm tiếp theo MST vừa trả về thôi.
File sửa đính kèm bên dưới.
 

File đính kèm

  • LẤY THÔNG TIN DOANH NGHIỆP - VBA.xlsm
    101.2 KB · Đọc: 18
Upvote 0
File này tôi chỉ làm tìm kiếm theo Tên Cty thôi chứ không tìm theo MST.
Trước đây code này có thể tìm theo MST được nhưng sau này trang masothue.vn nó thay đổi, chuỗi Json trả về không còn kèm theo cái link trực tiếp tới đích danh MST Cty nữa nên kết quả trả về chạy lung tung.

View attachment 264996

Tôi hiện thời chưa biết cách xử lý, chỉ xử lý được là tìm theo tên rồi mới tìm tiếp theo MST vừa trả về thôi.
File sửa đính kèm bên dưới.
Vâng, cảm ơn anh.
Kể ra có các option tùy chọn tìm kiếm như anh @Nguyễn Duy Tuân nói thì tuyệt.
Rất mong các thành viên cùng xây dựng và hoàn thiên, để có một công cụ hữu ích cho cộng đồng.
 
Upvote 0
File này tôi chỉ làm tìm kiếm theo Tên Cty thôi chứ không tìm theo MST.
Trước đây code này có thể tìm theo MST được nhưng sau này trang masothue.vn nó thay đổi, chuỗi Json trả về không còn kèm theo cái link trực tiếp tới đích danh MST Cty nữa nên kết quả trả về chạy lung tung.

View attachment 264996

Tôi hiện thời chưa biết cách xử lý, chỉ xử lý được là tìm theo tên rồi mới tìm tiếp theo MST vừa trả về thôi.
File sửa đính kèm bên dưới.
Thử nhập dòng sau xem ... nó ra 2 Cty ... đang rảnh bà tám 1 tí
Công Ty TNHH Dịch Vụ Viễn Thông Phương Nam Telecom
 
Upvote 0
File này tôi chỉ làm tìm kiếm theo Tên Cty thôi chứ không tìm theo MST.
Trước đây code này có thể tìm theo MST được nhưng sau này trang masothue.vn nó thay đổi, chuỗi Json trả về không còn kèm theo cái link trực tiếp tới đích danh MST Cty nữa nên kết quả trả về chạy lung tung.

View attachment 264996

Tôi hiện thời chưa biết cách xử lý, chỉ xử lý được là tìm theo tên rồi mới tìm tiếp theo MST vừa trả về thôi.
File sửa đính kèm bên dưới.
Trang mã số thuế này lúc trước nó chỉ chặn IP khi số lần khi request quá nhiều trong một khoảng thời gian nào đó khoảng 200-300 lần gì đó, khi đó tôi cần kiểm tra một số lượng MST lớn nên đã fake ID làm cho cái lượng request trong ngày lên tới 100.000 có thể sau đó nó phát hiện nên đã đổi lại cách thức, nó dùng một cái token kèm theo như hình bạn chụp cùng đi kèm cái phiên hiện tại và cái khó nữa là cái token đó sẽ chết sau một thời gian nên phải làm mới lại token, nên việc get một số lượng lớn thông tin bây giờ sẽ khó hơn chút, còn nếu get vài lần thì thêm bước get token nữa là giống y cũ thôi bạn
1630216730736.png
 
Upvote 0
Web KT
Back
Top Bottom