Как мне ввести сообщение в мессенджере с VBScript? - PullRequest
1 голос
/ 20 марта 2020

Я настроил скрипт для запуска, который открывает мессенджер, проходит через массив людей, которым нужно отправить сообщение, и отправляет каждому из них предварительно записанное текстовое сообщение (сохраненное в пронумерованных файлах). Проблема в том, что я делаю все это через 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 (но может работать с тем, что я установил по умолчанию), но он не может ждать, пока браузер завершит загрузку sh, что будет лучше. Поэтому мне пришлось делать то, что мне не нравится, и использовать 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

Я могу создать объект оболочки, как указано выше, для отправки сообщения, но по какой-то причине, а не отправляя его в виде блока текста, как в первом коде, на самом деле требуется время для ввода каждого символа (очень раздражает!). Текстовое поле содержится в промежутке, который содержится в другом промежутке. Поэтому я не могу просто нацелить тег на отправку сообщения. Кроме того, нет идентификатора для цели с .getElementById. И я получаю сообщение об ошибке «Объект не поддерживает это свойство или метод», хотя я видел другие потоки о VBScript, которые используют метод .getElementsByName.

Далее я хочу закрыть каждый экземпляр браузера перед запуском другого. А закрытие окна браузера кажется по какой-то причине намного сложнее, чем его открытие.

Я делаю это слишком сложным? Есть ли более простой способ, который лучше работает при отправке автоматических сообщений нескольким людям? Стоит ли вообще отказываться от VBScript и использовать что-то еще? Любая помощь будет оценена.

1 Ответ

2 голосов
/ 23 марта 2020

При использовании метода getElementsByName или getElementsByClassName он возвращает массивоподобный объект с одинаковыми именами и именами классов. Если мы хотим получить доступ к указанному элементу c, мы можем найти его через индекс массива (начиная с 0). как это:

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

Далее я хочу закрыть каждый экземпляр браузера перед запуском другого. А закрытие окна браузера по некоторым причинам кажется гораздо более сложным, чем его открытие.

Чтобы закрыть вкладку спецификаций c, вы можете попробовать использовать метод IE.Quit.

Ссылка: Как автоматизировать IE С VBScript

...