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

ある業務システムのページ(https://)
業務で使用するCSVファイルダウンロードのリンクが20個ほど列挙されています。
(しかしURLは、・・・/abcd.csv ではなく、/スラッシュで終わってますが、クリックするとcsvが自動的にDLされる)

普段のルーチン作業で使うのは、この中のある6つのファイルだけなので、
選びやすく誤クリックを防ぐため、対象のリンクだけに絞ったHTMLをローカルに保存して使用しています。
そのやり方は、本物のサイトを「名前を付けてページを保存」でHTML(完全)でローカルに保存し、
HTMLを編集しました。

手順としては、一度本番サイトにログインをしておいてから、
デスクトップにおいてあるHTMLファイルを開き、6つのリンクを上から順番にクリックすると、
ダウロードフォルダにcsvが落ちてくる仕組みにしています。

この作業をもっと楽にするためにお知恵を貸してください。
・たとえば1ボタンをクリックするだけで6つともDLできるとか
・ログイン情報もHTMLに入れておいてログインも自動にするとか

このシステムはPassの保存ができなくなっているため、
一度入力したIDはプルダウンから選択できますが、Passは毎回手入力しなければいけません。
事前にログインしておかずにローカルHTMLからリンクをクリックすると、新しいタブにログイン画面が表示されるようになっています。

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

  • HAPPY

    本件に関しては自己解決しました。
    参考までに方法を載せておきます。

    <a href="#" onClick="window.open('URL1');window.open('URL2');window.open('URL3');return false;">すべてダウンロード</a>

    上記の「URL」のところに指定しておけば、1回リンクをクリックするだけでいくつでもDLできました。
    恐らく最初ポップアップブロックされると思うので解除すれば次回からOKです。


    DLしたCSVは1つのエクセルの各シートに取り込む作業があるのですが、
    エクセル側で自動的に上記処理をさせるにはどうしたら良いかアドバイスいただけると助かります。

      補足日時:2018/11/21 11:42

A 回答 (11件中1~10件)

>No.10 回答者: amanojaku6



そのページがクライアント(自分のPCのHDD)にある場合、正常に動作しません。
そのページをサーバー上にアップして下さい。
    • good
    • 0

このスクリプトはポップアップしません。



ブラウザは必ずChromeにして下さい。
ファイルをダウンロード可能です(サーバーからMimeTypeを取得しているので、大抵のファイル拡張子なら問題でしょう)。
リンクをクリックする必要はありません。
ファイルの設定はDownloadFileList = ["images008.jpg", "images009.jpg", "images010.jpg"]です、この「"images008.jpg", "images009.jpg", "images010.jpg"」を変更して下さい。
一気に複数のファイルをダウンロードするので、ファイル・サイズが大きいと問題が発生するかもしれません。



<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
<title>Sample</title>
</head>
<body>

<script type='text/javascript'>

// ブラウザは必ずChromeにして下さい。
// 一気に複数のファイルをダウンロードするので、ファイル・サイズが大きいと問題が発生するかもしれません。

DownloadFileList = ["images008.jpg", "images009.jpg", "images010.jpg"];

FileDownload = function(DownloadFile) {
this.DownloadFile = DownloadFile;
};
FileDownload.prototype.DownloadAnchorClick = function() {
this.DownloadAnchor.click();
};
FileDownload.prototype.CreateDownloadNoneTag = function() {
this.DownloadAnchor = document.createElement("a");
this.DownloadAnchor.style.display = 'none';
document.body.appendChild(this.DownloadAnchor);
this.DownloadAnchor.href = 'JavaScript:;';
this.DownloadAnchor.download = this.DownloadFile;
this.DownloadAnchor.onclick = this.FDownload();
};
FileDownload.prototype.FLoad = function(url) {
let content;
this.DownloadHttpReq = new XMLHttpRequest();
this.DownloadHttpReq.open( "GET", url, false );
this.DownloadHttpReq.overrideMimeType('text\/plain; charset=x-user-defined');
// MIME タイプを上書きしてブラウザーに強制的に、ユーザー定義の文字セットを使用したプレインテキストとして扱わせます。
// これにより、ブラウザーはこれを解釈せず、未処理のままバイト列を通します。
this.DownloadHttpReq.send(null);
content = this.DownloadHttpReq.responseText;
if( this.DownloadHttpReq.status==200 ) this.DownloadMimeType = this.DownloadHttpReq.getResponseHeader('content-type');
else content = null;
return content;
};
FileDownload.prototype.FDownload= function() {
let BinaryArray = StringToBinaryArray(this.FLoad(this.DownloadFile));
let blob = new Blob([BinaryArray], {type: this.DownloadMimeType});
if (window.navigator.msSaveBlob) {
window.navigator.msSaveBlob(blob, this.DownloadFile);
// msSaveOrOpenBlobの場合はファイルを保存せずに開ける
window.navigator.msSaveOrOpenBlob(blob, this.DownloadFile);
} else {
this.DownloadAnchor.href = window.URL.createObjectURL(blob);
}
}

FileDownloadObjList = new Array(DownloadFileList.length);
for( let i = 0; i<FileDownloadObjList.length; i++ ){
FileDownloadObjList[i] = new FileDownload(DownloadFileList[i]);
FileDownloadObjList[i].CreateDownloadNoneTag();
FileDownloadObjList[i].DownloadAnchorClick();
}

function StringToBinaryArray(s) {
let buf = new ArrayBuffer(s.length);
let BinaryInterface = new Uint8Array(buf);
for (let i=0; i<s.length; i++) {
BinaryInterface[i] = s.charCodeAt(i);
}
return buf;
}

</script>

</body>
</html>
    • good
    • 0

> あとはダウンロードまでVBAで行えるかなのですが、


> DL.html を開いて、補足に記載している「すべてダウンロード」をクリックさせるのをVBAでで
> きないでしょうか?
> もちろん方法が変わっても構いません。

これは【基本的には】出来ないと考えてください。
なぜならこれは、ダウンロードに限ってのみVBAから操作しようとしているからです。

理由や対応方法は後述しますが、回答を書いている最中に状況を鑑みて、なんか出来そうな気がしてきました。
もしかして、ログインしていなくてもダウンロードできるほどザルなのでは?と思って。

試しにVBAで新規ブラウザを操作し、『すべてダウンロード』のページにナビゲーションさせ、DOM操作でリンククリックさせてみてください。
以下ページなどを参考に。
https://vba-code.net/ie/click-a-link/

正規ルートでログインしていても、ログインしていないとみなされてうまくいかないなら、後述する案1、案2などの方法を取らなければ実現することはできません。



以下、技術的な知見や対応案です。

ダウンロードの方法が今の方法でうまく言っているのは、恐らく『同じブラウザ内』で操作しているからです。
セッションという概念のもとに、同じアプリケーションからの一連のアクセスだと認識しているから実施可能となっています。
(まぁ、名前を付けて保存したようなローカルページからいじれるなんてのはセキュリティ的にはNGなシステムですが)

ローカルページを操作するタイミングで別なアプリケーション(VBA)から操作しようとすると、それは元のログインしたアプリケーションとは別セッション扱いになり、ログインしていないとみなされ、恐らく希望する動作を行うことができません。
(できるようだったらやってしまえばいいです!システムの穴を突く形になりますが)

そのため、VBAから制御するには【基本的には】以下の2パターンが考えられます。

【案1】
起動済みのブラウザの対象ページを捕捉し、DOM操作によってボタンを押させる。
以下を参考に。
https://www.vba-ie.net/ie/iefind.php#a9
https://vba-code.net/ie/

ただ、捕捉に関しては、ブラウザはタブという概念があります。
そのため、プロセス名『iexplorer.exe』、名前『Internet Explorer』というものは
複数存在する可能性がありますので、自力で走査しなければなりません。
または、求めているページが必ず表示されているとは限りません。

まずはIE自体を捕捉し、その後、ローカルページにナビゲーションさせて、DOM操作をする、という手順がいいかもしれません。
が、これも、VBAで制御中に、人間が、例えばIEを閉じたり、ページ遷移させたりすると正しく動作しませんので、それを理解した上での話になります。

この方法は、運用する手順の入口から出口までが一本化されていないので、複雑化する傾向が出ます。

【案2】
先に記したセッションの関係上、VBAでログインからダウンロードまですべてを行う。
VBAから新たにブラウザをバックグラウンドで起動させ、VBAで全部処理させる形です。
手抜きすることなく、VBAで全部頑張るということですね。
しかしこれも、VBAで制御中に、手動で、ブラウザのプロセスを終了させると正しく完了できませんので、それも理解した上での話になります。


何でもかんでも自動化を望み始めると、恐らくどれもハードルが高くなりますので、
やれるならやればいいですけど、どこかで妥協することも必要になるかもしれませんね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
じっくり読みながら確認していきます。

お礼日時:2018/11/29 15:29

ブラウザ(JavaScript)で複数のファイルを一括ダウンロードさせる


https://symfoware.blog.fc2.com/blog-entry-1978.h …
    • good
    • 0
この回答へのお礼

補足に書いた方法で一括DLが実現したのですが、Javascriptでやる事の優位性を教えていただけると幸いです。

お礼日時:2018/11/26 11:01

> 「エクセル側で自動的に上記処理をさせるには」と申し上げております。


Excel側で操作することはヨシなわけですね。

であれば、
Sample.xlsx
Sample1.csv
Sample2.csv
Sample3.csv
というファイルをすべて同一ディレクトリ配下に設置するというルールを設け、
Sample.xlsxで、各CSVを取り込んでください。
データ → テキストファイル から取り込めます。

その後は、CSVファイルだけを差し替え、
データ → すべて更新
を押下すれば、勝手に同期します。

なお、
データ → すべて更新(▼部分をクリック) → 接続のプロパティ で
『更新時にファイル名を確認』というチェックを外せば、いちいちファイルの選択を求められません。
    • good
    • 0
この回答へのお礼

ありがとうございます。この方法で要望を満たせます。
VBAで「全て更新」の実行もできました。

あとはダウンロードまでVBAで行えるかなのですが、
DL.html を開いて、補足に記載している「すべてダウンロード」をクリックさせるのをVBAでできないでしょうか?
もちろん方法が変わっても構いません。

お礼日時:2018/11/26 11:04

> DLしたCSVは1つのエクセルの各シートに取り込む作業があるのですが、


> エクセル側で自動的に上記処理をさせるにはどうしたら良いかアドバイスいただけると助かります。

ブラウザからExcelは操作できません。
最終的なアウトプットがExcelならば、最初から全部VBAでやった方がいいかと思います。
    • good
    • 0
この回答へのお礼

ブラウザからExcelの操作はできない事は承知の上での質問です。
「エクセル側で自動的に上記処理をさせるには」と申し上げております。

お礼日時:2018/11/22 16:10

No4です



>試そうとしましたが、URLを貼るとログイン画面になってしまい
No4にも記しましたが、URL指定だけで取得できない場合は単純にはいかないですね。
サイトの仕組みにもよるので、成功している方法で行うのが宜しいかと。

もしも、DL後にVBAで読み込むのであれば、No3の方法で連続して処理するようにしてしまえば、方法はともかく、直接読み込んでいるような感じに見えるのではないでしょうか?
    • good
    • 0

No3です



>DLしたCSVは1つのエクセルの各シートに取り込む作業があるのですが、
URL指定だけで読み取れるようなものでしたら、エクセルのWEBクエリを利用すれば、いちいちCSVファイル経由でなんてことを意識しなくても良くなりそうな気がしますが?
    • good
    • 0
この回答へのお礼

すみません。
言ってる意味が理解できませんでした。

実際にWEBクエリで試そうとしましたが、URLを貼るとログイン画面になってしまい、
ログインすると、ファイルを開くか保存するかというダイアログが出るので何をしたら良いか分かりませんでした。

お礼日時:2018/11/21 13:05

こんにちは



通常のHTMLやスクリプトの仕組みではちょっと無理っぽいので、別の角度からの回答です。
要は、『手間を省きたい』という主旨のようですので、操作をそのまま自動化するという考え方でのアプローチです。

対象サイトの構造や処理の仕組みによってはうまくいかない場合もありますが、基本的な操作の自動化に関しては以下の辺りを組み合せれることで実現可能と思いますのでご参考までに。

なお、以下のサイトの内容は吟味していません。あくまで参考としての列挙です。
検索すれば数多くの説明サイトが見つかると思いますので他のサイトもご覧ください。
ヒットしたものの内容がVBAのものが多いですが、別にVBAにこだわる必要もなく、VBその他でもよろしいかと思います。

<ログイン>
https://tonari-it.com/vba-ie-login/
https://qiita.com/salmonosushi/items/9ce79759de6 …

<クリック>
http://www.fastclassinfo.com/entry/vba_ie_links_ …
https://vba-code.net/ie/click-a-button/
    • good
    • 0

ctrl+a 右クリック保存

    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A