質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

1回答

1326閲覧

ローカル機器(ビジネスホン管理画面)へのスクレイピングについて

arakuman

総合スコア17

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2020/04/15 01:43

編集2020/04/15 02:22

前提・実現したいこと

テレワークで出勤人数が大幅に減り『電話の着信未応答があったら通知する』という処理が必要になりました。

ビジネスホンの管理画面から通話履歴一覧のcvsがダウンロード出来ますので、これをVBAで取得・抽出してLINEのグループトークに投げるという処理を考えております。

ビジネスホンはNTT Netcommunity SYSTEM αNX TYPE-M です。
イメージ説明

該当のソースコード

ごく普通に…

vba

1Option Explicit 2Sub LoginTest() 3Dim objIE As InternetExplorer 4 Set objIE = New InternetExplorer 5 6 objIE.Visible = True 7 objIE.Navigate "http://192.168.11.110" 'ビジネスホン管理画面 8 9 Do While objIE.Busy = True Or objIE.readyState <> 4 10 DoEvents 11 Loop 12 13 Dim htmlDoc As HTMLDocument 14 Set htmlDoc = objIE.Document 15 16 With htmlDoc 17 .getElementById("Account").Value = "****" 'ユーザー名 ここでエラー 18 .getElementById("Password").Value = "****" 'パスワード 19 .getElementsByClassName("Login_Button")(0).Click 20 End With 21 22End Sub 23

を実行すると

実行時エラー '91': オブジェクト変数または with ブロック変数が設定されていません

…というよく見るエラーです。
ビジネスホンのIPに変更した途端にエラーが出るので、インターネットに公開されていないから駄目なのかと、試しにルータのIPを入れるとうまく行ったりします。

vba

1'Buffalo ルータの場合はログインできます。 2'略 3objIE.Navigate "http://192.168.11.1" 'ルータ 4'略 5With htmlDoc 6 .getElementById("form_USERNAME").Value = "admin" 'ユーザー名 7 .getElementsByName("airstation_pass")(0).Value = "******" 'パスワード 8 .getElementsByClassName("button_login")(0).Click 9End With

同様に色々試したところ、
○ 音声メールユニット(NTT NXSM-VMU-<2>留守番電話のようなもの)
× 複合機 (Richo MP C2504)
○ NAS (Synology DS216J)
出来る機器と出来ない機器との違いが分からず非常に困っています。

Powershellで同様の事を実行しておられる方は見つけたのですが、Powershellについては全く不勉強でして…。
中小底辺事務員が自動化を頑張る(Powershellでスクレイピング)

追記です
ユーザー名のタグ

html

1<input type="text" name="Account" id="Account" maxlength="16" style="width:170px; height:15px;" onkeypress="{if (event.keyCode == 13) onchg();}">

に対して

vba

1.getElementById("Account").Value = "****" 2.getElementsByName("Account")(0).Value = "****"

など可能な限りのタグ属性で試しました。

お忙しいところ恐縮ですが宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/04/15 02:10

スクレイピングで取得できるhtmlの内容が変わっているのではないでしょうか。そこを先に確認すべきです。
arakuman

2020/04/15 02:23

ありがとうございます。 htmlの内容=タグ属性と理解しました。 追記にも記しましたが、ID,class,nameと、可能な限りのタグ属性で試していますが変わりありません。
dodox86

2020/04/15 02:26

いえ、その部分だけではなく、html(HTTPレスポンス)全体という意味です。そこが違うのでスクレイピング(該当タグのデータ取得)に失敗しているのではないかと。
CHERRY

2020/04/15 02:28

アクセス後に objIE.Document を出力するなどして、HTML を確認してみてください。
arakuman

2020/04/15 03:26

何ともお恥ずかしい話です。穴があったら…というのは正にこういう事で、同時に皆様には舌打ちされてしまいそうな結果です。 objIE.Document を出力するまでも無く、そもそもページがフレーム構造になっていました。そんなの一番最初に気付けよ、といった事案です。お騒がせしました。
guest

回答1

0

自己解決

お恥ずかしい話です。ページがフレーム構造でした。
お陰様で自己解決しました。

vba

1Option Explicit 2Sub LoginTest() 3Dim objIE As InternetExplorer 4 Set objIE = New InternetExplorer 5 6 objIE.Visible = True 7 objIE.Navigate "http://192.168.11.110" 'ビジネスホン管理画面 8 9 Do While objIE.Busy = True Or objIE.readyState <> 4 10 DoEvents 11 Loop 12 13 Dim htmlDoc As HTMLDocument 14 Set htmlDoc = objIE.document 15 16 With htmlDoc.frames(0).document  '←変更 17 .getElementById("Account").Value = "****" 18 .getElementById("Password").Value = "****" 19 .getElementsByClassName("Login_Button")(0).Click 20 End With 21 22End Sub

投稿2020/04/15 03:38

編集2020/04/15 03:53
arakuman

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問