Go言語で無線局情報を取得するAPIのクライアントライブラリを書いた

概要

この記事は、Go3 Advent Calendar 2019 の22日目の記事です。 21日目は@mikkegtさんによる「qiita.com」でした。

私は、アマチュア無線を行うサークルに属しているため、無線局の情報を調べることが多くあります。1局や2局なら手で調べてもよいが数が多くなってくると面倒極まりありません。数が多くなってくると、やはりプログラムの力を借りる必要があります。 幸いにも日本の無線局情報は総務省APIを提供しているため、APIを叩けば情報を取得できます。そこで、毎回APIのリクエストを組み立てるのは面倒なので、Go言語の練習を兼ねてクライアントライブラリを作成することにしました。

できたものは次のリポジトリで公開しています。

github.com

cli, err := soumu.NewClient("")
if err != nil {
    os.Exit(1)
}

opts := soumu.NewNumOptions(soumu.License, soumu.Amateur)
result, err := cli.GetNum(nil, opts)
if err != nil {
    os.Exit(1)
}

fmt.Printf("%+v", *result)
// ↓の感じで無線局の登録件数が取得できます。
// -> {Musen:{Count:404542} MusenInformation:{TotalCount:404542 LastUpdateDate:2019-11-03}}

APIの仕様は総務省のウェブサイト内で公開されています。

総務省 電波利用ホームページ|免許関係|Web-API機能(無線局等情報検索)について

APIクライアントの作り方は、 GolangでAPI Clientを実装する | SOTAを参考にしました。 APIのクライアントの部分については、ほぼ上のとおりになっています。

デバッグ用のロガーについては、logger.goで宣言をしており、仕様する側でSetLogger()で自前のLoggerを指定するか、DebugEnable()でロガーを有効化してログを出力できるようにしています。

また、APIから取得できるJSONデータではタブ文字や改行がそれぞれ\tや\nとしてエスケープされていたり、周波数の表記がMHz、HzやkHzが混在しており扱いにくいので、そのためのヘルパー関数を作っていこうと思っています。 周波数と電波形式のリストは、オブジェクトの配列とかで表す仕様にしてほしかった....

また、作成したAPIクライアントの使い方が簡単にわかるようにexampleディレクトリに使用例としていくつか簡単な実際に動くソースコードを置いています。 また、READMEにもざっくりとした使い方を書いています。 exampleディレクトリにあるサンプルコードとREADMEを参考にすれば使用方法はわかるようになっていると思います。

Go言語でコマンドラインツールを作成したことはありましたが、packageの実装はしたことがなかったため非常に勉強になりました。

References