【问题标题】:How Do I Type A Message In Messenger With VBScript?如何使用 VBScript 在 Messenger 中键入消息?
【发布时间】:2020-03-20 14:09:51
【问题描述】:

我设置了一个要运行的脚本,该脚本可以打开 Messenger,遍历一组要向其发送消息的人,并向每个人发送一条预先录制的文本消息(保存在编号的文件中)。问题是我都是通过Shell来做这一切的,而且非常草率。它在一定程度上有效,但我正在寻找一种更好的方法来做到这一点,它更清洁并且可以独立工作,所以我不必照看它。我将包括当前的工作代码,然后是我想要工作的代码,然后我将专注于我需要帮助的问题。

这是我当前的工作代码:

Dim messenger, readFile(1), str1, date1, date2, days

date2 = Date
date1 = "12-Dec-19"
days = DateDiff("d", date1, date2)

messenger=Array(...)
Set obj = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Set obj1 = obj.OpenTextFile("C:\Users\Sherman\Documents\Message\Day" & days & ".txt", ForReading)
readFile(0) = obj1.ReadAll
readFile(1) = "{ENTER}"
str1 = Join(readFile)

For i = 0 To UBound(messenger)
    CreateObject("WScript.Shell").Run("https://www.messenger.com/t/" & messenger(i))
    WScript.Sleep 12500
    CreateObject("WScript.Shell").SendKeys str1
    WScript.Sleep 2000
Next

obj1.Close
Set obj=Nothing

此代码适用于我的默认浏览器,即 Opera(但可以使用我设置为默认的任何浏览器),但它不能等待浏览器完成加载,这样会更整洁。所以我只好做我不喜欢的事情,并在这个脚本中使用 IE:

Dim messenger, readFile(1), str1, date1, date2, days, IE

date2 = Date
date1 = "12-Dec-19"
days = DateDiff("d", date1, date2)

messenger=Array(...)
Set obj = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Set obj1 = obj.OpenTextFile("C:\Users\Sherman\Documents\Message\Day" & days & ".txt", ForReading)
readFile(0) = obj1.ReadAll
readFile(1) = "{ENTER}"
str1 = Join(readFile)

For i = 0 To UBound(messenger)
    Set IE = CreateObject("InternetExplorer.Application")
    With IE
        .visible = true
        .navigate "https://www.messenger.com/t/" & messenger(i)
        While .Busy
            WScript.sleep 100
        Wend
        .getElementsByName("span data-text='true'").value = str1 '<-This is where the error occurs'
        WScript.Sleep 30000 'give time for shell to type out the message'            
    end With
    IE.Close  'not sure if this works or not because the error occurs before I get here'
Next    
obj1.Close

我可以像上面那样创建一个 shell 对象来发送消息,但由于某种原因,它不像在第一个代码中那样作为文本块发送,实际上输入每个字符都需要时间(非常烦人! )。文本字段包含在一个跨度中,该跨度包含在另一个跨度中。所以我不能只针对标签来发送消息。此外,.getElementById 没有可定位的 ID。我得到的错误是“对象不支持这个属性或方法”,即使我已经看到其他关于使用 .getElementsByName 方法的 VBScript 线程。

接下来,我想在启动另一个浏览器实例之前关闭每个浏览器实例。出于某种原因,关闭浏览器窗口似乎比打开它要复杂得多。

我是不是把这弄得太复杂了?有没有更简单的方法可以更好地向多人发送自动消息?我应该完全放弃 VBScript 并使用其他东西吗?任何帮助将不胜感激。

【问题讨论】:

    标签: internet-explorer vbscript


    【解决方案1】:

    当使用 getElementsByName 或 getElementsByClassName 方法时,它将返回一个具有相同名称和类名的类数组对象。如果我们想访问特定元素,我们可以通过数组索引(从 0 开始)找到它。像这样:

    .Document.getElementsByName("q").Item(0).Value = "Foxtrot RPA" 'Write something to search for.
    

    接下来,我想在启动另一个浏览器实例之前关闭每个浏览器实例 一。并且出于某种原因关闭浏览器窗口似乎很多 比打开更复杂。

    要关闭特定选项卡,您可以尝试使用IE.Quit 方法。

    参考:How-To Automate IE With VBScript

    【讨论】:

    • VBScript 是无类型的,它不理解As Object 也没有DoEvents 的概念
    • @Lankymart,谢谢你提醒我,之前的代码是VBA脚本,是我的错误。我已经改变了我的回复。请检查一下。
    • @ZhiLv-MSFT,感谢您的回复。如何检查以确保我拥有正确的物品?我试过这个,但它返回了一个错误:Set ele = IE.document.getElementsByClassName("_5rpb").Item(5) MsgBox ele.innerHTML MsgBox ele.outerHTML 另外,我注意到在我开始输入之前,代码类型的行上的 innerhtml 只包含一个
      标记。但是一旦有人开始打字,它就会动态地变成一个 标签。所以我需要定位下一个标签并使用那个标签,对吗?
    • @Sherman,对于第一个问题,从您的代码中,您想按类名查找元素。因此,您可以检查您的应用程序代码中哪个元素具有相同的类名。此外,您还可以使用 F12 开发人员工具来检查网页元素并检查类名。对于第二个问题,通过使用您的代码,它将动态更改innerHtml,
      标签插入一个换行符,标签用于插入文本,也许有人插入了一些文本。可能你应该添加一些限制,只允许一个用户同时修改内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多