WSH(JScript)にて alert() 感覚で LINE通知できるようにする。そして CPU使用率が10%以下になったら通知するスクリプト。

個人的な感覚ですが「すぐ来る」「確実に来る」「手軽に来る」のイメージがあるメッセージングサービス「LINE」を利用し、Windowsスクリプト作業中にお手軽通知できるようにすることが目的です。

## **サービス利用登録 -> アクセストークン発行**

公式で以下のサービスが提供されているので、そこから利用登録します。（面倒ですが、一回登録してしまえば流用できますので・・）

**LINE Notify**
https://notify-bot.line.me/ja/
自分のLINEを持っている場合はこちらから「LINE Businessアカウント登録」及び「LINE Notifyの登録」を行います。「LINE Business」といっても、「個人的な開発」において費用はかからないようです。イメージとしては

 - 個人組織として登録できる。
 - 各々のアカウントは「自分のLINE」とは別個に作成される。「自分のLINE」は作成されたアカウントの「開発者」として通知先に紐づけられる。
 - 通知可能な人数(50人まで)等、制限はあるが、「Developer Trial」というプランであれば、無料で利用できる。
 
といった感じです。

要するに…　こちらで欲しい情報は、**「LINE Notify のアクセストークン」**ただ一つ。

## **利用イメージとスクリプト**

利用イメージは…

```js:

alert_line("メッセージ");

```

こんな感じで呼び出すと、LINEに通知ができます。JavaScriptのalert()と同じ感覚なので、スクリプト作業に対して、手軽に差し込んだりすることができます。

とりあえず、**「パソコンのCPU使用率が10%以下になったら、LINE通知する」**スクリプトを作ってみました。
以下２ファイルを作成してis_ready.wshを実行します。**【LINE Notify のアクセストークン】**は自分のものに差し替えてください。メッセージがマルチバイトの場合はSJISで保存してください。

```html:is_ready.wsh
<job>
<script language="JavaScript">
    // Settings
    var line_access_token = "【LINE Notify のアクセストークン】";
</script>
<script language="JavaScript" src="inc.js"></script>
<script language="JavaScript">
    // Main

    while(cpu() > 10){
    	WScript.Sleep(5);
    }

    alert_line("システムが安定しました。");

</script>
</job>
```


```JavaScript:inc.js
var ws = new ActiveXObject( "WScript.Shell" );
var fso = new ActiveXObject("Scripting.FileSystemObject");

//https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON
var JSON={parse:function(sJSON){return eval("("+sJSON+")")},stringify:function(){var a=Object.prototype.toString,b=Array.isArray||function(b){return"[object Array]"===a.call(b)},c={'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t"},d=function(a){return c[a]||"\\u"+(a.charCodeAt(0)+65536).toString(16).substr(1)},e=/[\\"\u0000-\u001F\u2028\u2029]/g;return function c(f){if(null==f)return"null";if("number"==typeof f)return isFinite(f)?f.toString():"null";if("boolean"==typeof f)return f.toString();if("object"==typeof f){if("function"==typeof f.toJSON)return c(f.toJSON());if(b(f)){for(var g="[",h=0;h<f.length;h++)g+=(h?", ":"")+c(f[h]);return g+"]"}if("[object Object]"===a.call(f)){var i=[];for(var j in f)f.hasOwnProperty(j)&&i.push(c(j)+": "+c(f[j]));return"{"+i.join(", ")+"}"}}return'"'+f.toString().replace(e,d)+'"'}}()};
var alert=function(a){WScript.Echo(a);};
var dd=function(str){ alert(JSON.stringify(str)); };

//CPU check
function cpu(){

	var proc = new Enumerator(GetObject("WinMgmts:Root\\Cimv2").ExecQuery(
			"Select * From Win32_Processor "));
	var cmdln = '';
	for (; !proc.atEnd(); proc.moveNext()) {
		var item = proc.item();
        return item.LoadPercentage;
	}
	
}

//LINE alert
function alert_line(msg){

	try {
		var http = new ActiveXObject("Msxml2.ServerXMLHTTP");
		http.open("POST", "https://notify-api.line.me/api/notify", false);
		//if client cert error
		//http.setOption(2, 13056);
		http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		http.setRequestHeader("Authorization","Bearer " + line_access_token);
		http.send("message=" + msg);
	} catch (e) {
		alert("Error(" + (e.number & 0xFFFF) + "):" + e.message);
	}

}
```
※ 使用率を確認するCPUはとりあえず１つ目だけピックアップしています。現状、見ての通り5秒おきにCPU確認しているだけなので、平均値等を用いたい場合は必要に応じて書き換えることになります。
※ セキュリティソフトが意図せず実行を遮断している場合があります。自身のセキュリティポリシーに合わせて設定してください。