見出し画像

15年鉄削ってきた36歳駆け出しエンジニアがVBAで自動ツイートしてみた件

はい、こんなタイトル一回やってみたかった。( ´∀` )

VBAでスクレイピングでもしようかな~と思ってたところ、
seleniumを知りました。

結構簡単にChrome操作できるみたいなので、

「そうだ、京都へ行こう!」

ではなくて、

「そうだ、Twitterやろう!」

となり、Twitterやってみました。
ちなみに別アカウント作ってログインからツイートまでって感じです。

やり方を説明するブログでもないし説明できるレベルでもないので色々はしょりますが、とりあえずコードは以下のような感じ

Option Explicit

    Public Driver    As New Selenium.WebDriver
    Public skey      As New Selenium.Keys
    Public elm       As Selenium.WebElement
    Public myBy      As New By
    Public wb        As Workbook
    Public wsRoguin  As Worksheet
    Public wsTweet   As Worksheet
    Public FWFlag    As Boolean
    
    Public roguinURL        As String
    Public userNameXPath    As String
    Public passwordXPath    As String
    Public addressXPath     As String
    Public checkTextXPath   As String
    Public userName         As String
    Public password         As String
    Public address          As String
    
    Public newTweetXPath    As String
    Public tweetBoxXPath    As String
    Public tweetButtonXPath As String
    Public tweetText        As String
    
Sub Twitterマクロ()

    Call 初期設定
    
    
    Call Twitterログイン
    Stop
    
    Call 新規ツイート投稿
    Stop
    
End Sub

Sub 初期設定()

    Set wb = ThisWorkbook
    Set wsRoguin = wb.Worksheets("ログイン")
    Set wsTweet = wb.Worksheets("新規ツイート")
    
    roguinURL = wsRoguin.Range("C4").Value              'ツイッターのログインページURL'
    addressXPath = wsRoguin.Range("C11").Value          'メールアドレス入力ボックスのXPath'
    checkTextXPath = wsRoguin.Range("C15").Value        '「電話番号またはユーザー名を入力」のテキスト表示のXPath'
    userNameXPath = wsRoguin.Range("C12").Value         'ユーザー名入力ボックスのxPath'
    passwordXPath = wsRoguin.Range("C13").Value         'パスワードの入力ボックスのxPath'
    
    address = wsRoguin.Range("C6").Value                'ログイン時のアドレス'
    userName = wsRoguin.Range("C7").Value               'ログイン時のユーザー名'
    password = wsRoguin.Range("C8").Value               'ログイン時のパスワード'
    
    newTweetXPath = wsTweet.Range("C10").Value          '新規ツイートボタンのXPath'
    tweetBoxXPath = wsTweet.Range("C11").Value          'tweet内容入力ボックスXPath'
    tweetButtonXPath = wsTweet.Range("C12").Value       'tweet投稿ボタンのXPath'
    tweetText = wsTweet.Range("C6").Value               'tweet本文の内容'
    

End Sub

Sub Twitterログイン()

    Driver.AddArgument "disable-gpu"                        'ウインドウサイズを最大化で開く'
    Driver.AddArgument "start-maximized"                    '同上'
    
    Driver.Start "chrome"
    Driver.Get roguinURL          'ツイッターのログインページ開く'
    Driver.Wait 1000
    
    
    '----メールアドレスの入力-----------------------------'
    
    Call XPath取得チェック(addressXPath)
    Set elm = Driver.FindElementByXPath(addressXPath)      'メールアドレス入力ボックスのxPath'
    elm.Clear
    elm.SendKeys address                                   'メールドレス入力'
    elm.SendKeys skey.Enter
    Driver.Wait 1000
    
    
    '----ユーザー名の入力が必要な場合-----------------------------'
    
    Call XPath取得チェック(userNameXPath, passwordXPath)
    If Driver.FindElementByCss(checkTextXPath).Text = "電話番号またはユーザー名を入力" Then
         Set elm = Driver.FindElementByXPath(userNameXPath)               'ユーザー名の入力ボックスのxPath'
         elm.Clear
         elm.SendKeys userName                                            'ユーザー名入力'
         elm.SendKeys skey.Enter
         Driver.Wait 1000
    End If
        
    '----パスワードの入力-----------------------------'
    
    Call XPath取得チェック(passwordXPath)
    Set elm = Driver.FindElementByXPath(passwordXPath)      'パスワードの入力ボックスのxPath'
    elm.Clear
    elm.SendKeys password                                   'パスワード入力'
    elm.SendKeys skey.Enter
    Driver.Wait 1000
    
End Sub

Sub 新規ツイート投稿()
    
    Call XPath取得チェック(newTweetXPath)
    Driver.FindElementByXPath(newTweetXPath).Click          '新規ツイートボタンをクリック'
    Driver.Wait 1000
    
    
    Call XPath取得チェック(tweetBoxXPath)
    Set elm = Driver.FindElementByXPath(tweetBoxXPath)      'tweet内容入力ボックスXPath'
    elm.Click
    elm.SendKeys tweetText                                  'tweet本文の内容'
    Driver.Wait 1000
    
    
    Call XPath取得チェック(tweetButtonXPath)
    Set elm = Driver.FindElementByXPath(tweetButtonXPath)   'tweet投稿ボタンのXPath'
    Driver.Wait 1000
    elm.Click

End Sub

Sub XPath取得チェック(checkXPath1 As String, Optional checkXPath2 As String = "nothingXPath")
    
    Dim i As Long: i = 0
    FWFlag = False
    Do
        FWFlag = Driver.IsElementPresent(myBy.XPath(checkXPath1)) Or _
                  Driver.IsElementPresent(myBy.XPath(checkXPath2))
        Driver.Wait 1000
        'Debug.Print "まだ処理できません"'
        
        i = i + 1
        If i = 100 Then
            MsgBox "処理が継続できません。終了します。"
            End
        End If
        
    Loop Until FWFlag = True

End Sub


ちなみに以下ブログ参照させていただきました。

Excelの画面はこんな感じ

大事なところは消してますが( ´∀` )

XPathの取得のところは何回もエラーが出て苦労しました。
何秒待てばええねん!ってDriver.Wait  10秒くらいにしたいりとか。
XPath取得するたびに待機処理するのもめんどくさいな~と思いつつ処理を呼び出せるようにしました。

あとは1つのモジュールに書き込んじゃっているからクラスモジュールとか書けるようになると変わるのかね。
もっと勉強しないとね。。。。

あとはTwitterさんからログインするたびにやたらメールくる( ´∀` )
英語分からんけど
「なんか知らん端末からログインしとる奴おるでー!だいじょうぶかー!?」
っておっしゃってるんでしょう。
知らんけど(笑)


そういえばもう一個苦労した点
ログイン時にメールアドレス入力した後に
「いつもとログイン方法が違いますので電話番号またはユーザー名を入力してください」
と表示されるときとされない時があった。

いや、毎回同じですが?( ´∀` )

しつこくログインしてますが毎回同じですが?( ´∀` )

というわけで条件処理追加しました。

なかなか面白かったのでもっと遊んでみようと思います。


てなわけで今日はここまで

さよなら
さよなら!
さよなら!!!

いいなと思ったら応援しよう!