koktoh の雑記帳

気ままに書いていきます

国内のキーボードショップで販売してるスイッチをリスト化した

はじめに

国内のキーボードショップで販売しているスイッチをリスト化して、 Google スプレッドシートにまとめて公開しました

現在、遊舎工房と TALP KEYBOARD のみです(要望があったら足すかもしれないし、足さないかもしれない)

スイッチリスト

こちらです

docs.google.com

0, 6, 12, 18時くらいに更新処理が走るはずです
バコバコアクセスしまくって IP でアクセス制限とかされたら困るので、アクセスするたびに 3 ~ 10分のインターバル設けてるので、実行してから実際に反映されるまで時間がかかります

どうやってるか

こっから先はプログラムとか構成についての話なので、興味ない人は見なくてもいいです

やってることは単純?で、それぞれのスイッチ商品ページをクローリングして、 HTML を解析して、リストにまとめて、スプレッドシートに突っ込んでます
遊舎工房の解析が面倒くさかった……(なので解析は微妙)

実行環境

家に転がってた Raspberry Pi 4 で動かしてます

OS は普通に Raspbian です(Lite ではない)
本当は Lite でやろうと思ってたけど、スプレッドシートへの初回アクセスで認証するとき、ブラウザが立ち上がってログインするようなプログラムになってて、変えるの面倒だったので初回動かす時だけ画面とキーボード繋いで認証しました
1回認証したらもう必要ないので、それ以降はずっとヘッドレスで ssh 接続でやってます

あと、本当は Raspberry Pi Zero W で動かしたかったけど、プログラムのランタイムが対応してなかったのでやめました

定期実行は cron でやってます
dotnet コマンドに PATH が通ってなくて、動かすまでかなり時間かかった……

PATH=/foo/bar/dotnet:$PATH

* * * * * dotnet DotNetApp.dll

こんな感じで PATH 設定したら動くようになった

プログラム

.NET Core 3.1 で書きました
ぜんぜん更新とかしてなかったけど、どうやら 5.0 が出てるっぽいですね、知らなかった
.NET Core は ARM にも対応しているけど、 Raspberry Pi Zero に乗ってるコアには対応してないようでした
いちおう、 mono-framework っていう .NET 対応のフレームワークだと Raspberry Pi Zero で動くらしいけど、 C# 7.0 までしか対応してなくて、 C# 8.0 からできた IAsyncEnumerable<> 使ってたせいで動かせませんでした
あと、 DOM の解析で 70MB 以上メモリ使うから結構きつかったかもしれないですね(512MB メモリ乗ってるらしいけど)(Pi 4 はどんくらい乗ってるか知らん)

使用ライブラリ

AngleSharp は HTML の解析に使ってます
QuerySelector 便利

Utf8Json は JSONリアライザです
コンフィグの読み込みとかで使ってます

あ、あと、スプレッドシートに書き込むための、 Google API のライブラリも使ってます

今はログとか何にも出してないし、エラーハンドリングもなんもしてないので、ちょこちょこ追加していこうかな、と思ってます

おわりに

こんな感じで、思い付きの行き当たりばったりで作りました
迷惑になりそうなら消しますので、ご連絡ください