VB做論壇自動發貼軟體

asword發表於2007-03-06

兩種方式:

1.用AxWebBrowser控制元件做論壇自動發貼軟體

2.用HttpWebRequest類做論壇快速發帖器

[@more@]

1。用AxWebBrowser控制元件做論壇自動發貼軟體

 
   AxWebBrowser控制元件即VB6中的WebBrowser控制元件。
   用AxWebBrowser做論壇批次發貼軟體,使用時先新增對AxWebBrowser控制元件和MSHTML的引用。
   先Navigate到指定網址。然後用以下程式碼等待網頁載入完畢:

Do While brow.Busy
  Application.DoEvents()
Loop

  然後呼叫發帖過程。


Public Sub fill()
  On Error Resume Next
  Do While brow.Busy
    Application.DoEvents()
  Loop

  Dim webDoc As Object = brow.Document.all
  Dim webTag As Object
  Dim lengthTag As Integer = webDoc.length - 1

  For countTag As Integer= 0 To lengthTag
    webTag = webDoc.item(countTag)
    Select Case Strings.LCase(webDoc.item(countTag).tagname)
      Case "textarea"     '網頁中的文字框
        Select Case webTag.name
          Case "body"   '"body"來自網頁原始碼,不同網站很可能不同,你根據實際修改。下同。
            webTag.value = strBody   '這是預先定義的值,下同。
         End Select

      Case "select"       '網頁中的下拉選擇框
        Select Case webTag.name
          Case "month"   '選擇月份,這裡略去年、日的選擇,因為原理相同。
            webTag.all.item(1).selected = True  '選擇第一個值
         End Select

       Case "input"  '網頁中的輸入框
        Select Case Strings.LCase(webTag.type)
          Case "text"     '文字
            Select Case webTag.name
              Case "name", "userid", "nickname" '使用者名稱
                webTag.value = strName
              Case "subject" '標題
                webTag.value = strSubject
              Case "regid" '註冊碼
                webTag.value = strRegid
              Case "username", "realname"
                webTag.value = strUsername
              Case "cardnumber"
                webTag.value = strCardNumber
              Case "homephone"
                webTag.value = strHomephone '電話號
              Case "url_title" '連結名稱
                webTag.value = urlTitle
              Case "url"  '連結
                webTag.value = url
              Case "email" 'email地址
                webTag.value = email
              Case "img"  '圖片  
                webTag.value = img
              Case "midi"  '音樂
                webTag.value = midi
              Case "year"  '年
                webTag.value = strYear
              Case "prompt" '找回密碼提示問題
                webTag.value = strPrompt
              Case "answer" '找回密碼答案
                webTag.value = strAnswer
            End Select
          Case "password"  '密碼
            Select Case webTag.name
              Case "passwd", "password", "confirm", "repasswd" '密碼,確認密碼
                webTag.value = strPass
            End Select
          Case "checkbox"  '單選框
            Select Case webTag.name
              Case "emailme"  'email通知tuenhai
                webTag.checked = True  
            End Select

        End Select

     End Select
   Next

  brow.Document.forms(0).submit()  '許多網頁表單,這一句簡單程式碼即實現自動提交

End Sub


於是,主過程是這樣:

Public Sub autoAdd()
  brow.Silent = True '不彈出視窗
  brow.Navigate(") ' tuenhai的小站為例
  Do While formBrowNetsh.brow.Busy  '等待網頁載入完畢
    Application.DoEvents()
  Loop
  Call fill()
End Sub

  以上程式碼可實現視覺化自動註冊和論壇自動發帖工具。
   還有幾個問題有待解決:
   一. 有的網站要填上識別碼數字才能註冊或發言,如何用程式來實現自動識別識別碼圖片上的數字?
   二. 有的網站一進去就會跳出一個歡迎對話方塊,程式的執行就被暫停。
   三. 對於自動註冊和發言來說,載入較慢的圖片、Flash、音樂等並不是必需的。

  

2。用HttpWebRequest類做論壇快速發帖器

  用HttpWebRequest類做論壇發貼機就簡單多了。
  我們始終不能忘記,最好的教程是MSDN,在Microsoft Visual Studio .NET 2003“搜尋”中敲入HttpWebRequest,抄來一些東東(事實上許多教程書籍都是從MSDN上抄的):
   名稱空間: System.Net
   HttpWebRequest 類對 WebRequest 中定義的屬性和方法提供支援,也對使使用者能夠直接與使用 HTTP 的伺服器互動的附加屬性和方法提供支援。
   不要使用 HttpWebRequest 建構函式。使用 WebRequest.Create 方法初始化 HttpWebRequest 的一個新例項。如果 URI 的方案是 http:// 或 https:// ,則 Create 將返回 HttpWebRequest 例項。
   GetResponse 方法向 RequestUri 屬性中指定的 Internet 資源發出同步請求並返回包含該響應的 HttpWebResponse 例項。可以使用 BeginGetResponse 和 EndGetResponse 方法對 Internet 資源發出非同步請求。
   當要向 Internet 資源傳送資料時, GetRequestStream 方法返回用於傳送資料的 Stream 例項。  BeginGetRequestStream 和 EndGetRequestStream 方法提供對傳送資料流的非同步訪問。  
   如果在訪問 Internet 資源時發生錯誤,則 HttpWebRequest 類將引發 WebException 。 WebException.Status 屬性是 WebExceptionStatus 值之一,它指示錯誤源。當 WebException.Status 為 WebExceptionStatus.ProtocolError 時, Response 屬性包含從 Internet 資源接收的 HttpWebResponse 。
  

Shared Sub postData()
  Dim httpUrl As New System.Uri(" & "name=yourName&pass=yourPass&cardnumber=yourCardNumber")
  Dim req As HttpWebRequest
  'req.Timeout = 10000 '設定超時值10秒
  req = CType(WebRequest.Create(httpUrl2), HttpWebRequest)
  req.Method = "POST"
  req.ContentType = "application/x-www-form-urlencoded"
  Dim bytesData() As Byte =   System.Text.Encoding.ASCII.GetBytes(""name=yourName&pass=yourPass&cardnumber=yourCardNumber")
  req.ContentLength = bytesData.Length
  Dim postStream As Stream = req.GetRequestStream()
  postStream.Write(bytesData, 0, bytesData.Length)   '以上向伺服器post資訊。
  Dim res As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse) '以下獲取伺服器返回資訊
  Dim reader As StreamReader = _
  New StreamReader(res.GetResponseStream, System.Text.Encoding.GetEncoding("GB2312"))
  Dim respHTML As String = reader.ReadToEnd()
    MsgBox(respHTML)  '這就是向網路伺服器post後返回的資訊
    MsgBox(res.StatusCode.ToString)  '向網路伺服器post後返回的狀態碼
  res.Close() '關閉

End Sub


  用AxWebBrowser控制元件做論壇發貼機留有三個問題,用HttpWebRequest類來實現,後二個問題都不復存在。而且,用HttpWebRequest類來實現論壇發帖器的速度要快得多。但是,同樣的?
  有的網站要填上識別碼數字才能註冊或發言,如何用“論壇自動發貼機”來實現自動識別識別碼圖片上的數字?

  我們在主過程里加上執行緒,因為我們以後要用多執行緒做自動發帖機啊。用多執行緒做論壇自動發貼器在VB6中不好實現,在VB.NET中做自動發帖工具卻不難。
 

Dim threadAdd As System.Threading.Thread '定義執行緒 
Public Sub threadAutoAdd()
  threadAdd= New System.Threading.Thread(AddressOf postData)  '建立執行緒例項
  threadNetsh.Start()  '開始執行緒
  '別忘了在Sub postData()的最後加上threadAutoAdd.Abort()來關閉執行緒
  '或者在這裡加上判斷Sub postData()完畢的程式碼,如果完畢就關閉執行緒
End Sub
3。獲取 IE 當前 URL 的程式碼,網上有許多類似程式碼,但在WINDOWSXP 下不能執行。查了一些資料,發現由於Win2000,WINXP 是基於Unicode程式碼的作業系統,所以沒有WorkerA類,而以WorkerW類取而代之(XXXXA should be used on not unicode compliant windows oses likes Windows 95,98 etc and on unicode enabled oses replace A with W. Remember WorkerA or WorkerW doesn't have something related to IE version. To obtain all of the opened IEs URL use EnumWindows callback function and cheers. )。


Option Explicit


Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 'Findwindow函式的功能是找到當前執行的IE視窗的url地址的控制程式碼


Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long 'FindwindowEx函式的功能是找到子窗體的控制程式碼


Private Declare Function SendMessageByString Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long


Private Const WM_GETTEXT = &HD


Private Sub Command1_Click()

getcurrenturl

End Sub

Sub getcurrenturl(Optional ByRef URL As String)

Dim hwnd As Long '設定一個長整形變數用來接收函式返回值

hwnd = 0 '初始化

hwnd = FindWindowEx(hwnd, 0, "IEFrame", vbNullString) 'IE視窗控制程式碼

hwnd = FindWindowEx(hwnd, 0, "Workerw", vbNullString) 'IE視窗的工作區控制程式碼

hwnd = FindWindowEx(hwnd, 0, "ReBarWindow32", vbNullString) 'IE視窗的選單欄控制程式碼

hwnd = FindWindowEx(hwnd, 0, "ComboBoxEx32", vbNullString) 'IE視窗下拉選單控制程式碼

hwnd = FindWindowEx(hwnd, 0, "ComboBox", vbNullString) 'IE視窗下拉選單當前項控制程式碼

hwnd = FindWindowEx(hwnd, 0, "Edit", vbNullString) ''IE視窗下拉選單編輯框控制程式碼

URL = String(1024, Chr(0)) '初始化字串

SendMessageByString hwnd, WM_GETTEXT, 1025, URL '向系統傳送獲得IE窗體位址列中的字串命令

URL = Split(URL, Chr(0))(0) '根據 URL 長度得到 URL 值

MsgBox URL '顯示IE當前網址

End Sub

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/82387/viewspace-902982/,如需轉載,請註明出處,否則將追究法律責任。

相關文章