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さんからログインするたびにやたらメールくる( ´∀` )
英語分からんけど
「なんか知らん端末からログインしとる奴おるでー!だいじょうぶかー!?」
っておっしゃってるんでしょう。
知らんけど(笑)
そういえばもう一個苦労した点
ログイン時にメールアドレス入力した後に
「いつもとログイン方法が違いますので電話番号またはユーザー名を入力してください」
と表示されるときとされない時があった。
いや、毎回同じですが?( ´∀` )
しつこくログインしてますが毎回同じですが?( ´∀` )
というわけで条件処理追加しました。
なかなか面白かったのでもっと遊んでみようと思います。
てなわけで今日はここまで
さよなら
さよなら!
さよなら!!!