Cách tạo tệp MHTML

Thư viện lập trình bảng tính Excel có khả năng xây dựng các ứng dụng đa nền tảng với khả năng tạo, sửa đổi, chuyển đổi, kết xuất và in các tệp MHTML. . NET Excel API không chỉ chuyển đổi giữa các định dạng bảng tính, nó còn có thể hiển thị các tệp Excel dưới dạng hình ảnh, PDF, HTML, ODS, v.v., do đó làm cho nó trở thành lựa chọn hoàn hảo để trao đổi tài liệu ở định dạng tiêu chuẩn công nghiệp
Thư viện lập trình bảng tính Excel có khả năng xây dựng các ứng dụng đa nền tảng với khả năng tạo, sửa đổi, chuyển đổi, kết xuất và in các tệp MHTML. Java Excel API không chỉ chuyển đổi giữa các định dạng bảng tính, nó còn có thể hiển thị các tệp Excel dưới dạng hình ảnh, PDF, HTML, ODS, v.v., do đó làm cho nó trở thành lựa chọn hoàn hảo để trao đổi tài liệu ở định dạng tiêu chuẩn công nghiệp

Khả năng lưu trang Web thành định dạng MHT rất thú vị. Trước hết, bạn có thể làm tương tự trong Outlook. Nếu bạn có một email mà bạn muốn lưu, bạn có thể thực hiện Lưu dưới dạng và có thể chọn đầu ra là tệp MHT. Vì vậy, về cơ bản, bạn có tất cả vào một tệp. Điều tương tự cũng xảy ra với một trang Web. Nếu bạn lưu thường xuyên trong trình duyệt của mình, bạn sẽ nhận được rất nhiều tệp trong thư mục mới tạo có chứa hình ảnh và các tệp khác có thể cần thiết để hiển thị trang HTML. Vì vậy, lưu trang thành định dạng MHT sẽ cung cấp cho bạn mọi thứ vào một tệp

Một kịch bản đơn giản

Tôi thường nhận được yêu cầu xây dựng các ứng dụng rô bốt sẽ thực hiện nhiều quy trình trong nền. Trong một số trong số chúng, đôi khi cần truy xuất các trang HTML cụ thể từ một trang Web cụ thể. Sau đó, chúng tôi có thể lưu các trang đó vào các tệp MHT và lưu trữ chúng vào các thư mục cụ thể sẽ phục vụ cho các mục đích cụ thể trong các ứng dụng liên quan

Cách tiếp cận tốt nhất mà tôi đã tìm thấy cho đến nay để làm điều này là sử dụng CDO. lớp tin nhắn. Theo kịch bản đơn giản nhất, chúng ta sẽ sử dụng phương thức CreateMHTMLBody() để truy xuất trang, nhận tham chiếu đến đối tượng phát trực tuyến của nó và lưu trang đó vào một tệp

Truy xuất trang

Trong bài viết này, tôi sẽ sử dụng một lớp MHTML nơi tôi sẽ cần nhập hai không gian tên, như sau

Imports CDO
Imports ADODB
Sau đó, chúng ta có thể định nghĩa lớp của mình, khởi tạo CDO. Đối tượng tin nhắn và xác định một thuộc tính cho URL của chúng tôi và một thuộc tính khác cho vị trí lưu của chúng tôi.
    Public Class MHTML

        Public cMHTMLUrl As String = ""
        Public cSaveFile As String = ""

        ' CDO message object
        Private oMessage As CDO.Message = New CDO.Message

    End Class
Để truy xuất một trang, tôi đã tạo một phương thức gọi là GetMHTML() mà chúng ta có thể định nghĩa như thế này.
        ' Get the MHTML file
        Public Function GetMHTML() As Boolean
            Dim loStream As ADODB.Stream

            ' Go get the page
            oMessage.CreateMHTMLBody(cMHTMLUrl, CDO.CdoMHTMLFlags.cdoSuppressNone, "", "")

            loStream = oMessage.GetStream()

            ' Save to file
            loStream.SaveToFile(cSaveFile, SaveOptionsEnum.adSaveCreateOverWrite)

            Return True
        End Function
Sau đó, chúng ta có thể sử dụng một cái gì đó như thế này để sử dụng lớp này để truy xuất trang HTML.
        Dim loMHTML As MHTML = New MHTML()

        loMHTML.cMHTMLUrl = "http://www.universalthread.com"

        ' Save the file into a directory
        loMHTML.cSaveFile = "d:\test.mht"

        ' Call the GetMHTML() method to retrieve the HTML page and save it into cSaveFile
        If Not loMHTML.GetMHTML() Then
            MessageBox.Show("Unable to get the page")
        End If
Lưu ý rằng trong trường hợp này, tôi chỉ đơn giản xác định thuộc tính cHTMLUrl để truy cập miền. Theo mặc định, mọi trang Web đều là trang mặc định của nó. Trong trường hợp Chủ đề chung, trang mặc định là Mặc định. aspx. Vì vậy, chúng tôi có thể đã xác định thuộc tính cHTMLUrl như thế này để cung cấp bản trình bày tốt hơn về trang mà chúng tôi đang truy xuất.
        loMHTML.cMHTMLUrl = "http://www.universalthread.com/Default.aspx"

Truy xuất một trang yêu cầu cookie

Đối với một số trang, cookie có thể được yêu cầu để truy cập trang. Trong một tình huống phổ biến, tên người dùng và mật khẩu có thể được yêu cầu để truy cập một trang cụ thể. Tuy nhiên, trong trường hợp này, tất cả điều này được thực hiện từ một ứng dụng rô-bốt. Vì vậy, không có ai ngồi sau bàn phím để truy cập trang đăng nhập để nhập tên người dùng và mật khẩu

Vì vậy, chúng ta cần tìm một cơ chế để hỗ trợ điều đó. Về cơ bản, chúng ta cần biết tên cookie mà trang web đang sử dụng. Sau đó, chúng tôi cần gọi trang đăng nhập trước khi gọi trang của chúng tôi mà chúng tôi muốn truy xuất. Cuối cùng, sau khi đăng nhập xong, chúng tôi có thể liên kết cookie với CDO của mình. Đối tượng tin nhắn và đảm bảo rằng chúng tôi vượt qua nó khi chúng tôi truy xuất trang của mình

Điều đầu tiên cần làm là thêm hai thuộc tính nữa ở cấp độ lớp. Một thuộc tính sẽ cho biết trang HTML sẽ sử dụng để đăng nhập của chúng tôi và một thuộc tính khác để cho biết tên cookie mà chúng tôi cần làm việc là gì

        Public cCookie As String = ""
        Public cLoginUrl As String = ""

Sau đó, chúng ta cần có cách để thêm vào bộ sưu tập các biến HTML được yêu cầu để xác thực. Đây thường là tên người dùng và mật khẩu. Vì vậy, chúng ta cần xác định một thuộc tính mới làm cấp độ lớp cho bộ sưu tập của mình và tạo một phương thức sẽ thêm vào bộ sưu tập các biến HTML cần thiết để xác thực

        ' Collection to hold the form fields to be used when there is a login page
        Private oFormField As Collection = New Collection

        ' Add a form field for the post that can be used to do the login
        ' expC1 Name
        ' expC2 Value
        Public Function AddFormField(ByVal tcName As String, ByVal tcValue As String) As Boolean
            Dim loFormField(2) As Object

            loFormField(1) = tcName
            loFormField(2) = tcValue

            oFormField.Add(loFormField)
        End Function
Sau đó, từ ứng dụng của chúng ta, chúng ta có thể thêm các biến tên người dùng và mật khẩu như sau.
        loMHTML.AddFormField("Username", "MyUsername")
        loMHTML.AddFormField("Password", "MyPassword")
Phần khó nhất trong tất cả những điều này là xây dựng phương thức Login() của chúng ta. Thành thật mà nói, tôi thấy rằng một cái khó xây dựng vì thực tế không có thông tin nào trên Internet về điều đó. Suy nghĩ duy nhất chúng tôi tìm thấy về CDO này. Lớp tin nhắn là về việc xây dựng email chứ không phải về truy xuất trang HTML đặc biệt yêu cầu cookie

Tuy nhiên, sau rất nhiều R & D, tôi đã xây dựng phương thức Login() như sau

        ' Do the login
        Public Function Login() As Boolean
            Dim lcCookie As String = ""
            Dim lcPostData As String = ""
            Dim llSuccess As Boolean = False
            Dim lnCounter As Integer = 0
            Dim loASCIIEncoding As System.Text.Encoding = New System.Text.ASCIIEncoding
            Dim loByte() As Byte
            Dim loCookieCollection As System.Net.CookieCollection
            Dim loCookieContainer As System.Net.CookieContainer = New System.Net.CookieContainer
            Dim loFormField(2) As Object
            Dim loStreamWebRequest As IO.Stream
            Dim loWebRequest As System.Net.HttpWebRequest
            Dim loWebResponse As System.Net.HttpWebResponse

            ' Get the post data
            For Each loFormField In oFormField
                If lcPostData.Length > 0 Then
                    lcPostData = lcPostData + "&"
                End If
                lcPostData = lcPostData + loFormField(1) + "=" + loFormField(2)
            Next

            loByte = loASCIIEncoding.GetBytes(lcPostData)

            ' Prepare Web request
            loWebRequest = System.Net.WebRequest.Create(cLoginUrl)
            loWebRequest.Method = "POST"
            loWebRequest.ContentType = "application/x-www-form-urlencoded"
            loWebRequest.ContentLength = lcPostData.Length

            ' Send the data
            loStreamWebRequest = loWebRequest.GetRequestStream()
            loStreamWebRequest.Write(loByte, 0, loByte.Length)
            loStreamWebRequest.Close()

            loWebRequest.CookieContainer = New System.Net.CookieContainer()

            ' Get the cookie
            loWebResponse = loWebRequest.GetResponse()
            loCookieCollection = loWebRequest.CookieContainer.GetCookies(loWebRequest.RequestUri)

            For lnCounter = 0 To loCookieCollection.Count - 1
                lcCookie = loCookieCollection.Item(lnCounter).Name

                If lcCookie = cCookie Then
                    lcCookie = loCookieCollection.Item(lnCounter).Value

                    ' Define the cookie
                    oMessage.Configuration.Fields.Item(CDO.CdoConfiguration.cdoHTTPCookies).Value = _
                     cCookie + "=" + lcCookie

                    oMessage.Configuration.Fields.Update()
                    Exit For
                End If

            Next

            Return True
        End Function
Về cơ bản, những gì phương pháp này làm là gọi trang đăng nhập để thực hiện đăng nhập của chúng tôi. Nó sử dụng bộ sưu tập mà chúng tôi đã tạo để chuyển các biến HTML đó. Điều này được thực hiện thông qua phương thức POST. Vì trang đăng nhập này sẽ thiết lập cookie, chúng tôi cần khởi tạo vùng chứa cookie để có thể nhận lại cookie. Vì trang này có thể thiết lập các cookie bổ sung, chúng tôi đảm bảo chỉ lưu trữ vào CDO. Đối tượng tin nhắn cookie được yêu cầu mà sau đó chúng tôi sẽ sử dụng để truy xuất trang HTML của mình

Vì vậy, khi cần đăng nhập để truy cập một trang cụ thể, trước tiên chúng tôi gọi trang đăng nhập và sau đó là trang HTML mà chúng tôi muốn truy xuất nội dung của nó

        Dim loMHTML As MHTML = New MHTML()

        loMHTML.AddFormField("Username", "MyUsername")
        loMHTML.AddFormField("Password", "MyPassword")
        loMHTML.cLoginUrl = "http://www.mywebsite.com/Login.aspx"
        loMHTML.cCookie = "TheCookieContainingWhatIsNeededToAccessThePage"

        If Not loMHTML.Login() Then
            MessageBox.Show("Unable to log in")
            Exit Sub
        End If

        ' The URL to be returned as MHTML
        loMHTML.cMHTMLUrl = "http://www.mywebsite.com/Account.aspx"

        ' Save the file into a directory
        loMHTML.cSaveFile = "d:\test.mht"

        ' Save to file
        If Not loMHTML.GetMHTML() Then
            MessageBox.Show("Unable to get the page")
            Exit Sub
        End If

Thông tin thêm về việc nâng cao lớp học này

Lớp này có thể dễ dàng được tăng cường để hỗ trợ xác thực cơ bản. Vì vậy, đối với các trang HTML yêu cầu xác thực cơ bản, chúng ta có thể dễ dàng điều chỉnh lớp của mình để hỗ trợ nhu cầu đó

Trước tiên, chúng tôi tạo hai thuộc tính bổ sung sẽ được sử dụng để lưu trữ tên người dùng và mật khẩu sẽ được sử dụng. Chúng tôi định nghĩa chúng như sau

    Public Class MHTML

        Public cMHTMLUrl As String = ""
        Public cSaveFile As String = ""

        ' CDO message object
        Private oMessage As CDO.Message = New CDO.Message

    End Class
0Sau đó, chúng ta có thể điều chỉnh phương thức GetMHTML() như sau.
    Public Class MHTML

        Public cMHTMLUrl As String = ""
        Public cSaveFile As String = ""

        ' CDO message object
        Private oMessage As CDO.Message = New CDO.Message

    End Class
1Về cơ bản, cách tiếp cận cookie này dễ xử lý hơn nhiều

Phần kết luận

Như bạn có thể thấy, điều này khá đơn giản. Như tôi đã nói, cách tiếp cận cookie là phần phức tạp nhất trong tất cả những điều này. Nhưng, một khi nó được thực hiện, bạn sẽ không phải lo lắng về nó vì nó được gói gọn trong lớp. Tuy nhiên, tôi vẫn ngạc nhiên khi thấy rằng không có quá nhiều nhà phát triển đã sử dụng CDO. Lớp thông báo như thế này, để truy xuất trang HTML yêu cầu cookie

Tệp MHTML là gì?

MHTML, viết tắt của "sự đóng gói MIME của các tài liệu HTML tổng hợp", là một định dạng tệp lưu trữ Web được sử dụng để kết hợp, trong một tệp máy tính, mã HTML và các tài nguyên đi kèm của nó (chẳng hạn như hình ảnh, hoạt ảnh Flash, ứng dụng Java và âm thanh

Ứng dụng nào tốt nhất cho tệp MHTML?

Trình xem ô trong Excel . Đây là một ứng dụng miễn phí có thể xem các tệp Excel trực tuyến từ Windows, Mac OS, Linux, Android, iOS và mọi nơi.

MHTML có giống như HTML không?

MHTML là tên viết tắt của MIME HTML , là định dạng tệp lưu trữ kết hợp các trang web và tất cả tài nguyên của chúng. Theo mặc định, hầu hết các trình duyệt web đều lưu các trang web dưới dạng nhiều tệp, thường là tệp ngôn ngữ đánh dấu siêu văn bản (HTML) và các thư mục tài nguyên liên quan, có thể bao gồm hình ảnh, nhạc hoặc dữ liệu khác.

Sự khác biệt giữa MHT và MHTML là gì?

MHTML là một khởi tạo của "sự đóng gói MIME của các tài liệu HTML tổng hợp. " Nhưng MHT là viết tắt của một số thuật ngữ khác không liên quan gì đến tài liệu HTML, bao gồm cây băm Merkle và công nghệ trung bình và cao