🤖

SMS認証コードをラズパイでSlackに転送してみた

2023/04/26に公開

1. はじめに

複数人で使用する共通アカウントのSMS認証にて、認証コードが特定の1台の携帯にしか送信されないことによる不便さを解決するためのボットを作成しました。SIM付きRaspberry Pi(ラズパイ)にて認証コードを受信しSlackに転送することで、共通アカウントを使用する全員に認証コードを通知することができます。ここでは認証コードを転送するラズパイをSMS転送ボットと呼び、SMS転送ボットのプログラムをGitHubに公開し、SMS転送ボットの設定方法を説明します。

2. デモ

SMS認証が必要なクラウドにログインし、認証コードをSlackで受信してる様子です。

3. 全体概要

3.1. システム構成

3.2. システム構築手順

  1. Slackの設定
    1. アプリの作成
    2. チャネルの作成
      ※Slackの詳細な設定方法はGitHub参照
  2. ラズパイの設定
    1. ラズパイをWi-Fiまたは有線LANでインターネットに接続
    2. GitHubからソースコードのインストール
    3. ライブラリ関連のインストール
    4. SMS転送ボットの設定
    5. USBドングルの設定
      ※Raspberry Piの詳細な設定方法はGitHub参照
  3. 動作確認
    1. SIMの電話番号にSMSを送信
    2. 設定したSlackのチャンネルに転送されることを確認

4. ハードウェア構成

SMS転送ボットのハードウェア構成は以下の通りです。

  • Raspberry Pi 4 Model B Rev 1.4
  • AKA-020(USBドングル)

5. ソフトウェア構成

SMS転送ボット(Raspberry Pi内)のソフトウェア構成は以下の通りです。

6. 処理概要

  1. pythonのpyserialを用い、ATコマンドを発行し定期的にSIMに対しSMSの取得を行う
  2. 取得したメッセージをデコード
  3. ブラックリストからslackに転送するか判断
  4. 転送用のメッセージ作成
  5. slack-sdkを用いてslackにメッセージ送信

7. 苦労した点😱

7.1. SMSメッセージの構造解析

普段スマホでSMSを使ってるだけだと、意識しないですがただの文字ではなくPDU Formatとかいう形式でSMSは送らてくるんですね。今回このボットを作るにあたってこのFormatを解析(デコード)する必要がありましたが、まあ日本語の文章が見つからず、結局3GPPのドキュメントを読むはめになりました。
SMSはGSM 03.38という7bit文字を使用しているらしく、この文字のデコードも苦労しました。
長文のメッセージの場合は、メッセージが分割されて送られてくるので、それを結合する処理も必要でした。

7.2. SMSメッセージの削除

ボットの作成をしている途中に急にSMSが受信できなくなる事態が発生しました。どうやらSMSメッセージを削除しないでいると、(容量いっぱいで?)SMSの受信ができなくなるみたいです。なのでSlackに転送したメッセージは削除するようにしました。3GPPのドキュメントにメッセージ削除しろとかの記載があるのかもしれません。それともSIMの仕様でしょうか?

8. ソースコード

https://github.com/SystemzeusInc/SMSForwardingBot

9. おわりに

半年ぐらい運用していますが、特に問題なく動いています。

免責事項

作者または著作権者は、契約行為、不法行為、またはそれ以外であろうと、ソフトウェアに起因または関連し、あるいはソフトウェアの使用またはその他の扱いによって生じる一切の請求、損害、その他の義務について何らの責任も負わないものとします。

株式会社システムゼウス

Discussion