65.9K
CodeProject 正在变化。 阅读更多。
Home

Web 活动自动化工具

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.87/5 (17投票s)

2011年1月5日

CPOL

3分钟阅读

viewsIcon

61296

downloadIcon

346

您可以通过自动化工作来减少人工努力。

背景

继我发布关于 实时比分 [板球] 在 GIT 上的帖子后,我收到了一个发布同样代码的请求。 我来了,开始我的第一篇文章。 我希望您会以某种方式发现它有用。

引言

没有什么太多可以做的,但发现我们中没有多少人知道方法 - 如何做到这一点。 我向您展示如何自动更新您在 CodeProject 上的帖子。 它可能有许多其他用途,但我最近将它用于此任务。

Using the Code

它包括 2 个步骤

  1. 获取要发布的内容
  2. 发布内容

需要此代码来了解页面是否已加载。

  Dim proceed As Boolean

  Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, _
	ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) _
	Handles WebBrowser1.DocumentCompleted
    proceed = True
  End Sub

这是一个可以用来浏览页面或向页面发布一些数据的函数。

  Public Sub FillForm(ByRef wbrowser As System.Windows.Forms.WebBrowser, _
	ByVal url As String, Optional ByVal keys() As String = Nothing, _
	Optional ByVal values() As String = Nothing, _
	Optional ByVal submit As String = "")
    Dim obj As HtmlElement
    Dim objcol As System.Windows.Forms.HtmlElementCollection

    proceed = False
    wbrowser.Navigate(url)
    While Not proceed
      Application.DoEvents()
    End While
    proceed = False

    If keys Is Nothing Or values Is Nothing Then Exit Sub

    If keys.Length = values.Length Then
      For i As Integer = 0 To keys.Length - 1
        obj = wbrowser.Document.GetElementById(keys(i))
        If obj IsNot Nothing Then obj.SetAttribute("value", values(i))
      Next

      If submit <> "" Then
        If submit = "true" Then
          objcol = wbrowser.Document.GetElementsByTagName("input")
          For Each objx In objcol
            If objx.GetAttribute("Type").ToLower = "submit" Then
              obj = objx
              Exit For
            End If
          Next
        Else
          obj = wbrowser.Document.GetElementById(submit)
        End If
        If obj IsNot Nothing Then
          obj.InvokeMember("Click")
        End If
      End If
    End If
    proceed = False
  End Sub		

要浏览页面,您可以使用此功能,例如

FillForm(WebBrowser1, "www.google.com") 

我的应用程序使用雅虎板球获取最新比分。 所以我得到了页面

FillForm(WebBrowser1, _
http://cricket.yahoo.com/cricket-live-score-south-africa-vs-india_11992)  

当页面加载后,我必须查找比分。 我检查了页面的源代码,发现 tab1header-main 包含主要比分。

所以我使用以下内容来获取比分内容

Dim content As String = WebBrowser1.Document.GetElementById_
	("header-main").InnerText.Trim & vbCrLf & vbCrLf & _
	WebBrowser1.Document.GetElementById("tab1").InnerText

这就是我获取要发布内容的方式。


现在我们必须将其发布到 CodeProject。 为此,我获取了我的帖子的编辑链接,即 - https://codeproject.org.cn/script/Forums/Edit.aspx?fid=1580229&select=3719714&floc=/Forums/1580229/General-Indian-Topics.aspx&action=m

现在有了上述函数,发布它就像切蛋糕一样容易。

FillForm(WebBrowser1, My.Settings.EditURL, New String() _
	{"ctl00_MC_Subject", "ctl00_MC_ContentText_MessageText"}, _
	New String() {"Live Score [Cricket]", content}, "ctl00_MC_submit")

My.Settings.EditURL 包含我的帖子的编辑 URL。 再次使用页面源,我找到了所需控件的 ID

  • ctl00_MC_Subject
  • ctl00_MC_ContentText_MessageText
  • ctl00_MC_submit

如您所见,keys 包含要编辑的控件 ID,values 包含这些控件的值,顺序相同。 submit 是发布消息的按钮的 ID。 我对此参数有一个特殊情况,如果 submit="true",那么它会查找页面上的按钮并单击它。 当页面上只有一个没有 ID 的按钮时,这可能很有用。

它的工作原理如下:它在 keys 中查找控件,并为它们分配来自 values 的值。 在分配所有值后,它会查找提交按钮以发布它。

关注点

这可以用于许多方面。 这只是您能做什么以及如何做。 只是一个明智的词 - 用于做好事,不要用于垃圾邮件。

我知道这并没有处理任何消息框,或来自页面的脚本错误。 并且还有许多其他情况需要考虑。

有广泛的修改范围,但到目前为止,我只对这个函数满意。 只要我需要它,它就能发挥作用。 尽管如此,欢迎您提出建议。 如果您发现它有好的用途或修改,请随时告知我。

历史

  • 在此阶段 (2011 年 1 月) 尚未对代码进行任何更改
  • [201101051220] 包含代码
© . All rights reserved.