Vấn đề HttpRequest "Get" trả về Response khác với Reponse thao tác trên trình duyệt (1 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,334
Được thích
3,154
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:
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

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

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

Trường hợp này nếu tìm chính xác theo mã số thuế (0304408986) thì làm sao để chỉ lấy được link sau khi như mình Search trên web vậy 2 anh @AutoReply @ongke0711 .

Ra link này: https://masothue.com/0304408986-cong-ty-tnhh-thuong-mai-dich-vu-viet-ha

Xin cảm ơn!
 
Upvote 0
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
View attachment 265002

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é.

Mã:
res = httpPost("https://masothue.com/Ajax/Token", "")
    'Debug.Print res
    Set js = JsonConverter.ParseJSON(res)
    
    sMST = "0304440926"
    formData = "?q=" & sMST & "&type=auto&token=" & js("token") & "&force-search=1"
    'Debug.Print formData
    
    res = httpPost("https://masothue.com/Ajax/Search", formData)
    
    
    Debug.Print "----------------------------------------" & vbCrLf
    Debug.Print res

Screen Shot 2021-08-29 at 14.22.31.png
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
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

Đúng rồi bạn. Tìm theo tên nó sẽ trả về một danh sách tất cả các tên có chứa các từ đã gõ.
Chỉ tìm theo MST mới trả về 1 tên Doanh nghiêp.
 
Upvote 0
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é.

Mã:
res = httpPost("https://masothue.com/Ajax/Token", "")
    'Debug.Print res
    Set js = JsonConverter.ParseJSON(res)
  
    sMST = "0304440926"
    formData = "?q=" & sMST & "&type=auto&token=" & js("token") & "&force-search=1"
    'Debug.Print formData
  
    res = httpPost("https://masothue.com/Ajax/Search", formData)
  
  
    Debug.Print "----------------------------------------" & vbCrLf
    Debug.Print res

View attachment 265007
Nên viết trong một object request để cùng phiên bạn, code bạn gọi hàm httpPost 2 lần tức là đang tạo 2 phiên khác nhau rồi, đồng thời sửa formData = "?q=" thành formData = "q="
1630224781882.png
 
Lần chỉnh sửa cuối:
Upvote 0
Nên viết trong một object request để cùng phiên bạn, code bạn gọi hàm httpPost 2 lần tức là đang tạo 2 phiên khác nhau rồi, đồng thời sửa formData = "?q=" thành formData = "q="

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é.
 
Upvote 0
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.

lay_thong_tin_doanh_nghiep.png

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):
Rich (BB code):
Sub LayTenDN()

'On Error GoTo ErrorHandler
    Dim js As Object, res As String, TypeValue As String
    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)
    
    TypeValue = Range("TypeValue").Value
    
    sTenCty = UCase(Sheet1.Range("B3"))
    formData = "?q=" & URLEncode(CStr(sTenCty), True) & _
                "&type=" & TypeValue & _
                "&force-search=1"
    
    res = httpGet(Url & formData)
    Call Write2Sheet(res, TypeValue)
  
ErrorHandler_Exit:
    Exit Sub

ErrorHandler:
    MsgBox "Có lõi phát sinh." & vbCrLf & "Mã loi: " & Err.Number & vbCrLf & "Noi dung loi: " & Err.Description, vbExclamation, "Thông báo"
    Resume ErrorHandler_Exit

End Sub

Sub Write2Sheet(ByVal sHTML As String, ByVal TypeValue As String)
    Dim oHtml As HTMLDocument
    Dim oElement As Object, prc As Object, prc2 As Object
    Dim i As Long, j As Long, k As Long
    
    On Error GoTo lbEndSub
    
    Set oHtml = New HTMLDocument
    oHtml.body.innerHTML = sHTML
    Sheet1.Range("A7:D1000").ClearContents
    Sheet1.Range("D3") = "Xin cho..."
    
    If TypeValue = "enterpriseTax" Then
        'table-taxinfo
        Dim tb As Object, row As Object, r As Long
        'Set tb = oHtml.getElementsByClassName("Table - taxinfo")
        Set tb = oHtml.getElementsByTagName("TABLE")(0)
        For r = 0 To tb.Rows.Length - 1
            Set row = tb.Rows(r)
            Cells(r + 7, 1).Value = row.Cells(0).innerText
            If row.Cells.Length > 1 Then
                Cells(r + 7, 2).Value = row.Cells(1).innerText
            End If
        Next
        GoTo lbEndSub
    End If
    
    Set prc = oHtml.getElementsByClassName("tax-listing")(0).getElementsByTagName("a")
    Set prc2 = oHtml.getElementsByClassName("tax-listing")(0).getElementsByTagName("address")
        
    i = 0: j = 0: k = 0
    For Each oElement In prc
        If k > 2 Then
            k = 0: j = j + 1
        End If
        Sheet1.Range("A7").Offset(j, k) = prc(i).innerText
        Sheet1.Range("D7").Offset(j, 0) = prc2(j).innerText
        i = i + 1: k = k + 1
    Next oElement
    
lbEndSub:
    If Err <> 0 Then
        Sheet1.Range("D3") = "Loi tim kiem? Hay kiem tr kieu tim kiem."
        Sheet1.Range("D3").Font.Color = vbRed
    Else
        Sheet1.Range("D3") = "Xong."
        Sheet1.Range("D3").Font.Color = vbGreen
    End If
    Set oHtml = Nothing
    Set oElement = Nothing

End Sub
 

File đính kèm

Upvote 0
Chủ đề mã số thuế bên này không biết còn chạy được không, mọi người chạy thử

 
Upvote 0
Chủ đề mã số thuế bên này không biết còn chạy được không, mọi người chạy thử

hết chạy được rồi bạn, do trang masothue nó thay đổi rồi bạn !
 
Upvote 0
rồi xong. Masothue.com lại thay đổi gì nữa rồi, tối qua request nhiều quá hay sao không biết !
 
Upvote 0
Sao file mình làm từ năm 2019 giờ vẫn chạy được nhỉ. @@ .

QOUC6S.gif
 
Upvote 0
Mình mới kiểm tra lại File lấy thông tin chỗ a Tuân ở máy nơi khác (khác IP máy mình) thì chạy bình thường. Tuy nhiên cái mình đang làm là tra cứu mã số thuế TNCN từ số CMND(hoặc căn cước)
Code mình như sau (hôm qua chạy ngon lành, sáng nay thì lỗi, không chạy được nữa )
Mình qua 2 lần Post và Get, nếu 1 lần Post và 1 lần Get thì nếu số CMND đó mình mới tra cứu thì nó ra kết quả còn nếu số CMND đó chưa tra cứu thì nó không ra kết quả, chả biết nguyên nhân tại sao !

Mã:
Function LayTTMSTNCN(ByVal SoCMND As String)
Dim Msg As String, Url As String
Dim hreq As Object, html As Object, js As Object

    Set hreq = CreateObject("WinHttp.WinHttpRequest.5.1")
    Set html = CreateObject("htmlfile")
    Set js = CreateObject("Scripting.Dictionary")
   
    With hreq
        .Open "POST", "https://masothue.com/Ajax/Token", 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"
        .setRequestHeader "Content-type", "application/x-www-form-urlencoded; charset=UTF-8"
        .send (Msg)
        Set js = JsonConverter.ParseJSON(.responseText)
       
        Msg = "q=" & SoCMND & "&type=personalTax&token=" & js("token") & "&force-search=1"
        .Open "POST", "https://masothue.com/Ajax/Search", 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"
        .setRequestHeader "Content-type", "application/x-www-form-urlencoded; charset=UTF-8"
        .send (Msg)
        .WaitForResponse
       
        Url = GetUrl(.responseText)
        If InStr(1, Url, "ch\u01b0a c\u00f3") > 0 Or Len(Url) = 0 Then
            LayTTMSTNCN = "Chua cap MST"
            Exit Function
        Else
            .Open "GET", "https://masothue.com" & Url, False
            .send
            html.body.innerHTML = .responseText
                   
            If Err.Number Then
                Err.Clear
            Else
                LayTTMSTNCN = html.getElementsByClassName("table-taxinfo")(0).innerText
            End If
            html.Close
        End If
    End With
   
    Set hreq = Nothing
    Set html = Nothing
    Set js = Nothing

End Function

Function GetUrl(ByVal str As String)
    Dim h As Long, i As Long, s As String
    h = InStr(1, str, "\/")
    If h > 0 Then
        For i = h + 2 To Len(str)
            If Mid(str, i, 1) = Chr(34) Then
                s = Mid(str, h + 1, i - h - 1)
                Exit For
            End If
        Next i
        GetUrl = s
    End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Mình mới kiểm tra lại File lấy thông tin chỗ a Tuân ở máy nơi khác (khác IP máy mình) thì chạy bình thường. Tuy nhiên cái mình đang làm là tra cứu mã số thuế TNCN từ số CMND(hoặc căn cước)
Code mình như sau (hôm qua chạy ngon lành, sáng nay thì lỗi, không chạy được nữa )
Mình qua 2 lần Post và Get, nếu 1 lần Post và 1 lần Get thì nếu số CMND đó mình mới tra cứu thì nó ra kết quả còn nếu số CMND đó chưa tra cứu thì nó không ra kết quả, chả biết nguyên nhân tại sao !
Tắt modem router, khởi động lại là được.
 
Upvote 0
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.

Screen Shot 2021-09-06 at 19.18.40.png
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
ko biết sử dụng được lâu ko nữa xong nó lại khóa do sent với get nhiều quá
 
Upvote 0
View attachment 265554


Làm như nào bây giờ để nó có thể chạy mượt mà được bây giờ?
Bài đã được tự động gộp:


Họ dùng công nghệ gì không biết mà có thể khóa được nhỉ?

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.

Screen Shot 2021-09-06 at 22.30.23.png


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:

Screen Shot 2021-09-06 at 22.43.00.png

Và link down ở đây: https://docs.microsoft.com/en-us/an...-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ì đó.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
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.

View attachment 265556


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:

View attachment 265557

Và link down ở đây: https://docs.microsoft.com/en-us/an...-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ì đó.
Tôi nghĩ bạn viết đoạn code fake cái proxy của nó để hoàn chỉnh, proxy thì lấy mấy cái proxy free ở web nó làm mới thường xuyên nên có chết hay bị chặn cũng chẳng sao, lấy trong web này https://www.sslproxies.org/ lấy mấy thằng port 8080 thôi để hạn chế mấy cái proxy không hoạt động
1630946213492.png
 
Upvote 0
Bạn bỏ cái header này đi xem còn chạy được không?

View attachment 265569
mình bỏ đoạn này vẫn không chạy được bạn !
Bài đã được tự động gộp:

Tôi nghĩ bạn viết đoạn code fake cái proxy của nó để hoàn chỉnh, proxy thì lấy mấy cái proxy free ở web nó làm mới thường xuyên nên có chết hay bị chặn cũng chẳng sao, lấy trong web này https://www.sslproxies.org/ lấy mấy thằng port 8080 thôi để hạn chế mấy cái proxy không hoạt động
View attachment 265560
đã thành công, tuy nhiên tốc độ request khá chậm, Mình có thể dùng IP gì hoặc ở nước nào cho tốc độ nhanh hơn được không bạn ?
Cảm ơn bạn !
 
Upvote 0
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.
Do phần mềm xuất hóa đơn Invoice mình đang dùng không có chức năng "Lấy thông tin" từ web (như Misa hóa đơn click vào nút "Lấy thông tin" sẽ tự động tra cứu theo dữ liệu trên web thuế). Hiện tại "Danh sách khách hàng" trên phần mềm khi địa chỉ thay đổi sẽ không cập nhật lại, rất tốn thời gian kiểm tra lại và khi lỡ xuất hóa đơn rồi bên mua lại yêu cầu làm biên bản điều chỉnh hóa đơn nếu thông tin khách hàng thay đổi.
Mình xin mượn code và file của anh Tuân để tra cứu mã số thuế. Mình chỉnh sửa lại code ghi dữ liệu theo cột (module TestMST_Column) mục đích để tra cứu được nhiều mã số thuế. Tuy nhiên mình thấy nhiều bài mấy bạn nói IP bị chặn nếu "sent" và "get" lên web nhiều quá, danh sách mình có khoản 200 mã số thuế cần dò lại, không biết nếu click tra cứu lấy một lúc 200 mã số thuế thì có bị chặn IP không, mình sợ bị chặn IP nên có để code cách 2s gửi lệnh 1 lần:
Mã:
Application.Wait Now + TimeValue("00:00:2")
Mong anh chị xem giúp đỡ và tư vấn thêm giúp mình.
 

File đính kèm

Upvote 0
Do phần mềm xuất hóa đơn Invoice mình đang dùng không có chức năng "Lấy thông tin" từ web (như Misa hóa đơn click vào nút "Lấy thông tin" sẽ tự động tra cứu theo dữ liệu trên web thuế). Hiện tại "Danh sách khách hàng" trên phần mềm khi địa chỉ thay đổi sẽ không cập nhật lại, rất tốn thời gian kiểm tra lại và khi lỡ xuất hóa đơn rồi bên mua lại yêu cầu làm biên bản điều chỉnh hóa đơn nếu thông tin khách hàng thay đổi.
Mình xin mượn code và file của anh Tuân để tra cứu mã số thuế. Mình chỉnh sửa lại code ghi dữ liệu theo cột (module TestMST_Column) mục đích để tra cứu được nhiều mã số thuế. Tuy nhiên mình thấy nhiều bài mấy bạn nói IP bị chặn nếu "sent" và "get" lên web nhiều quá, danh sách mình có khoản 200 mã số thuế cần dò lại, không biết nếu click tra cứu lấy một lúc 200 mã số thuế thì có bị chặn IP không, mình sợ bị chặn IP nên có để code cách 2s gửi lệnh 1 lần:
Mã:
Application.Wait Now + TimeValue("00:00:2")
Mong anh chị xem giúp đỡ và tư vấn thêm giúp mình.

Bạn xem file demo bài #39
 
Upvote 0
Bạn ơi cho mình hỏi "Tra cứu theo danh sách" nếu MST chi nhánh (có thêm đuôi -001) thì kết quả chỉ trả về thông tin cty mẹ thôi hả bạn. Có cách nào hiện thông tin địa chỉ của chi nhánh không bạn.
 
Upvote 0
Nó vẫn ra thông tin chi nhánh mà bạn.
Ví dụ MST như trong hình này nè bạn: 2 địa chỉ khác nhau, nếu MST chi nhánh thì địa chỉ như trong hình bên phải.
MST.JPG
Cho mình hỏi thêm khi click Tra cứu chi tiết thì báo lỗi tại dòng này:
Error MST.JPG
 
Upvote 0
Ví dụ MST như trong hình này nè bạn: 2 địa chỉ khác nhau, nếu MST chi nhánh thì địa chỉ như trong hình bên phải.
View attachment 267805
Cho mình hỏi thêm khi click Tra cứu chi tiết thì báo lỗi tại dòng này:

- 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.
 
Upvote 0
- 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.
Chào bác ạ!
Em xin phép quay lại chủ đề này, trước giờ em dùng file "TRA CỨU THÔNG TIN DOANH NGHIỆP.xlsm" vẫn hoạt động tốt tuy nhiên hôm nay em có thử thì báo lỗi như ảnh sau:
1718790909575.png
Có vẻ trang masothue.com đã thay đổi thuật toán ạ!
Bác có thể xem giúp em không ạ!
 
Upvote 0
Chào bác ạ!
Em xin phép quay lại chủ đề này, trước giờ em dùng file "TRA CỨU THÔNG TIN DOANH NGHIỆP.xlsm" vẫn hoạt động tốt tuy nhiên hôm nay em có thử thì báo lỗi như ảnh sau:
View attachment 301824
Có vẻ trang masothue.com đã thay đổi thuật toán ạ!
Bác có thể xem giúp em không ạ!

Bạn đổi dòng: setRequestHeader trong các POST, GET request như dòng dưới nhé.

JavaScript:
.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"
 
Upvote 0
Bạn đổi dòng: setRequestHeader trong các POST, GET request như dòng dưới nhé.

JavaScript:
.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"
wow, cảm ơn bác nhiều ạ!
 
Upvote 0
Có một lưu ý là khi bấm chạy test các MST nhiều quá thì trang masothue.com nó sẽ hiện hộp thoại kiểm tra có phải Robot hay không. Khi đó bạn phải trả lời các câu hỏi của nó thủ công, file của tôi chưa làm được việc vượt cái hàng rào này nhé.
 
Upvote 0
Có một lưu ý là khi bấm chạy test các MST nhiều quá thì trang masothue.com nó sẽ hiện hộp thoại kiểm tra có phải Robot hay không. Khi đó bạn phải trả lời các câu hỏi của nó thủ công, file của tôi chưa làm được việc vượt cái hàng rào này nhé.
Vâng ạ, cơ mà lúc đầu e cứ nghĩ là họ chèn thuật toán dùng Cloudflare hay cookie gì đó cơ. Mà chỉ cần đổi User-Agent từ Mac sang Win và nâng cấp Chrome mới hơn là được ạ! Hay còn ý nghĩa gì đằng sau không ạ?
 
Upvote 0
Có một lưu ý là khi bấm chạy test các MST nhiều quá thì trang masothue.com nó sẽ hiện hộp thoại kiểm tra có phải Robot hay không. Khi đó bạn phải trả lời các câu hỏi của nó thủ công, file của tôi chưa làm được việc vượt cái hàng rào này nhé.
Họ đưa ra capcha để anh không thể vượt qua mà.
Có chăng bẫy cái sự kiện có capcha, sai thì dùng IE nổi lên để điền cachap vào, hoặc dùng shell chạy Chorme / Firefox;
Em mới ý tưởng thôi chứ chưa có làm lần nào.
 
Upvote 0
1/ ai hiểu và viết được các kiểu bài như thớt này là biết viết phần máy khách ( Client ) ...

2/ chịu khó dò viết phần Máy chủ ( Server ) kết nối tới CSDL xong đẩy lên giao diện Web là xong ... vậy là tự viết thành công Server - Client

3/ cái WebServer.dll của Tôi thay vì tạo giao diện web đẩy lên nhìn thấy dữ liệu thì Tôi loại bỏ nó đi thôi mà cho kết nối trực tiếp

4/ cái vụ capcha tuỳ theo ai đó viết Web còn tôi thì xử lý một hàm nhỏ phía máy chủ nếu IP nào đó truy xuất liên tục trên 10 lần là khoá hay nổi lên cái Form nhập capcha thì lại cho truy xuất tiếp là xong

... gợi ý vài dòng vậy cho ai đam mê có hướng dò là ra vì thời đại AL cần gì có Em ChatGTP hỏi xong tư duy logis xong dò là ra
 
Lần chỉnh sửa cuối:
Upvote 0
M
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.

View attachment 265542
File chủa bạn mình thấy chạy rất nhanh, nhưng gặp trường hợp không có mã số thuế là dừng luôn.
Đúng ra phải bỏ qua trường hợp không có thì chuyển sang kiểm tra hàng tiếp theo
 
Upvote 0
M

File chủa bạn mình thấy chạy rất nhanh, nhưng gặp trường hợp không có mã số thuế là dừng luôn.
Đúng ra phải bỏ qua trường hợp không có thì chuyển sang kiểm tra hàng tiếp theo
Bạn tải lại file của bài #37 xem, tôi thấy nó chạy và bỏ qua dòng trống mà.

Screen Shot 2024-06-28 at 21.15.38.png
 
Upvote 0
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
Ồ, 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 ạ.

Thêm đoạn code Loop JSON để lấy link url.

JavaScript:
i = 1
    For Each Item In js("data")
        Sheet1.Cells(i, 2).Value = Item("url")
        i = i + 1
    Next

Screen Shot 2024-08-07 at 11.07.21.png

Screenshot at Aug 07 11-13-52.png
 
Lần chỉnh sửa cuối:
Upvote 0
Bên masothue vn họ sử dụng cách mới để chặn yêu cầu từ HTTP.
Nên cần sử dụng trình duyệt Web để tải, nhưng vẫn bị mã số thuế vn họ kiểm duyệt, họ chủ yếu cho người dùng xem quảng cáo, để họ có thu nhập. Nhưng keo kiệt với người dùng.

Tôi đã viết cả 2 bản nguồn Tổng cục thuế và masothue vn, tại Tài nguyên diễn đàn để mọi người cần sử dụng để tra cứu.

Ngày trước tôi viết Http Request, giúp họ tiết kiệm chi phí chỉ với 2, 3 request là tải được thông tin, giờ do họ quá keo và khắc khe, tôi đã chuyển sang trình duyệt, bây giờ họ và người dùng đồng thời phải tốn kém chi phí gấp nhiều lần khi cần tải cả một trang web hoàn chỉnh để tải 1 thông tin. Tôi không hiểu tại sao họ lại keo đến vậy, 1 bên là ăn tiền quảng cáo với hàng chục quảng cáo trên 1 trang, 1 bên là nhà nước.
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom