Vấn đề HttpRequest “Get” trả về Response khác với Reponse thao tác trên trình duyệt
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 "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 "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.Dim js As Object Set js = CreateObject("Scripting.Dictionary") Dim formData As String, sTenCty As String, res As String Const url As String = "masothue.com/Search/" res = httpPost("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 resFunction 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
Với Request Headers thì anh quan tâm chủ yếu cái:
"Content-Type"
"Cookie"
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.
2281
hế 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.
2282
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…
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.2283
.setRequestHeader "cookie", "PHPSESSID=a3q7cpkp95ebh4f43fiqqj64q7"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ỉ
Sub hello() Dim sResponse As String, Url As String, objHTTP Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") Url = "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
www.giaiphapexcel.com/diendan/threads/v%E1%BA%A5n-%C4%91%E1%BB%81-httprequest-get-tr%E1%BA%A3-v%E1%BB%81-response-kh%C3%A1c-v%E1%BB%9Bi-reponse-thao-t%C3%A1c-tr%C3%AAn-tr%C3%ACnh-duy%E1%BB%87t.155487/
Ứng dụng AI và Chat GPT trong Quản trị nhân sự
Học xong khóa này, học viên có thể: Hiểu đúng bản chất AI, các nhóm AI phổ biến và cách AI “hoạt động” ở...
Xem khóa học
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.
Ô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.
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)
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.
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 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.
2290
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.
Cảm ơn bạn.
Tôi cũng đã sửa lại nhưng không biết còn sai chỗ khai báo nào mà chuỗi Json trả về cũng chưa đúng như của bạn. Bạn kiểm tra giùm tôi nhé.
Cái mấu chốt nó nằm ở đây :thumbs:. Bữa giờ cứ loay hoay không biết nguyên nhân, không xử lý được đoạn này.
Cảm ơn bạn nhé.
Tôi đã hoàn thiện thêm code của file gửi trên trang đầu như sau:
1. Thiết lập khai báo tìm tùy ý các thông tin
2. Cho phép tìm MST chính xác, web thấy sao Excel thấy vậy.
2295
Mã nguồn (có một số đoạn code file cũ thừa tôi không xóa, để đó để các bạn ứng dụng cho vieeucj khác):
Tắt modem router, khởi động lại là được.
Mới sửa lại cái file tra cứu theo các kiểu: MST , CCCD (CMND), Tên DN và thêm cái tìm theo danh sách MST vì lúc trước có bạn hỏi.
2298
Một cách sửa lỗi trên là không dùng WinHTTP mà đổi sang MSXML2. Trong code tôi có viết sẳn rồi.
2302
Nếu dùng WinHTTP thì bạn chạy file đính kèm xem sửa lỗi TLS của Windows xem còn lỗi không. Do máy tôi cài rồi nên chạy không lỗi.
Theo tôi biết thì nguyên nhân nó tương tự như nội dung bên dưới:
2301
Và link down ở đây: docs.microsoft.com/en-us/answers/questions/247500/tls-11-and-tls-12-easy-fix-download-missing.html
Còn về vụ khoá IP thì tôi không rành web nên nghĩ chắc họ dùng các tool để chống DDOS hoặc kỹ thuậnt anti-scraping gì đó.
Bạn xem file demo bài trên.
Nó vẫn ra thông tin chi nhánh mà bạn.
– Tôi có ghi chú đầu bài là lấy thông tin từ trang masothue.vn. Do đó nếu trang đó chưa cập nhật thì cũng bó tay.
– Nút tra cứu chi tiết là dùng khi bạn tìm theo tên DN nhập ở ô bên trái –> nó sẽ trả về một danh sách các cty có tên giống vậy và bạn click chọn MST của Cty nào cần xem chi tiết.