プロが教える店舗&オフィスのセキュリティ対策術

※具体的なサービス名まで参考までに書きましたが、知らなくても問題ありません。

フリーテルSIMのマイページに現在のデータ使用量が記載されています。
その数値を自動的に定期取得する方法はないでしょうか?

今月の使用量合計の最新値が記載されているだけなので、
過去の日単位での数字をさかのぼって見る事ができません。

日単位の使用量を知るには、毎日使用量合計値をエクセルに記録し、
昨日との差分から出す事になり、実際にできる限り毎日午前中に記録を取っていますが、
休日等の記録できなかったり記録し忘れてしまう日があります。
その場合は平均値で埋めるようにしていますが、
何か自動化する方法はないかなと思い、効率化に詳しい人に相談したく投稿させていただきました。

質問者からの補足コメント

  • 具体的に取得したい画面のキャプチャーを貼ってみます。
    緑枠が取得したい文字列です。
    最初の単位は「MB」、
    1000MBを超えたところで「GB」へと変化するので単位まで取得したいです。

    「あるWEBページの特定の数値を自動記録す」の補足画像1
      補足日時:2018/07/24 16:18
  • HAPPY

    No2への補足です。
    色々頼ろうとして申し訳なかったですが、
    ログインして、目的のページへ遷移して、必要な情報をCSVに書き出すところまでできました。
    なので大丈夫です。
    ただ取得情報の場所特定テクニックが甘く、結構余計な情報まで取得してしまう仕様です。
    上手い取得の方法の相談に乗っていただけるなら具体的に書きます。
    駄目なら諦めます。
    ありがとうございました。

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/07/26 17:27
  • うーん・・・

    No.4の補足です。
    締めくくると言っておきながら申し訳ありません。
    Replaceで半分は解決しました!

    あと1つだけ教えてください。
    先日の添付画像をみると
    「2.40GB ~ 2.41GB」に見えますが、実はここが曲者で、
    「~」この波線が環境依存文字を使っているのです。開発者はMacかな?

    その為、書き出されたCSV内では「?」に変換されているのですが、
    Replaceで取り除けないのです。
    ちなみに書き出された後のCSVでは
    「2.40GB ? 2.41GB」となります。

    文字コードの問題で、実はシンプルなクエスチョンマークではないのかもしれませんが・・・
    これだけお知恵をお貸しください。

    No.4の回答に寄せられた補足コメントです。 補足日時:2018/07/27 17:44

A 回答 (5件)

自分だったらですが、UWSCを使用とか。


PCを起動しっぱなしで、タスクスケジューラから毎日決まった時間なんかにスクリプトを実行。
取得してデータはテキストに落としてもいいし、Excelに追記も可能です。

下記はどこかのサイトのテーブルの中の不特定な位置から希望のデータを取得って例だそうです。

人力検索はてな - UWSCを使ってWEB上から必要なデーターを取る方法を教えて下さい。
http://q.hatena.ne.jp/1387280635


> フリーテルSIMのマイページに

自分はアカウント持ってないので、具体的にどうこうってのは言えないですが。

--
ただ、UWSCの公式サイトが現在アクセスできなくなってるみたい。

UWSC
http://www.uwsc.info/

2月にライセンスキーの再発行を依頼した際は速やかに処理していただきましたが。
    • good
    • 0
この回答へのお礼

ありがとうございます。

なるほど。その手がありましたね、というかそれしかないかもしれませんね。
UWSCはVectorで配信していました。

PCは常に起動しっぱなしなので問題ありません。
一度ログインしておけば、再ログインせずともページ更新のみでOKなようです。
取得したい情報も更新されました。
あとはスクリプトのみって事になりますね。

これから勉強ということになりますが、
もし簡単だったら教えてください。

・具体的に、取り込みたいページのキャプチャーを補足に貼りました。電話番号にだけモザイクかけてます。

・アクセス先URLは、
 https://mypage.freetel.jp/SavingMode/saveModeDet … で固定です。

・緑枠の文字列を取得したいです。

・例えば、「使用量.csv」等に追記日々するか、「20180727使用量.csv」のようにファイル名に取得日が入るか、簡単な方で。csvでもtxtでもxlsxでもなんでもOK。

・毎日23:59にその日の最終値として取得したいです。

気になる点は
・ブラウザはChromeですが、取得したいタブをアクティブにしておく必要があるのか。

もし可能でしたらよろしくお願いいたします。

お礼日時:2018/07/24 16:23

> ・ブラウザはChromeですが、取得したいタブをアクティブにしておく必要があるのか。



UWSCだと、IEが使いやすいです。
下の例だと、IEを非表示で起動、データ取得して閉じます。

> ・具体的に、取り込みたいページのキャプチャーを補足に貼りました。電話番号にだけモザイクかけてます。

自分はアカウント持ってなくてログインできないので、具体的なコードは提示できないですが。
代わりにというか、gooのサイトのトップから降水確率のデータ取得して、所定の場所のcsvに追記するってサンプルです。

Option explicit

Dim IE, URL // IEオブジェクト、gooのURL
Dim body // 取得するサイトのbodyの内容
Dim percent // 取得する降水確率

// URLを格納
URL="https://www.goo.ne.jp/" // <-なんかダブルクオートが&quot;ってなる。
// IEオブジェクトを作成
IE = CreateOLEObj("InternetExplorer.Application")
// IEを表示(デバッグ時は表示した方がいいね)
//IE.Visible = True
// URLを開く
IE.Navigate(URL)
// 待つ
BusyWait(IE)
// bodyのソース取得
body = IEGetSrc(IE, "BODY")
// <dd class="percent">~</dd>で囲まれた、最初に見つかる降水確率を取得
percent = BetweenStr(body, "<dd class=<#DBL>percent<#DBL>>", "</dd>")
// 降水確率をファイルに書き出す
CSVWrite(percent)
// IE終了
IE.Quit
ExitExit

// ファイル書き出し
Procedure CSVWrite(percent)
 Dim fid // ファイルID
 Dim msgline // 書き込み文字列
 // ファイルオープン c:\_Src\out.csv
 fid = FOpen("c:\_Src\out.csv", F_READ or F_WRITE )
 // 現在日時を取得
 GetTime()
 // 文字列生成
 msgline = G_TIME_YY2 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ", " + Trim(percent)
 // 日付と降水確率を書き込み
 FPut(fid, msgline)
 // ファイルクローズ
 FClose(fid)
Fend

// 待つ
Procedure BusyWait(ie)
 Dim tm
 Sleep(0.5) // Wait
 Const TIME_OUT = 90
 tm = Gettime()
 repeat
  Sleep(0.2)
  ifb Gettime() - tm > TIME_OUT
   MsgBox("Time Out:BusyWait")
   ExitExit
  endif
 until (! ie.busy) and (ie.readyState=4)
 Sleep(0.5)
Fend


丁寧に作るなら、ログイン中かどうか確認、自動でログインとか。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます!頂いたソースで実験してみました。
(ちゃんと書き出し先のパスも修正して)

マウスの操作をそのまま再現するだけと思ってたのに、
バックグラウンドで実行出来る、
ソース内からタグなどの条件から位置を特定して取得できる、
htmlファイルを指定せずともソースを開ける等、
全て想像を上回ってました。
(強いて言うなら、BusyWait の仕組みがまだ分かっておりません。)

しかも、out.csv には前のデータを消さずに改行追記。(ファイル名に日付指定する方法も知りたいですが。)
さらにUWSC本体でスケジュール設定したら、お礼を書いている間も、定期的に実行されてます。
全てが目からうろこ、驚きです。これもRPAと呼ぶんですかね???

これで解決方法は分かりましたので、neKo_deux さんをベストアンサーにさせていただきますが、可能なら更に不明点をご教授いただけると幸いです。
(ここを読め!でも結構です。)

頂いたスクリプトを参考に、自分のやりたい事に置き換えていく中での不明点です。
手順を具体的に書きます。


(1)最初に開くURLは、
 https://mypage.freetel.jp/login

(2)このログイン画面で、
 メールアドレス:aaa@bbb.com
 パスワード:password
 を入力し、「ログイン」ボタンを押下すると、
 https://mypage.freetel.jp/index に飛びます。

(3)その先の本来の画面遷移通りに操作しなくても、
 直接 https://mypage.freetel.jp/SavingMode/saveModeDet …
 にアクセスすれば取得したい画面に遷移します。

(4)目的ページのソースから
 「<span style="font-size: x-large;">」 と 「</span>」の間の文字列を
 CSVに追記できればOKという事になります。

これを毎日23:59に実施すれば全て解決となりますが、
次回実施のために念のため、ログアウト処理もすべきでしょうか?
その際、 https://mypage.freetel.jp/logout にアクセスすればログアウトなのですが。。。

もし可能であればどうかよろしくお願いいたします。

お礼日時:2018/07/25 16:35

ID、パスワードの主力は、IEオブジェクト使う場合はIESETDATAが簡単です。

(サイトが対応するなら。)

uwscのメモ - IEで自動ログインにIESETDATAを使う
http://uwsc.36nyan.com/iesetdata/
UWSC コバヤシ式 - IESETDATA
http://canal22.org/kansu/iesetdata/


> ログインして、目的のページへ遷移して、必要な情報をCSVに書き出すところまでできました。

ならばもうちょっとでしょうか。

--
> ただ取得情報の場所特定テクニックが甘く、結構余計な情報まで取得してしまう仕様です。

取得したページ、bodyの内容が確認できれば絞り込み出来そうでしょうか?

// bodyのソース取得
body = IEGetSrc(IE, "BODY")
print body // <-この行を追記

とすると、ログウィンドウとログファイルに変数の中身を出力出来ます。
回答で提示したスクリプトの作りだと、処理終了するとログウィンドウは閉じちゃうんですが、
UWSCの右端の設定ボタン-[.INI/.LOG Folder]でログファイルの保存されているフォルダを開けるので、
UWSC.LOG
のファイルを開き、質問の補足にある画像の例だと「2.41」の数字を検索し、対象のタグや囲んでいる文字列を特定とか。

タグが分かるならIEGETDATA、

UWSCコバヤシ式 - IEGETDATA
http://canal22.org/kansu/iegetdata/

タグで取得できない、タグの順番が変わるとかなら、提示したサンプルと同様にBetweenStrで対象データの前後の文字から特定とか。


その他、ウィンドウの指定した座標の文字を取得するPOSACC関数とかありますが、こっちは非表示ウィンドウに対しては難しかったかもなので、根本的に見直す必要が出そう。
    • good
    • 0
この回答へのお礼

ありがとうございます。

「UWSC コバヤシ式」を参考にして自力で完成させたのでもう大丈夫です。


> 取得したページ、bodyの内容が確認できれば絞り込み出来そうでしょうか?

もちろん、教えていただいたソースを参考にして、
BetweenStrで対象データの前後から特定してますが、
必要な個所だけピンポイントで取得できず、もう少し広い範囲での取得なってしまいます。
取得した文字列に対して別の関数でさらに加工とかできるんですかね。

もし相談に乗っていただけるなら説明テキストを載せたいと思いますが、
難しいならここは締め切って、新たに質問しようと思います。
よろしくお願いいたします。

お礼日時:2018/07/27 16:16

> もし相談に乗っていただけるなら説明テキストを載せたいと思いますが、



これはやめといた方がいいような。
場合によっては、質問者さんのブラウザで表示されているサイトのbodyの中には、個人情報なんかが含まれる可能性もあります。
単純な氏名以外にも、IPアドレスとか何とか。


そういうのが確認できてるなら、参考URLにこの質問のURLをくっ付けて、新規に質問とかの方が良いかも。

--
> 取得した文字列に対して別の関数でさらに加工とかできるんですかね。

VBAと違うのでクセがある感じですが、機能は充実していると思います。
UWSCのヘルプが見れるなら、スクリプト-文字操作関連が簡潔にまとめられていて、有用な例なんかも付いています。

aとbを連結してcに格納する文字列の連結は、
c = a + b
aから指定した文字の抜き出し(VBAだとMID関数)してcに格納は、
c = COPY(a, 5, 8) // aの5文字目から8文字をcにコピー
aから置換で余計な"<余計>"と"<無駄>"を削除するには、
a = REPLACE(a, "<余計>", "")
a = REPLACE(a, "<無駄>", "")
だとか。
この回答への補足あり
    • good
    • 0
この回答へのお礼

そうですね。

> 場合によっては、質問者さんのブラウザで表示されているサイトのbodyの中には、個人情報なんかが含まれる可能性もあります。
単純な氏名以外にも、IPアドレスとか何とか。

当然です。開発の仕事してますからソースは読めますのでそのまま貼るような真似はしませんのでご安心を。
ですがアドバイス感謝します。

最初の質問から発展する形になりますから新規で質問する事にします。
Replace等参考になりました。
ありがとうございました。

お礼日時:2018/07/27 17:30

> 「2.40GB ~ 2.41GB」に見えますが、実はここが曲者で、


> 「~」この波線が環境依存文字を使っているのです。

あんまり経験ないパターンかも。
mojiって変数に「2.40GB ~ 2.41GB」(環境依存文字含む)が格納されてるとして、いくつか思いつく方法だと、

1)
// 半角文字に変換
moji = STRCONV(moji, SC_HALFWIDTH)

すると、「?」「~」とかの扱いやすい文字になってくれるかも。
(手元の環境で、UNICODEで変な文字入れてみたら、ダメっぽかったですが。)


2)
上の通りに数値の前後に半角空白があるなら、
moji1 = TOKEN(" ", moji) // mojiから空白で区切った1つ目を取り出し
moji2 = TOKEN(" ", moji) // 残ったmojiから空白で区切った1つ目(元々からだと2つ目)を取り出し
moji3 = TOKEN(" ", moji) // 残ったmojiから空白で区切った1つ目(元々からだと3つ目)を取り出し
で、
「2.40GB」
「~」(機種依存文字含む)
「2.41GB」
の3つに区切れます。


あるいは、SPLIT関数使うと一発で配列に格納できます。
Dim dat

dat = SPLIT(moji, " ")
print dat[0] + ", " + dat[2] // 「2.40GB, 2.41GB」ってなるハズ

配列を(区切り文字含めて)結合した文字列を作るJION関数と合わせて、CSVの処理とか簡単です。


3)
Google Maps - 「千代田区一丁目一番地」
https://www.google.co.jp/maps/?q=%E5%8D%83%E4%BB …

のような日本語URLのエンコードを利用して、扱いやすいコードに変換

// UTF-8にエンコード、URLエンコード
moji = ENCODE(ENCODE(moji, CODE_UTF8), CODE_URL)

「2.40GB+%C9%B1+2.41GB」みたいな感じになるハズなので、
上の要領で「+」で区切ったり。
    • good
    • 0
この回答へのお礼

なるほど。こんなに方法があるんですね。
「もう方法は無い」と思い込んではだめですね。。。
3パターンも提示していただきありがとうございました。

お礼日時:2018/07/28 17:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!