読者です 読者をやめる 読者になる 読者になる

Lazuli

らずり

Wifiパスワードの更新を自動化して解決した話

背景

ある日、会社の Wifi パスワードを定期的に変更しようという方針になった。まあその方針の是非は思うところがあるけど今回はとりあえず置いておいて、とどのつまりそのパスワード設定の担当が俺になってしまった。
このパスワードの設定がとにかく面倒くさい。定期的にブラウザでルータの管理画面に入ってフォームに新しいパスワードを入れなきゃならない。ちまちま手でやるのも面倒だし、勤務時間中にやると他の人たちに迷惑が掛かって面倒くさい(パス変わって Wifi が繋がらなくなる)。
それならば自動化だ。

Selenium WebDriver と WebDriverIO

色々調べた結果、 Selenium WebDriver というツールを使うと解決出来そうだということが分かった。Selenium WebDriver は Javascript のブラウザテストをするためのツールで、 Json Wire Protocol というプロトコルを介してブラウザを操作することが出来る。これを利用して wifi パスワード設定のフォームを操作する。
そうこうしてたら、 まだmechanizeで消耗してるの? WebDriverで銀行をスクレイピング(ProtractorとWebdriverIOを例に) - 詩と創作・思索のひろば (Poetry, Writing and Contemplation) というエントリをタイムリーに見かけて ProtractorWebDriverIO という NodeJS ライブラリを知った。ありがたい。
AngularJS は別にいいから WebDriverIO のほうを今回は使うことにした。API 見る限り、シンプルな感じで簡単に扱えそうだったのも好印象だった。

実装

実際に作ったやつのモック的なのはここにある。
ちなみに今回いじっているのは ASUSRT-AC68U というルータ。

app2641/WifiPassUpdater · GitHub

data/config.json 内に設定を記述して、実行すると Wifi パスワードを更新するようになっている。
Selenium 起動のコードは先ほどのエントリから借りさせてもらってます。ここ

$ touch data/config.json
{
    "url": "your_wifi_router_address",
    "user": "basic_authentication_username",
    "pass": "basic_authentication_password",
    "wifi_pass": "new_wifi_pass"
}
$ npm run update-wifi-pass

これだけ。あとは Jenkins かなんかで夜中に動かすジョブとして組んどけば自動で更新してくれる。
まあ新しいパスワード決めるのは手動でやらなければならないがだいぶ楽になった。そっちは適当なフォーム画面作って json に吐き出すようにすればいいかなと思う。