日志文章

2005-05-24

用VB.NET做个论坛发帖软件

用VB.NET做个论坛发帖软件

作者:Tuenhai.com MSN: king#tuenhai.com

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 ]ffJ,m3  
http://www.Tuenhai.com/

  题记如果你经常泡各种论坛发表宏论,如果您想把您的软件在极短时间内提交到有关网站,如果您想把您的网站快速登陆各搜索引擎,如果您想做个论坛自动发贴软件,本篇文章可能对您有所帮助。 wG_L/B  
SG:HSU  
   开发工具:Microsoft Visual Studio .NET 2003 ]Z#\)qH  
   操作系统:Windows XP KEg0q}HR;  
alew=Q  
                  不编程实现自动发帖                  

  不编程也能实现论坛自动发贴? 2&)Rmo/  
  答案肯定的。2003年10月前,tuenhai还未学习编程(VB6),但tuenhai已经实现论坛自动发帖器。虽然现在tuenhai已不用这种方法,但可能对有些朋友有用,还是在此介绍一下实现方法。 y6*?4+  
  实现原理是:借用模拟键盘、鼠标操作的软件,抓取输入框座标,然后模拟移动鼠标到指定座标,模拟键盘输入字符,模拟回车或点击相应位置完成自动发贴。当然,你得编写相应自动化脚本,虽有一点难度,但对于编程来说,应该是简单的。 ")@J<^4?^  
  有三个模拟键盘、鼠标类软件,功能比较好,在《VS.NET学习方法论》http://www.Tuenhai.com/已经有所介绍。 \@ByG0G  
  一. PCWorker(http://www.pcworker.net) fC.ub J  
   PCWorker功能极多,更重要的是,PCWorker中的脚本代码都是看得懂的代码:

Press VK_F1 // 模?M按 F1 ?I
Press VK_CTRL+VK_F // 模?M按 Ctrl + F ?I

  是不是不太难? E75]*',A  
}gO/?hN-  
  二. “按键精灵”(http://www.vrbrothers.com/cn/qmacro) ]:-s(ahK  
  相对来说,按键精灵容易使用,但只有PCWorker的少部分功能。比如PCWorker可输出随机数,按键精灵就不行。 >Xn2($Ik  
  按键精灵的脚本代码不太容易看懂,比如 3)YG#,2  
  KeyPress 82 1 earr54d@  
   您看得出按的是哪个键吗? $;'7>^  
LV.-|=cM  
  三. EzScript(http://ezscript.seed.cx/) 7!#e/Iu  
  EzScript的功能也很多。但tuenhai在Windows XP下试用自动发贴时,没有反应。 E\"/WC  
K;_9J^C  
   初学者建议使用按键精灵,进阶则用PCWorker。使用教程请参考作者网站。 KmbEh>n  
z_ +cG*y  
S6zqSC7L  
                   用AxWebBrowser控件做论坛自动发贴软件 ]1 nMV t h  
F<\ aYZn  
  M}tE&$B2  
   AxWebBrowser控件即VB6中的WebBrowser控件。 7[U5:WOPN  
   用AxWebBrowser做论坛批量发贴软件,使用时先添加对AxWebBrowser控件和MSHTML的引用。 R-PM2tq  
   先Navigate到指定网址。然后用以下代码等待网页加载完毕:

Do While brow.Busy ec$VH lo  
  Application.DoEvents() 'jW/D ]0  
Loop

  然后调用发帖过程。 G chYo*D  

Public Sub fill() 9.SZj/iTq8  
  On Error Resume Next /|inJ"7  
  Do While brow.Busy 2xm`b>  
    Application.DoEvents() Y"=y%f)yQ  
  Loop 8;Nlq(m  
*\z!CwI  
  Dim webDoc As Object = brow.Document.all 9{:*#oFW  
  Dim webTag As Object 2njYsAw8&  
  Dim lengthTag As Integer = webDoc.length - 1 *9BeOdqxn  
/Irc jp#  
  For countTag As Integer= 0 To lengthTag SCC(  
    webTag = webDoc.item(countTag) v Ej$1  
    Select Case Strings.LCase(webDoc.item(countTag).tagname) cS5%8k.3  
      Case "textarea"     ’网页中的文本框 C^+2nDOv  
        Select Case webTag.name  VWd*[+  
          Case "body"   ’"body"来自网页源代码,不同网站很可能不同,你根据实际修改。下同。 kDpeB.*}  
            webTag.value = strBody   ’这是预先定义的值,下同。 -GsN 46b;  
         End Select -%orZ5  
WOL$gR  
      Case "select"       ’网页中的下拉选择框 qZ;dqOU  
        Select Case webTag.name &dH/L]*6  
          Case "month"   ’选择月份,这里略去年、日的选择,因为原理相同。 F`'U2f  
            webTag.all.item(1).selected = True  ’选择第一个值 ?/g' 25~  
         End Select @l(]]E0Y  
HN/{/<eA`  
       Case "input"  ’网页中的输入框 S+ayz;p4  
        Select Case Strings.LCase(webTag.type) muU,N&#AT  
          Case "text"     ’文本 ,Ym+mu{4  
            Select Case webTag.name 5hq{;G1\  
              Case "name", "userid", "nickname" ’用户名 >z|_!Y-f  
                webTag.value = strName 5RPNVc[B  
              Case "subject" ’标题 k|#2ba1qZ  
                webTag.value = strSubject Gu6JcJ"  
              Case "regid" ’注册码 dMJmKj.B  
                webTag.value = strRegid T4s| x>_"[  
              Case "username", "realname" n:q}B12:]  
                webTag.value = strUsername TUJ:Tgb  
              Case "cardnumber" o* ,AxRT6  
                webTag.value = strCardNumber 0pxdbN/  
              Case "homephone" \`GO?-  
                webTag.value = strHomephone ’电话号 > M!$4Vsk  
              Case "url_title" ’链接名称 )^I U  
                webTag.value = urlTitle \ez5^o  
              Case "url"  ’链接 F8|7 r5!wP  
                webTag.value = url /E Tj GU  
              Case "email" ’email地址 2t.3bKx^  
                webTag.value = email 95:np  
              Case "img"  ’图片   a|<RZj/6  
                webTag.value = img l$X[m dED  
              Case "midi"  ’音乐 L*R`WQf  
                webTag.value = midi pZTni'Ld  
              Case "year"  ’年 ;-"A,q  
                webTag.value = strYear j*[KW j  
              Case "prompt" ’找回密码提示问题 e<|LV:SE  
                webTag.value = strPrompt ?U mhKYg  
              Case "answer" ’找回密码答案 9//2;j s:  
                webTag.value = strAnswer 4;2 4 L  
            End Select LxH5A =[  
          Case "password"  ’密码 tb1;waq $  
            Select Case webTag.name R3+ +V7V  
              Case "passwd", "password", "confirm", "repasswd" ’密码,确认密码 W4iMq5  
                webTag.value = strPass eH1 n:Sz  
            End Select d$v'6Fc  
          Case "checkbox"  ’单选框 4qF3% ?  
            Select Case webTag.name ~cTMixmKs  
              Case "emailme"  ’email通知tuenhai !A* .  
                webTag.checked = True   \I!Tsz_y  
            End Select RY OV N$  
) fAq})n  
        End Select )sUKp7, 1  
add2< xMO  
     End Select $ ALd2Rf  
   Next /nz2{cE[  
`: 8*PN5}  
  brow.Document.forms(0).submit()  ’许多网页表单,这一句简单代码即实现自动提交 ;Sy 8,SH  
%Z8`+:~ G  
End Sub
 

于是,主过程是这样:

Public Sub autoAdd() qhrfs]*  
  brow.Silent = True ’不弹出窗口 4A\~JH >  
  brow.Navigate("http://www.Tuenhai.com") ’ tuenhai的小站为例 a#'4( N!Y  
  Do While formBrowNetsh.brow.Busy  ’等待网页加载完毕 F!lmeiN  
    Application.DoEvents() :/"ea c&  
  Loop 'P-c <  
  Call fill() }}%e(Wm_y  
End Sub

  以上代码可实现可视化自动注册和论坛自动发帖工具。 *c,ij;  
   还有几个问题有待解决: =dEfid  
   一. 有的网站要填上识别码数字才能注册或发言,如何用程序来实现自动识别识别码图片上的数字? U6o <8 Vz  
   二. 有的网站一进去就会跳出一个欢迎对话框,程序的运行就被暂停。 Iwa[e;+h  
   三. 对于自动注册和发言来说,加载较慢的图片、Flash、音乐等并不是必需的。 +1(+a%  
US}u$fJzx  
   JN=u v2  
              用HttpWebRequest类做论坛快速发帖器 H#1%xG  
J iZjfi/a  
  用HttpWebRequest类做论坛发贴机就简单多了。 R'H/d{ }wn  
  我们始终不能忘记,最好的教程是MSDN,在Microsoft Visual Studio .NET 2003“搜索”中敲入HttpWebRequest,抄来一些东东(事实上许多教程书籍都是从MSDN上抄的): t{aW  
   命名空间: System.Net k@BM\G&  
   HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。 cV,6^3XU  
   不要使用 HttpWebRequest 构造函数。使用 WebRequest.Create 方法初始化 HttpWebRequest 的一个新实例。如果 URI 的方案是 http:// 或 https:// ,则 Create 将返回 HttpWebRequest 实例。 >P>u 0WekC  
   GetResponse 方法向 RequestUri 属性中指定的 Internet 资源发出同步请求并返回包含该响应的 HttpWebResponse 实例。可以使用 BeginGetResponse 和 EndGetResponse 方法对 Internet 资源发出异步请求。 3~:5+4Mu&  
   当要向 Internet 资源发送数据时, GetRequestStream 方法返回用于发送数据的 Stream 实例。  BeginGetRequestStream 和 EndGetRequestStream 方法提供对发送数据流的异步访问。   Y HlZe+_  
   如果在访问 Internet 资源时发生错误,则 HttpWebRequest 类将引发 WebException 。 WebException.Status 属性是 WebExceptionStatus 值之一,它指示错误源。当 WebException.Status 为 WebExceptionStatus.ProtocolError 时, Response 属性包含从 Internet 资源接收的 HttpWebResponse N5G) VFF7  
  

Shared Sub postData() 8VKk{w/  
  Dim httpUrl As New System.Uri("http://www.Tuenhai.com?" & "name=yourName&pass=yourPass&cardnumber=yourCardNumber") bLG[]HVo;u  
  Dim req As HttpWebRequest em|}M6=s  
  ’req.Timeout = 10000 ’设置超时值10秒 W zp-.px  
  req = CType(WebRequest.Create(httpUrl2), HttpWebRequest) %oHlrM Q  
  req.Method = "POST" d[{,N  
  req.ContentType = "application/x-www-form-urlencoded" C1br5%Oc  
  Dim bytesData() As Byte =   System.Text.Encoding.ASCII.GetBytes(""name=yourName&pass=yourPass&cardnumber=yourCardNumber") h)3l >]  
  req.ContentLength = bytesData.Length KH, 2H  
  Dim postStream As Stream = req.GetRequestStream() DH0 @bwAq  
  postStream.Write(bytesData, 0, bytesData.Length)   ’以上向服务器post信息。

  Dim res As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse) ’以下获取服务器返回信息 5(CSeCI,s  
  Dim reader As StreamReader = _ 1IgQ\A  
  New StreamReader(res.GetResponseStream, System.Text.Encoding.GetEncoding("GB2312")) Uv} k< a  
  Dim respHTML As String = reader.ReadToEnd() (R.cN  
    MsgBox(respHTML)  ’这就是向网络服务器post后返回的信息 ,l> Ko  
    MsgBox(res.StatusCode.ToString)  ’向网络服务器post后返回的状态码 ##&EZ!N#  
  res.Close() ’关闭 Be#J9>IL  
LyYBW>,l  
End Sub

  用AxWebBrowser控件做论坛发贴机留有三个问题,用HttpWebRequest类来实现,后二个问题都不复存在。而且,用HttpWebRequest类来实现论坛发帖器的速度要快得多。但是,同样的? q,^L m  
  有的网站要填上识别码数字才能注册或发言,如何用“论坛自动发贴机”来实现自动识别识别码图片上的数字?

  我们在主过程里加上线程,因为我们以后要用多线程做自动发帖机啊。用多线程做论坛自动发贴器在VB6中不好实现,在VB.NET中做自动发帖工具却不难。 5wmEm Li  
 

Dim threadAdd As System.Threading.Thread ’定义线程  R-2TmUEi  
Public Sub threadAutoAdd() .wKV=UO/  
  threadAdd= New System.Threading.Thread(AddressOf postData)  ’创建线程实例 i-ko?=0Z8  
  threadNetsh.Start()  ’开始线程 rdI'@0  
  ’别忘了在Sub postData()的最后加上threadAutoAdd.Abort()来关闭线程 )Cl 0RO|7  
  ’或者在这里加上判断Sub postData()完毕的代码,如果完毕就关闭线程 6`K\NL#  
End Sub

yw -dviV$  
  Visual Studio .NET 2003 是一个全面的开发工具,用于快速构建面向 Microsoft Windows? 和 Web 并连接 Microsoft .NET 的应用程序,是否极大地提高了我们的开发效率呢? g~v1093  
xsFa5!gN!  
   '`yl50RT  
E9Iat\JGH  
k)\[cLo1  
               http://www.Tuenhai.com Fv=~[Zh  
                 2004年1月24日

 

 

    

  

 

Tuenhai简介:Tuenhai同学对儒释道医卜命相有一定研究,对网络及英语最感兴趣,于哲学最有心得.常人利已,圣人利他,我非圣人,取道中庸.希望与各位精英交流,MSN:king#tuenhai.com / }]$&Jz  
我的网站: http://www.Tuenhai.com/

 

 

 


类别: 无分类 |  评论(0) |  浏览(6169) |  收藏
发表评论
看不清楚,换一张