ルーターにアクセスするのって、あまり機会はないかもしれません。ただ、うちのルーターがかなりオンボロなので調子が悪くなってきたときにリブート(reboot)することが、まあまああったりします。なので、リブートをプログラミングでできないものか調べてみたみたところ、ユーザー名とパスワードの部分にはBasic認証が使われている様子。これならHSPでもうまくアクセスできそうだなと思った次第です。まあ、元々ブラウザでアドレスを打ち込んでアクセスするのだからwebの技術と同じでも不思議はないですよね。
Basic認証とは
セキュリティの基本として、IDとパスワードを入力するページは多々存在していると思います。ユーザー側からすると入力する者は同じなので意識することはあまりないかもしれませんが、中でも多いのはBasic認証とよばれるものではないでしょうか。
Basic認証(ベーシックにんしょう、Basic Authentication)とは、HTTPで定義される認証方式の一つ。基本認証と呼ばれることも。
Basic認証では、ユーザ名とパスワードの組みをコロン “:” でつなぎ、Base64でエンコードして送信する。このため、盗聴や改竄が簡単であるという欠点を持つが、ほぼ全てのWebサーバおよびブラウザで対応しているため、広く使われている。
引用元(Basic認証 – Wikipedia)
つまり、コード上で
ユーザー名:パスワード
をBase64でエンコードすればよさそうですね。
HSPでのBase64エンコード
HSPでのBase64エンコードを調べてみましょう。
b64encode p1,p2,p3
p1 : BASE64変換された文字列が代入される変数名
p2 : 変換元データを持つ変数名
p3(-1) : バッファサイズ
パラメータのp3は省略可能なので、p2に先ほどの「ユーザー名:パスワード」を入れてあげれば簡単にBase64エンコードできちゃいそうですね。
Basic認証のリクエスト
HSPで認証のリクエストをするには、netrheaderの命令を使えばよさそうです。
netheader “HeaderString”
“HeaderString” : ヘッダに追加される文字列
HeaderStringの部分にはさきほどエンコードしたユーザー名とパスワード、その前に「Authorization: Basic 」をつけてあげましょう。これでベーシック認証のユーザー名とパスワードをリクエストすることができます。コードで書いてみると
username = "ユーザー名" password = "パスワード" encode_text = username + ":" + password b64encode encode_result, encode_text netheader "Authorization: Basic " + encode_result + "\n\n"
という感じでしょうか。netheaderの文末の\n\nはhspのリファレンスに解説がなかったのですが、例に書かれていたので付け加えてます。phpなどでも改行をふたつ繋げて記述しているので、ヘッダーリクエストには必要なものだと思われます。
ネットの接続確認など
残りは初期設定やネットの接続確認などを書いていきましょう。下の記事の中ほど(htmlダウンロードのスクリプトを書く)あたりにも書いてあったりします。
まず、通信をする為には、hspinetをインクルード。そして、netinitでネット接続の確認とエラー時の対応部分のスクリプトを記述します。
#include "hspinet.as" // ネット接続の確認 netinit if stat : dialog "ネット接続できません" : end
次に各種設定。ルーターに接続するためのアドレスを記述します。だいたいは192.168.0.1とかそんな数字(IPアドレス)だとは思いますが、ちゃんと購入した際の説明書やルーター本体に貼ってある情報などをみてアドレスを確認しましょう。他にダウンロードした際のファイル名も用意します。
//ルーターのurl設定 URL = "http://192.168.0.1/" //ダウンロードファイル名 netdlname "index.html"
さらに、ダウンロード実行中のエラー判定、エラー時の処理、ダウンロード成功時のメッセージ表示をさせます。
*main //取得待ち確認 netexec res if res > 0 : goto *comp if res < 0 : goto *bad await 50 goto *main *bad //エラー neterror estr mes "ERROR "+estr stop *comp mes "DOWNLOAD 完了" stop
この辺りのスクリプトは、HSPをインストールした際に梱包されているsampleにほぼそのまんま(一部URLが違いますが)載っているので、それを流用させていただいてます。
これでほぼ準備は完了しました。あとはコードを組み合わせて実行できるように整えていきます。
完成したコード
#include "hspinet.as" // ネット接続の確認 netinit if stat : dialog "ネット接続できません" : end //ルーターのurl設定 URL = "http://192.168.0.1/" //ダウンロードファイル名 netdlname "index.html" //Basic認証設定 username = "ユーザー名" password = "パスワード" //Base64エンコードとヘッダーリクエスト encode_text = username + ":" + password b64encode encode_result, encode_text netheader "Authorization: Basic " + encode_result + "\n\n" //リクエスト開始 netrequest URL *main //取得待ち確認 netexec res if res > 0 : goto *comp if res < 0 : goto *bad await 50 goto *main *bad //エラー neterror estr mes "ERROR "+estr stop *comp mes "DOWNLOAD 完了" stop
実際には見やすくするようにBasic認証設定とBase64エンコードとヘッダーリクエスト、リクエスト開始を分けて追加しました。これでルーターにアクセスした際の初期画面がダウンロードされます。つまり、アクセス成功というわけです。
まとめ(リブートに向けて)
今回はアクセスまで(Basic認証)について書いてみました。この先、本来の目的であるリブートに進むには、実際にリブートさせるためのurlやパラメータを調べる必要があります。基本的にはリブートするボタンが表示されているページを解析してみれば、必要なパラメータなどが見つかると思います。ルーターによっては確認画面が出たりするものもある可能性があるので、そのあたりの処理なども考えなければいけませんが、そこまで進めればあと一歩です。是非、トライしてみてください。
また、Basic認証の必要なページへのアクセスならルーターではなくても、今回の方法が使えます。参考になれば幸いです!