Baffaloルータの自動再起動スクリプト

Baffaloのルータはお手頃価格で良いけど、たまに反応が悪くなる。
再起動するとなおるので、自動で再起動させてみようと思った。

まずいろいろ調べてみる。
"cgi-bin/cgi?req=inp&req=waiting_page.html"を呼び出すと再起動&「お待ちください」画面が表示されるが直接呼んでみると、不正だといわれる…。

もう少し調べてみると、再起動ボタンのある"cgi-bin/cgi?req=frm&frm=init.html"というページに隠しフィールドが2つある。
sWebSessionidとsWebSessionnumの2つ。
これらの値はページが呼び出される度に新しくなるので、これを使って不正かのチェックをしているようだ。

■Try 1■
まずはC#で簡単なプログラムを書いてみる。
ページの取得→パースしてsWebSessionidとsWebSessionnumを取得→再起動ページにPOST。

ルータのWebサーバがお行儀悪いので?、「サーバによってプロトコル違反が発生しました。」と例外が発生してしまう。
これはconfigファイルのsettingsに

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <system.net>
  <settings>
   <httpWebRequest useUnsafeHeaderParsing="true" />
  </settings>
 <system.net>
</configuration>

と記述することで回避できるのだけど、C#のバグ?でHttpWebRequestを続けて使うと接続が強制的に閉じられてしまう。
KeepAliveをfalseにしてもだめ、その他いろいろやったけど技術不足で断念。

■Try 2■
じゃあ今度はLinuxからwgetでやってみよう。
ページの取得→sedでsWebSessionidとsWebSessionnumを取得→wgetでページにPOST

POSTする段階で、401 Unauthorisedとでる。--http-userを指定しても、"http://root:*password*@"としてもダメなので断念。

■Try 3■
Windows Scripting Hostでやってみる。
IEオブジェクトを作成→ページ表示→ボタンクリック

Dim myIE
Set myIE = WScript.CreateObject("InternetExplorer.Application")
myIE.Visible = false
myIE.Navigate "http://ルータのアドレス/cgi-bin/cgi?req=frm&frm=init.html"
'本当はここでちゃんとページ読み込みチェックが必要
WScript.Sleep 500

myIE.document.forms(0).elements(0).click()

上手くいった。

なんか、ユーザの操作を真似するにはWSH最強だなあ。