Tải hóa đơn điện tử (https://hoadondientu.gdt.gov.vn/) Excel Vba

Liên hệ QC

ongke0711

Thành viên gắn bó
Tham gia
7/9/06
Bài viết
2,230
Được thích
2,950
Giới tính
Nam
Chào các bạn,
Tôi ngồi mò mẫm mấy ngày mới tìm được cách tải hóa đơn điện tử từ trang https://hoadondientu.gdt.gov.vn/. Cách này có thể không chuyên nghiệp nhưng cũng giải quyết được vấn đề tải hóa đơn hàng loạt từ trang trên và ghi xuống Excel theo định dạng dễ tổng hợp dữ liệu sau này.
- Tốc độ không nhanh như các ứng dụng python siêu nhanh.
- Chưa tìm được các link tải file .xml hoặc .html
- Chưa trải nghiệm qua các định dạng hóa đơn điện tử của các nhà cung cấp giải pháp khác nhau nên sẽ không đảm bảo chạy đúng 100%.
- Chưa biết cách tích hợp code vượt Captcha của (Python, C#..) vào VBA nên phải nhập Captcha thủ công.
Nói chung cái tool cũng giải quyết được việc tải hóa đơn hàng loạt :D .
Tôi sẽ upload file demo không khóa (có khóa cũng như không) sau vì code còn lộn xộn lắm. Các bạn xem qua và đóng góp cách xử lý tốt hơn, gọn hơn nhé.



*** 12/10/2024: Cập nhật sửa một đống lỗi.
*** 15/10/2024: Cập nhật sửa lỗi Null và nhập ngày tháng.
*** 16/10/2024: Thêm tính năng lưu User/Pass.
*** 20/10/2024: Sửa lỗi hiển thị ngày tháng, sửa và thêm một số code phụ trợ.
*** 28/10/2024: Sửa lấy hóa đơn từ máy tính tiền.
*** 07/11/2024: Sửa code trích xuất dữ liệu, thêm cột so sánh.
*** 13/11/2024: Dùng code của bạn Hesanbi để tự động nhập Captcha. Thêm code lấy link tra cứu của VNPT và BKAV.
 

File đính kèm

  • TaiHoaDonDienTu_v4_luuUserPass.xlsm
    264.1 KB · Đọc: 67
Lần chỉnh sửa cuối:
Có nhiều loại hóa đơn, mỗi hóa đơn lại có các khóa thẻ xml khác nhau, họ định nghĩa là thẻ tên trường, thì có dữ liệu tương ứng nằm trong các khóa thông tin khác. Hddt mua vào và bán ra có các trường khác nhau. Ở trên em có để cái bảng thẻ xml, trong đó có nhiều trường đã phân biệt trường chung và riêng.
Có hóa đơn sai sót và thay đổi cũng có các thẻ do TT và NĐ cqt định nghĩa.
Hôm bữa anh không nhìn kỹ Key 3 trong cái bảng của em :D .
 
Upvote 0
Em thử thì bị lỗi như này ạ
 

File đính kèm

  • 1731378193327.png
    1731378193327.png
    113 KB · Đọc: 37
Upvote 0
Upvote 0
em đã thử lại 7-8 lần vẫn báo vậy
Bài đã được tự động gộp:


khi bấm "ok" nó lại báo lỗi như này ạView attachment 305495

PM hiện tại chỉ có phép tìm kiếm 1 tháng thôi, Thông báo nè
:D Có thể tìm kiếm nhiều tháng nhưng hạn chế là số lượng hoá đơn nhiều, gửi nhiều request liên tục nên bị web nó chặn lại. Tôi đã chạy thử tải về khoảng 700 hđ tổng nhưng chi tiết thì chừng 200 hđ là bị văng. Có nhiều cty một tháng cũng cả ngàn hđ nên tốt nhất chia nhỏ ra để tải.
Các bạn chờ tool của bạn Hesanbi đi nhé. :)
 
Upvote 0
Có nhiều loại hóa đơn, mỗi hóa đơn lại có các khóa thẻ xml khác nhau, họ định nghĩa là thẻ tên trường, thì có dữ liệu tương ứng nằm trong các khóa thông tin khác. Hddt mua vào và bán ra có các trường khác nhau. Ở trên em có để cái bảng thẻ xml, trong đó có nhiều trường đã phân biệt trường chung và riêng.

:D Có thể tìm kiếm nhiều tháng nhưng hạn chế là số lượng hoá đơn nhiều, gửi nhiều request liên tục nên bị web nó chặn lại. Tôi đã chạy thử tải về khoảng 700 hđ tổng nhưng chi tiết thì chừng 200 hđ là bị văng. Có nhiều cty một tháng cũng cả ngàn hđ nên tốt nhất chia nhỏ ra để tải.
Các bạn chờ tool của bạn Hesanbi đi nhé. :)
Hôm nay thuế đang bảo trì các bác ơi :D không ổn định đâu mai rồi test
 
Upvote 0
Hôm nay thuế đang bảo trì các bác ơi :D không ổn định đâu mai rồi test
Nếu tôi không nhầm thì họ sẽ cập nhật lại API hoặc Token hoặc một cách nào đó chặn tải số lượng nhiều hóa đơn.
Dễ hiểu là vì chương trình tải hóa đơn tải đi tải lại tại nguồn với số lượng yêu cầu quá khủng. Nên họ không có đủ băng thông cho điều đó.
Khi tải về các hóa đơn đã tải rồi thì không tải nữa lúc đó mới giảm tải cho Nguồn. "Nguồn mới sống sót nổi".

Giả sử bạn đang livestream sức hút của bạn quá khủng tới 100 triệu người xem đồng thời. Băng thông không đám ứng nổi. Sập livestream.
 
Upvote 0
Nếu tôi không nhầm thì họ sẽ cập nhật lại API hoặc Token hoặc một cách nào đó chặn tải số lượng nhiều hóa đơn.
Dễ hiểu là vì chương trình tải hóa đơn tải đi tải lại tại nguồn với số lượng yêu cầu quá khủng. Nên họ không có đủ băng thông cho điều đó.
Khi tải về các hóa đơn đã tải rồi thì không tải nữa lúc đó mới giảm tải cho Nguồn. "Nguồn mới sống sót nổi".

Giả sử bạn đang livestream sức hút của bạn quá khủng tới 100 triệu người xem đồng thời. Băng thông không đám ứng nổi. Sập livestream.
Dạ anh với lại có thể họ sửa lỗi thể hiện hóa đơn khi tìm kiếm, hiện tại đang bị lỗi tìm kiếm bị thiếu hóa đơn. À cho em hỏi, anh có thể phân tích cách lấy hóa đơn gốc của VNPT, viettel (Viễn thông), em có hóa đơn gốc lẫn xml gốc, nhưng không tìm thấy key trong đó, không hiểu NIBOT đã làm cách nào mà lấy được hóa đơn gốc.
 
Upvote 0
Dạ anh với lại có thể họ sửa lỗi thể hiện hóa đơn khi tìm kiếm, hiện tại đang bị lỗi tìm kiếm bị thiếu hóa đơn. À cho em hỏi, anh có thể phân tích cách lấy hóa đơn gốc của VNPT, viettel (Viễn thông), em có hóa đơn gốc lẫn xml gốc, nhưng không tìm thấy key trong đó, không hiểu NIBOT đã làm cách nào mà lấy được hóa đơn gốc.
File mới của tôi có thêm cách lấy hoá đơn của vnpt đó.
 
Upvote 0
File mới của tôi có thêm cách lấy hoá đơn của vnpt đó.
Cập nhật thêm cách lấy hóa đơn của BKAV là cái ID đó bác, hóa đơn cước viễn thông của VNPT hả bác. Trường hợp cùng một mã số nhà cung cấp giải pháp hóa đơn điện tử nhưng có 2 đường link khác nhau thì làm sao bác, ví dụ như của shopee, có thể lấy được key nhưng bị trùng mã số nhà cung cấp GPHĐ ĐT
 
Upvote 0
File mới của tôi có thêm cách lấy hoá đơn của vnpt đó.
PM này e nghĩ phải cập nhật đủ các nhà cung cấp hóa đơn, từ đó hy vọng hoàn thiện được hết. Bản demo mọi người test xem thiếu cài nào, nhờ họ gửi XML cho a, a nghiên cứu và cập nhật thêm để hoàn thiện
 
Upvote 0
Tôi thấy các nhà cung cấp giải pháp khác nhau có thể sẽ gắn thông tin vào các thẻ khác nhau: thttltsuat[], ttin[], ttkhac[], ... và cả tên trường. Cái tên trường trong file XML cũng có thể khác so với tên trường trong file Json. Do đó chỉ khi gặp các hóa đơn khác nhau mới bổ sung thêm được. Cái tên trường "TongTien_Thue" có thể là "tgtthue" trong json, trong json tôi chưa thấy họ dùng dấu gạch dưới "_".
Theo như hình của bạn thì bạn thử thêm đoạn code riêng cho cái thẻ ttin[] xem sao.

ví dụ:

View attachment 305423

Tôi trích xuất dữ liệu từ file json do tôi thấy có nhiều hóa đơn có file json nhưng không có file XML (không có hồ sơ gốc) trên hệ thống nên nếu tổng hợp sẽ thiếu. Nếu bên kế toán chỉ cần lấy dữ liệu có file XML thôi thì dễ hơn nhiều, chỉ cần tải hàng loạt file XML rồi dùng cái tool của bạn @hoamattroicoi là nhanh gọn lẹ rồi.
jText_TongTien_Thue.JPG

Tôi không hiểu lắm về file json. Như trong code hóa đơn này tôi debug.print jsontext như hình thì tôi thấy tại thẻ ttkhac[] có "ttruong":"TongTien_Thue" nên tôi nghĩ bên phát hành hóa đơn họ theo cấu trúc file xml quy định thì khi gửi dữ liệu về tổng cục thuế thì cũng theo quy định bên file xml.
Tôi mới tìm ra thêm một trường tên như bên dưới, bạn bổ sung thêm vào dòng code của bạn.

Mã:
"Tiền thuế dòng (Tiền thuế GTGT)"

"Ti" & ChrW(7873) & "n thu" & ChrW(7871) & " d" & ChrW(242) & "ng (Ti" & ChrW(7873) & "n thu" & ChrW(7871) & " GTGT)"
Nếu mỗi nhà cung cấp hóa đơn điện tử họ tự quy định ttruong theo cách của họ mà không có quy ước chung nào thì mình liệt kê đến khi nào mới tra đủ cho các trường hợp.
 
Upvote 0
Nếu mỗi nhà cung cấp hóa đơn điện tử họ tự quy định ttruong theo cách của họ mà không có quy ước chung nào thì mình liệt kê đến khi nào mới tra đủ cho các trường hợp.
- Tôi cũng gặp hd đơn có dùng tên TongTien_thue nên phải thêm thủ công thôi bạn.
- Tôi thấy có qui định về việc về việc thiết kế thông tin theo thẻ nhưng không chắc còn có thể đặt tên gì khác nữa không . Giờ tôi chỉ có thể lấy từ các mẫu hđ đã gặp thôi.
 
Upvote 0
- Tôi cũng gặp hd đơn có dùng tên TongTien_thue nên phải thêm thủ công thôi bạn.
- Tôi thấy có qui định về việc về việc thiết kế thông tin theo thẻ nhưng không chắc còn có thể đặt tên gì khác nữa không . Giờ tôi chỉ có thể lấy từ các mẫu hđ đã gặp thôi.
Mình góp ý về file của bạn như sau:
1. Tra cứu hóa đơn của https://tracuuhddt78.hilo.com.vn/
- File tìm sai mã tra cứu: "Fkey" chứ không phải "Searchkey";
2. Đối với các hóa đơn BKAV thì:
Link tra cứu sẽ thay "https://van.ehoadon.vn/TCHD" bằng "https://van.ehoadon.vn/Lookup?InvoiceGUID=ID" ID sẽ thay bằng dãy ký tự của ID trong hóa đơn thay vào.
-------------------
Thân ái!

1731466834738.png
1731466190786.png1731466231188.png
 
Upvote 0
Em tải hóa đơn mua vào toàn bộ tháng 10/2024 (tầm 280 hóa đơn) thì kết quả bị sót 2 hóa đơn với 2 trường hợp cụ thể như sau ạ:
- Trường hợp 1: Cùng 1 nhà cung cấp có 3 tờ hóa đơn số 211, 212, 213 đều cùng ngày 31/10, khi em chọn tải từ 01/10-31/10 thì không lên được hóa đơn số 212, nhưng khi chọn tải chỉ ngày 31/10 thì lại lên đủ cả 3 tờ. Em đã thử tải cả tháng lại nhiều lần nhưng lần nào cũng bị sót hóa đơn 212 đó (Hóa đơn này thuộc loại có mã Cơ quan thuế, Đơn vị cung cấp hóa đơn điện tử: Softdreams)
- Trường hợp 2: Là 1 nhà cung cấp khác với hóa đơn ngày 31/10, em tra cứu chỉ chọn ngày 31/10 thì không lên được, nhưng thử chọn từ 31/10-12/11 thì lên được với "Tên HĐ" ở cột B là "Mẫu 01 TT78" không giống như các tên thông thường như ảnh đính kèm (Hóa đơn này thuộc loại có mã Cơ quan thuế, Đơn vị cung cấp hóa đơn điện tử: Viettel)
Không biết có bác nào gặp trường hợp giống em không ạ.
 

File đính kèm

  • 1731472064088.png
    1731472064088.png
    110.8 KB · Đọc: 11
Upvote 0
Em tải hóa đơn mua vào toàn bộ tháng 10/2024 (tầm 280 hóa đơn) thì kết quả bị sót 2 hóa đơn với 2 trường hợp cụ thể như sau ạ:
- Trường hợp 1: Cùng 1 nhà cung cấp có 3 tờ hóa đơn số 211, 212, 213 đều cùng ngày 31/10, khi em chọn tải từ 01/10-31/10 thì không lên được hóa đơn số 212, nhưng khi chọn tải chỉ ngày 31/10 thì lại lên đủ cả 3 tờ. Em đã thử tải cả tháng lại nhiều lần nhưng lần nào cũng bị sót hóa đơn 212 đó (Hóa đơn này thuộc loại có mã Cơ quan thuế, Đơn vị cung cấp hóa đơn điện tử: Softdreams)
- Trường hợp 2: Là 1 nhà cung cấp khác với hóa đơn ngày 31/10, em tra cứu chỉ chọn ngày 31/10 thì không lên được, nhưng thử chọn từ 31/10-12/11 thì lên được với "Tên HĐ" ở cột B là "Mẫu 01 TT78" không giống như các tên thông thường như ảnh đính kèm (Hóa đơn này thuộc loại có mã Cơ quan thuế, Đơn vị cung cấp hóa đơn điện tử: Viettel)
Để tôi kiểm tra lại xem.
 
Upvote 0
OPTIONS trong HTTP là lệnh gửi yêu cầu thiết đặt tùy chọn tại server trước khi gửi yêu cầu tiếp theo, để server hiểu là yêu cầu tiếp theo gửi đến các tùy chọn là khớp với OPTIONS đó để server nhận đúng yêu cầu và sẽ trả về kết quả theo OPTIONS đó.
Nếu anh viết mã HTTP đồng bộ thì quá trình gửi OPTIONS này sẽ thêm độ trễ.
Viết mã HTTP Bất đồng bộ là lập trình VBA nâng cao, để tiến đến viết mã ứng dụng chuyên nghiệp mà người học lập trình nên hướng đến. Hãy xem một ví dụ là Chrome tải hình ảnh của Intagram của một cá nhân, với hàng trăm ảnh cùng lúc. Thì không thể tải đồng bộ, nó sẽ tạo ra độ trễ lớn cho người xem.


Hãy hiểu về svg trước bạn nhé, svg nó có các ký tự định nghĩa cú pháp M L Q Z ... bạn chỉ cần xóa hết các chỉ số định vị vị trí chiều rộng cao đi. Giữ lại các ký tự cú pháp. Bây giờ việc bạn cần làm là nhấn nút tạo mới captcha để chép lại các dãy mã SVG từ 0-9 A-Z xóa như trên để sau này so sánh với SVG mới. Hãy nghĩ xem bạn sẽ thấy mỗi ký tự có chỉ số định vị vị trí theo chiều ngang, so sánh 1 trong các chỉ số này của mỗi ký tự bạn sẽ có được thứ tự vị trí 6 ký tự.
Mỗi tệp svg đều có 2 3 đường kẻ che phía trước, các định nghĩa cú pháp SVG của nó rất đơn giản, nên rất dễ phát hiện chúng để loại trừ ra.

Sử dụng biểu thức chính quy bạn sẽ làm được các điều trên.

Tôi cũng đang viết ứng dụng này, bước captcha tôi đã xử lý xong, giai đoạn tiếp theo là xử lý khối dữ liệu và tải dữ liệu. Viết ứng dụng về HDDT là không đơn giản tí nào.

Bạn có thể xem qua hình ảnh ứng dụng tôi viết. Và cũng sẽ sớm chia sẻ.

View attachment 304547

@quocphuoc88
Dữ liệu API và XML là giống hệt nhau, từ dữ liệu API viết mã tạo tệp XML, thay vì tải zip. Bạn có 10k hóa đơn, nếu bạn tải về máy tính của bạn thì chỉ tốn kém. có 2 cách để giải quyết vấn đề tải zip để tiết kiệm cho việc tải:
1. Tải zip sau khi bạn lọc danh sách ít hóa đơn.
2. Từ Dữ liệu API tạo ra xml/html.
Hy vọng sớm nhận được bộ chia sẻ này!
 
Upvote 0
@ongke0711 bác thử đọc cái này xem, từ trang 31 là quy định các trường dữ liệu của hóa đơn điện tử. Có sơ đồ kèm theo
hddt.png
 

File đính kèm

  • 1450_QD-TCT_490526.doc
    3.5 MB · Đọc: 17
Upvote 0
*** 13/11/2024: Dùng code của bạn Hesanbi để tự động nhập Captcha. Thêm code lấy link tra cứu của VNPT và BKAV.
Bài đã được tự động gộp:

... với "Tên HĐ" ở cột B là "Mẫu 01 TT78" không giống như các tên thông thường như ảnh đính kèm (Hóa đơn này thuộc loại có mã Cơ quan thuế, Đơn vị cung cấp hóa đơn điện tử: Viettel)
Cột này là tôi lấy "Tên loại hóa đơn" ("tlhdon") nên nó hiển thị đúng như qui ước như vậy.
 
Upvote 0
Web KT

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

Back
Top Bottom