読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

コマンドプロンプトを,Webブラウザとして使おう (WSH・JScriptでXmlHttpRequest)

コマンドプロンプト ネットワーク ブラウザ WSH/JScript


コマンドプロンプトを,Webブラウザとして使う。


バッチファイルから

  • WebサイトにGETリクエストを発行し,
  • Webサイトが返すレスポンスに,最低限の「レンダリング」を施す。

という事を行なう。



(1)バッチでWebサイトと通信する第一歩

まずは,インターネット上のサイトから,単純にHTMLソースをそのまま取得してみる。


下記のコードをyahoo.jsとして保存し,ダブルクリックするだけ。

// 非同期通信
var xhr = WScript.CreateObject("MSXML2.XMLHTTP");
xhr.open("GET", "http://www.yahoo.co.jp/");
xhr.send();
while( true )
{
	WScript.Sleep(100);
	if( xhr.readystate == 4 )
	{
		// HTMLを表示
		WScript.Echo( xhr.responseText );
		WScript.Quit();
	}
}

数秒〜10秒程スリープしたのち,ダイアログボックスに,Yahoo! JapanのHTMLソースが表示される。

もちろん,コマンドプロンプト上からも実行できる。


これだけでも様々な用途に役立つが,もっと見やすく加工してみよう。

(2)最低限の「レンダリング」を試みてみよう

上述のバッチを

  • 任意のURLを処理対象にできるように
  • HTMLではなく,「読みやすいテキスト」として見せたい

という2点だけ変更。

var target_url = WScript.Arguments.Unnamed(0);

var page_txt = get_page_txt( target_url );
WScript.Echo( page_txt );

WScript.Quit();


// ---------- 関数 ----------

function get_page_txt( target_url )
{
	var xhr = WScript.CreateObject("MSXML2.XMLHTTP");
	xhr.open("GET", target_url);
	xhr.send();
	while( true )
	{
		WScript.Sleep(100);
		if( xhr.readystate == 4 )
		{
			var s = xhr.responseText
				.replace( / /gi, " " )
				.replace( /&lt;/gi, "<" )
				.replace( /&gt;/gi, ">" )
				.replace( /&quot;/gi, "'" )
			;
			
			// 主要タグ除去
			s = s
				.replace(/<head.*?>((\n|\r|.)*?)<\/head>/i, "")
				.replace(/<script.*?>((\n|\r|.)*?)<\/script>/gi, "")
				.replace(/<style.*?>((\n|\r|.)*?)<\/style>/gi, "")
			;
			
			// 行別に加工
			var arr = s.split(/(\r\n|\n)/);
			for( var i = 0; i < arr.length; i ++ )
			{
				var line_old = arr[i];
				var line_new = line_old
					.replace( /<br *\/?>/gi, "\r\n" )
					.replace( /<[^>]+>/g, "" )
					.replace( /^[  \t]*/g, "" )
				;
				arr[i] = line_new;
			}
			
			// トリム
			for( var i = arr.length - 1; i >= 0; i -- )
			{
				var line = arr[i];
				if( line.length == 0 || line.match( /^[  \t\r\n]*$/ ) )
				{
					arr.splice( i, 1 );
				}
			}
			
			s = arr.join("\r\n");
			
			return s;
		}
	}

}


これを browse.js として保存。

コマンドプロンプトから

cscript //nologo browse.js "http://www.google.co.jp/webhp?hl=ja"

とかすると

ウェブ 画像 動画 地図 ニュース 書籍 Gmail その他 &#9660;翻訳 ブログ YouTube カレ
ンダー 写真 ドキュメント リーダー サイト グループ サービス一覧 &raquo; iGoogle |
 検索設定 | ログイン インターネットをもっと快適に。Google Chromeをインストールし
よう日本
 検索オプション言語ツール
Googleをホームページに設定する広告掲載Google についてGoogle.com in English&copy;
 2010 - プライバシー 背景画像を変更

と表示される。


また,

cscript //nologo browse.js "http://d.hatena.ne.jp/language_and_engineering/" | more

とかやると,

ようこそゲストさん
ブログトップ
記事一覧
ログイン無料ブログ開設
主に言語とシステム開発に関して
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
2010-08-04
コマンドプロンプトから,Win32 APIや任意のDLLを呼び出して実行しよう (コマンドプ
ロンプトから画面キャプチャする方法の仕組みを理解)                      Win32,
コマンドプロンプト, vbscript, VBA |
Windowsのコマンドプロンプト上で,Win32 APIなどのDLLを呼び出して実行する。
例えば,コマンドプロンプトだけで,任意のキー操作イベントをエミュレートできる。
サンプルコマンド:
コマンドプロンプトから,画面をキャプチャする。(PrintScreenキーの押下をエミュレ
ート)
mshta vbscript:execute('Set a=CreateObject(''Excel.Application''):a.ExecuteExcel
4Macro(''CALL(''''user32'''',''''keybd_event'''',''''JJJJJ'''',44,0,1,0)''):a.Ex
ecuteExcel4Macro(''CALL(''''user32'''',''''keybd_event'''',''''JJJJJ'''',44,0,2,
0)''):close()')
これを実行すると,クリップボードに画面のハードコピーが格納される。*1
(ペイントなどに貼り付けして確認してみるとよい)
もちろん,batファイルから実行する事も可能。
以下では,このコマンドの動作原理を説明。
(1)VBAからDLLを呼び出す:事前の宣言有りの場合
(2)VBAからDLLを呼び出す:事前の宣言なしの場合
(3)VBAのCALL関数を,WSHやコマンドプロンプトから呼び出す
続きを読む
 *1:Excelがインストールされている必要がある。
-- More  --

のようにページング付きで表示される。


まあ何とか読める。お手製のCUIブラウザ。