0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【VBA】ブラウザから英単語音声ファイルを一括ダウンロード

Last updated at Posted at 2019-11-17

やりたいこと

・英語学習に使用する英語音声をブラウザからダウンロードする仕組みを自動化したい。
・流れは以下の通り
  「テキストファイルから1行読み取り」
  「読み取った文字列をブラウザに入力」
  「ファイルをダウンロード」
 ・今日日VBAでブラウザにアクセスするなど時代遅れかもしれないが、そこは気にしない。

ダウンロード先サイト

Sound Of Text

コード

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

' マウスイベント
Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Declare Sub mouse_event Lib "user32" ( _
    ByVal dwFlags As Long, _
    Optional ByVal dx As Long = 0, _
    Optional ByVal dy As Long = 0, _
    Optional ByVal dwDate As Long = 0, _
    Optional ByVal dwExtraInfo As Long = 0)

' 遷移先URL
Const TARGET_URL As String = "https://soundoftext.com/"

' 音声の保存先
Const OUTPUT_SOUND_PASS = "★★★\★★★\"

' メッセージ群
Dim inputMessage(1000) As String
Dim inputMessageCount As Long

Option Explicit

' エントリ関数
Sub Main()
  
  'IE(InternetExplorer)のオブジェクト変数を定義する。
  'このオブジェクトをするには「ツール」->「参照設定」にて
  ' 1.Microsoft Internet Controls
  '  2.Microsoft HTML Object Library
  'にチェックをつける必要がある。
  Dim objIE As InternetExplorer
  
  ' IE(InternetExplorer)のオブジェクトを作成する。
  Set objIE = CreateObject("InternetExplorer.Application")

  ' IE(InternetExplorer)を起動する。
  objIE.Visible = True
  
  ' フルスクリーンにする。
  Dim ret As Long
  ret = ShowWindow(objIE.hWnd, 3)
  
  ' 指定したURLへアクセスする。
  objIE.Navigate TARGET_URL
  
  ' 読み込みが完了するまで待機する。
  Call IEWait(objIE)

  ' マウスクリックによりスクロール
  Call ClickMouse(1910, 300)
  Sleep (3000)

  ' ファイルを読み込む。
  Call LoadFile

 ' 英単語数分ループ
  Dim i As Long
  For i = 0 To inputMessageCount - 1
    Call DownloadSoundFile(objIE, inputMessage(i))
  Next
  
  ' アクティブウィンドウを閉じる。
  objIE.Quit
  Set objIE = Nothing
  
End Sub

' ファイルをダウンロードする。
Sub DownloadSoundFile(objIE As InternetExplorer, text As String)
    
  ' HTMLドキュメントオブジェクトを設定する。
  Dim htmlDoc As HTMLDocument
  Set htmlDoc = objIE.Document
     
  ' 英単語を入力
  ' valueの値書き換えだけでは正常に動作しない。
  ' おそらくonChangeなどが動的に呼ばれているため、直接キー入力する必要がある。
  Call ClickMouse(1000, 320)
  SendKeys text, True
  Sleep (200)

  ' Submitボタンを押下
  Call ClickMouse(1000, 500)
  Sleep (5000)
  
  ' 「ダウンロード」リンクを押下
  Call ClickMouse(800, 930)
  Sleep (2000)
    
  ' 名前を付けて保存を選択
  ' Alt + N -> Tab -> ↓ -> A
  SendKeys "%(n)", True
  Sleep (500)
  SendKeys "{TAB}", True
  Sleep (500)
  SendKeys "{DOWN}", True
  Sleep (500)
  SendKeys "A", True
  Sleep (1000)
  
  ' ファイルパスを設定して保存
  SendKeys OUTPUT_SOUND_PASS & text + ".mp3", True
  Sleep (100)
  SendKeys "{ENTER}", True
  Sleep (2000)
  
End Sub


' マウスをクリックする。
Sub ClickMouse(X As Long, Y As Long)
  ' 「ダウンロードバー」を閉じる。
  SetCursorPos X, Y
  mouse_event 2  '左ボタン押下のコード
  mouse_event 4  '左ボタン解放のコード
  Sleep (100)

End Sub

'
' テキストファイルを読み込む。
'
Sub LoadFile()
  Dim line As String
  inputMessageCount = 0
  
  ' ファイルの終端に至るまで一行ずつ読み込み。
  Open OUTPUT_SOUND_PASS & "_Input.txt" For Input As #1
  Do Until EOF(1)
    Line Input #1, line
    inputMessage(inputMessageCount) = line
    inputMessageCount = inputMessageCount + 1
  Loop
  Close #1

End Sub

書き換え必要な部位

・出力先ファイルパス : TARGET_URL
・ClickMouseの引数のスクリーン座標

速度

・確実に処理させるためSleepを多めに入れているためあまり早くない。
・約4ファイル / 分程度

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?