首页
社区
课程
招聘
[旧帖] [推荐]如何使 Internet Explorer 自动对 POST 窗体数据 0.00雪花
发表于: 2008-11-29 10:35 3714

[旧帖] [推荐]如何使 Internet Explorer 自动对 POST 窗体数据 0.00雪花

2008-11-29 10:35
3714
几种方法可以将数据发送到 HTTP 服务器。 GET 和 POST 是当前最常见。 POST 通常用于将表单数据的数据超过最大允许的传输使用 GET 方法时,提交到 HTTP 服务器。 此限制通常是 2K。

IE 公开给自动化控制器 IWebBrowser(App) 接口。 IWebBrowser(App) 接口公开一种导航方法。 接口定义语言 (IDL) 语法中的 (一个通用表示形式 Visual Basic 和 Visual C++ 语法而派生的同时),导航方法查找按如下所示:
HRESULT Navigate([in] BSTR URL, [in] VARIANT* Flags,
                [in] VARIANT* TargetFrameName, [in] VARIANT* PostData,
                [in] VARIANT* Headers);

有关的执行 POST 目的,只 URL、 PostData 和标头参数是否相关。 请参阅 Internet Client SDK 文档信息对其他参数。

若要 to call Navigate and POST form data to HTTP server,URL parameter must specify valid address,PostData parameter must contain SAFEARRAY of bytes,and Headers parameter must contain that contains following HTTP header BSTR:
内容类型: 应用程序 / x www-窗体-urlencoded
此标头指示发布数据被编码 HTML 规范中指定该规则。

Internet Explorer 版本 3.0、 3.01 和 3.02 不支持 HTTP 发布数据服务器通过导航方法。 WinInet 和 URL Monikers 是两个可能的备选方案。 在 WinInet 和 Monikers 详细信息,请参阅参考一节。

请注意,Internet Explorer Script 对象模型对象"窗口"有一个"导航"方法以及。 此导航方法将只接受一个 URL,不能使用 POST 数据到一个 Web 服务器。

若要 to test below examples,following Active Server Page (ASP) should be saved to file NAVPOST.ASP in directory on NT 4.0 server running Internet Information Server (IIS) version 3.0。 directory should be recognized by IIS as with virtual root execute permission:
   <HTML>
   <%
   cFlavor = Request("Flavor")
   cName = Request("FName")
   %>
   <BODY>
   Hello, <% =cName %>. <br>
   One scoop of <% =cFlavor %> coming right up!
   </BODY>
   </HTML>

回到顶端
Visual Basic
为了演示在 Visual Basic 中为 POST,执行以下步骤:

Visual Basic 中启动一个新的标准 EXE 项目。 默认情况下会创建 Form 1。 将下面的控件添加到 Form 1:
   Object                     Name                  Caption
   -------------------------------------------------------------------

   Label                      lblName                First Name
   Label                      lblFlavor              Flavor
   CommandButton              cmdSubmit              Submit

   ComboBox                   cboFlavor
   TextBox                    txtName
   TextBox                    edtPostData

(edtPostData 应是多行并且已滚动条)
从项目菜单调用"参考"并为"Microsoft Internet Controls"(SHDOCVW.DLL) 添加对该项目的引用。 请确保这完成从引用对话框,而不仅仅是从了组件的对话框。
将下面的代码插入的通用声明一节:
      Dim g_oIE As InternetExplorer ' Global reference to an
                                    ' instance of IE
      Private Sub cmdSubmit_Click()
      edtPostData.Text = ""  ' Initialize an edit box for testing
      ReDim aByte(0) As Byte ' Array of bytes to hold data to post

      ' Extract the URL encoded data from the UI,
      ' and pack it into an array of bytes
      cFlavor = cboFlavor.List(cboFlavor.ListIndex)
      cParamName = "FName="
      cParamFlavor = "Flavor="
      cSeparator = "&"
      cPostData = cParamName & txtName.Text _
         & cSeparator & cParamFlavor & cFlavor
      PackBytes aByte(), cPostData

      ' For testing, rebuild the POST data and stuff
      ' it into an edit box
      For i = LBound(aByte) To UBound(aByte)
          edtPostData = edtPostData + Chr(aByte(i))
      Next

      Dim vPost As Variant
      vPost = aByte ' Assign the byte array to a VARIANT
      Dim vFlags As Variant
      Dim vTarget As Variant
      Dim vHeaders As Variant
      vHeaders = _
         "Content-Type: application/x-www-form-urlencoded" _
         + Chr(10) + Chr(13)

      ' You're done. Now call Navigate
      ' Note: modify path to server as appropriate
      g_oIE.Navigate "947K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8W2)9J5y4X3I4@1i4K6y4n7M7$3g2J5N6X3g2J5i4K6t1$3k6%4c8Q4x3@1u0Q4x3V1k6K6j5%4u0A6M7s2c8K6i4K6u0r3L8X3q4$3M7r3!0K6N6q4)9J5k6h3q4K6M7l9`.`.", _
         vFlags, vTarget, vPost, vHeaders

      End Sub

      Private Sub Form_Load()
      ' Create an instance of IE
      Set g_oIE = New InternetExplorer
      g_oIE.Visible = True

      ' Populate a combobox with some flavor choices
      cboFlavor.List(0) = "Vanilla"
      cboFlavor.List(1) = "Chocolate"
      cboFlavor.List(2) = "Strawberry"
      cboFlavor.ListIndex = 0 ' The default choice
      End Sub

      ' Utility function to pack the data to post into an array of bytes
      Private Sub PackBytes(ByteArray() As Byte, ByVal PostData As String)
      iNewBytes = Len(PostData) - 1   ' Get rid of the null termination
      If iNewBytes < 0 Then
       Exit Sub
      End If
      ReDim ByteArray(iNewBytes)
      For i = 0 To iNewBytes
       ch = Mid(PostData, i + 1, 1)
       If ch = Space(1) Then
          ch = "+"
       End If
       ByteArray(i) = Asc(ch)
      Next
    End Sub

modify to Navigate call as appropriate in URL,close all running instance of IE,and choose Start from Run menu。
在第一个名称文本框中输入您的姓名,选择一个 flavor,然后单击提交命令按钮。 从 Visual Basic 窗体中数据将被张贴到 HTTP 服务器并在可见浏览器窗口中显示该响应。
回到顶端
Visual C++
为了演示在 Visual C++ 中的 POST,执行以下步骤:

ensure that is installed ActiveX or Internet Client SDK。
启动 Visual C++,并创建一个新的 Win 32 控制台项目。
创建新的文本文档,并添加以下代码:
      #include <windows.h>
      #define INITGUID
      #include <initguid.h>
      #include <exdisp.h>
      #include <memory.h>

      HRESULT GetPostData(LPVARIANT pvPostData);

      void main()
      {
         HRESULT hr;
         IWebBrowserApp* pWBApp = NULL; // Derived from IWebBrowser
         BSTR bstrURL = NULL, bstrHeaders = NULL;
         VARIANT vFlags = {0},
            vTargetFrameName = {0},
            vPostData = {0},
            vHeaders = {0};

         if (FAILED(hr = CoInitialize(NULL)))
         {
            return;
         }

         if (FAILED(hr = CoCreateInstance(CLSID_InternetExplorer,
            NULL,
            CLSCTX_SERVER,
            IID_IWebBrowserApp,
            (LPVOID*)&pWBApp)))
         {
            goto Error;
         }

         bstrURL = SysAllocString(L"4d9K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8W2)9J5y4X3I4@1i4K6y4n7M7$3g2J5N6X3g2J5i4K6t1$3k6%4c8Q4x3@1u0Q4x3V1k6K6j5%4u0A6M7s2c8K6i4K6u0r3L8X3q4$3M7r3!0K6N6q4)9J5k6h3q4K6M7l9`.`.");
         if (!bstrURL)
         {
            goto Error;
         }

         bstrHeaders = SysAllocString(
            L"Content-Type: application/x-www-form-urlencoded\r\n");
         if (!bstrHeaders)
         {
            goto Error;
         }

         V_VT(&vHeaders) = VT_BSTR;
         V_BSTR(&vHeaders) = bstrHeaders;

         hr = GetPostData(&vPostData);
         hr = pWBApp->Navigate(bstrURL, &vFlags,
                  &vTargetFrameName, &vPostData, &vHeaders);
         pWBApp->put_Visible(VARIANT_TRUE);

      Error:
         if (bstrURL) SysFreeString(bstrURL);
         if (bstrHeaders) SysFreeString(bstrHeaders);
         VariantClear(&vPostData);
         if (pWBApp) pWBApp->Release();
         CoUninitialize();
      }

      // Pack some data into a SAFEARRAY of BYTEs. Return in a VARIANT
      HRESULT GetPostData(LPVARIANT pvPostData)
      {
         HRESULT hr;
         LPSAFEARRAY psa;
         LPCTSTR cszPostData = "FName=Matt&Flavor=Mocha+Chip";
         UINT cElems = lstrlen(cszPostData);
         LPSTR pPostData;

         if (!pvPostData)
         {
            return E_POINTER;
         }

         VariantInit(pvPostData);

         psa = SafeArrayCreateVector(VT_UI1, 0, cElems);
         if (!psa)
         {
            return E_OUTOFMEMORY;
         }

         hr = SafeArrayAccessData(psa, (LPVOID*)&pPostData);
         memcpy(pPostData, cszPostData, cElems);
         hr = SafeArrayUnaccessData(psa);

         V_VT(pvPostData) = VT_ARRAY | VT_UI1;

         V_ARRAY(pvPostData) = psa;
         return NOERROR;
      }

修改根据,URL 引用并保存该代码。 将其添加到项目,然后生成。
关闭所有浏览器实例并运行该应用程序。
switch to running instance of IE to see that was posted data。
e95K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4#2M7s2m8G2M7Y4c8Q4x3X3g2E0K9h3y4J5L8%4y4G2k6Y4c8Q4x3X3g2U0L8$3#2Q4x3V1k6C8j5W2)9J5c8Y4p5I4y4U0M7$3y4e0S2Q4x3V1j5`.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回