Wi-Fiに繋がらないAmazon Dash Buttonを復旧させて出勤ダッシュボタンを作る。

勤務先では勤怠管理に[ジョブカン](https://jobcan.ne.jp/)を使用しています。今まではICカードによる打刻のみ許可されていたのですが、在宅勤務になったおかげ（？）で、Web画面による打刻と、Slackからの打刻が認められるようになりました。やったぜ。
出退勤するたびにSlack書いたり打刻画面を開くのが最高に面倒というか、そういう作業がめちゃくちゃ嫌いなので、Wi-FiにつながらなくなったAmazon Dash Buttonを復旧して、出退勤ダッシュボタンにしました。
それにしてもジョブカンって色々打刻方法があるんですね。
[打刻方法一覧 – ヘルプ｜勤怠管理（ジョブカン）](https://jobcan.zendesk.com/hc/ja/articles/115000103421-%E6%89%93%E5%88%BB%E6%96%B9%E6%B3%95%E4%B8%80%E8%A6%A7)

## Amazon Dash Buttonの復旧
Amazon Dash Buttonはサービスが終了して、AmazonショッピングアプリからのWi-Fiセットアップが不可となっています。
調べてみると、私の持っているダッシュボタンはアプリなしでWi-Fi設定が可能なようです。
自分の持っているジャンクが復旧可能かを判断する目的で、よくメルカリとヤフオクを検索するのですが、今回はその検索に引っかかりました。以下の出品の型番と同じ`JK29LP`で、ファームウェアのバージョンは4です。

[メルカリ \- Amazon Dash Button（WiFi設定が可能なファームウェアver） 【PC周辺機器】 \(¥900\) 中古や未使用のフリマ](https://www.mercari.com/jp/items/m32449411219/)

> wav音声ファイルを活用したハックで、LEDが緑に点滅し、WiFi設定モードになることを確認済です。

ダッシュボタンにマイクが付いていることを、この文章を読んで初めて知りました。

以下の記事を参考に復旧を試みます。
[Rescue Your Amazon Dash Buttons – Chris Mullins](https://blog.christophermullins.com/2019/12/20/rescue-your-amazon-dash-buttons/)
上記ブログに掲載されている初期化用の音声ファイルを、スマホから最大音量で鳴らすと初期化できました。マジでできると思ってなかったのでLEDが緑に光ったときは変な笑いが出ました。
（初期化用音声のwavがあるリポジトリ：[dashbutton/audio\_exploit at master · sidoh/dashbutton · GitHub](https://github.com/sidoh/dashbutton/tree/master/audio_exploit) のwrite_customer_secret.s.wav）

注意点として、ダッシュボタンをインターネットに繋げてしまうと文鎮化するため、MACアドレスフィルタリングが使えるルータが必須です。
簡単に手順をまとめるとこんな感じ。

1. ボタンを長押しして青色の点滅状態にする
1. Wi-Fiに接続できる端末（ノートPCでもスマホでもなんでもいい）から、SSIDが`Amazon ConfigureMe`のネットワークに接続して、`http://192.168.0.1`をブラウザで開く
1. MACアドレスをメモって、ルータのMACアドレスアドレスフィルタリングに設定する
1. 青色の点滅状態で初期化用音声をダッシュボタンに聞かせる。成功するとLEDが緑色に点滅する
1. `Amazon ConfigureMe`に接続し、`http://192.168.0.1/?amzn_ssid=<SSID>&amzn_pw=<パスワード>`にアクセスする。成功すると`200OK`が返ってくる。

## amazon-dashの設定
ダッシュボタンのボタン押下を検出するために、Raspberry Piに[amazon-dash](https://github.com/Nekmo/amazon-dash)を導入します。
私が使っているのはRaspberry Pi 3 Model B Rev 1.2で、OSはRaspbian Busterです。

リポジトリのREADME通りにインストールすれば、特に詰まらず即使えるようになりました。
[Nekmo/amazon\-dash: Hack your Amazon Dash to run what you want\.](https://github.com/Nekmo/amazon-dash)
注意点として、Raspbianで使用する場合は`sudo apt install tcpdump`の実行が必要です。

discoveryコマンドを使用して、ダッシュボタンを押した時に該当のMACアドレスが表示されれば、正しくWi-Fiが設定されています。

```
-SSH- raspberrypiˇpi ~ » sudo amazon-dash discovery                                                                                                          23:13:31
Welcome to Amazon-dash v1.4.0 using Python 3.7.3
December 31 is the last day to block requests from your Amazon-dash buttons to Amazon servers. In 2020 your buttons can be bricked in an update from Amazon servers.
The discovery command lists the devices that are connected in your network. Each device will only be listed once. After executing this command wait approximately 10 seconds before pressing the Amazon Dash button. After pressing the button, the Mac address of the button will immediately appear on the screen. Remember the address to be able to create the configuration file.
xx:xx:xx:xx:xx:xx (Amazon Device)
```
Fire TV StickもAmazon Deviceとして認識されるので、アマプラ見ながら作業してるときは要注意です。

ボタン押下時の動作は`/etc/amazon-dash.yml`で設定します。
以下のように書くと動作がテストできます。ボタン押下後、`/home/pi/test.log`に`test`が出力されていればOKです。

```yml
devices:
  xx:xx:xx:xx:xx:xx: #ダッシュボタンのMACアドレス
    name: Test
    user: pi
    cmd: echo "test" > test.log
    cwd: /home/pi
```

`sudo systemctl start amazon-dash`でサービスを起動します。
ジョブカン打刻用のスクリプトを`cmd`に設定すれば目的達成です。

## ジョブカンで自動打刻する
### だめだった方法
勤務先ではジョブカンのSlack打刻が使えるので、SlackのAPIをcurlから叩けば目的達成だと思っていました。ジョブカンの打刻用スラッシュコマンドは`/jobcan_touch`なので、`chat.postMessage`からスラッシュコマンドを送信します。
[chat\.postMessage method \| Slack](https://api.slack.com/methods/chat.postMessage)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321603/91deb46d-d17c-2801-6436-1cb2099edc75.png)

スラッシュコマンド、コマンドとして認識されねえ～～～～。APIからスラッシュコマンドを送信しても文字列にしかならないんですね。初めて知った。
調べてみると、APIからスラッシュコマンドを送信する方法があるにはあるようです。
[API から Slack のスラッシュコマンドを送信する闇の方法 \- Qiita](https://qiita.com/halhorn/items/003024befc6745c2c76f)
> API トークンをレガシーな形式のものを使う

レガシー形式のトークンは今現在発行不能なので、Slackから打刻するのは無理そうです。

### 採用した方法
仕方ないので、ジョブカンの認証～打刻用のエンドポイントまで、curlで叩くことにします。
ここに詳細なコードを書くとジョブカン側の迷惑になりそうなので公開は控えますが、多分そんなに難しくないはずです。
共通IDログインの場合、CSRF対策用のトークンを抜き出すために途中でsed等を使うことになりますが、Cookieを管理しながらLocationヘッダを追いかければ認証できるようになっていて、bashで10行ほどで書けます。
旧勤怠管理ログインの方は使用できないのでわからないですが、そちらも大差ないと思います。
（余談ですが、Railsのcsrf_tokenの仕様は結構前に調べていました。）
[Rails 4アプリのCSRF tokenをクライアント側で生成できるか調べた。 – return $lock;](https://retrorocket.biz/archives/674)

出勤時はスラッシュコマンドで失敗してしまいましたが、退勤時は無事ボタンから打刻できるようになりました。
打刻失敗した時に~~自分のSlackのDMにエラーメッセージを飛ばすようにしましたが、うまく機能するかどうかはわからないのでしばらく様子見です。~~1ヶ月運用して、自分のDM宛だと全然気づかないことがわかったのと、エラー発生時はジョブカンが落ちているときで、それなら他の人にも知らせたほうが良いだろうという判断から、パブリックチャンネルにメッセージを飛ばす運用に変更しました。

#### 注意したほうが良いこと
amazon-dashでdelayを設定しているにも関わらず、10回に1回くらいの頻度でボタンが多重で押されるバグが発生するため、実行するスクリプトには多重起動防止用の処理を書いたほうが良いです。
参考：[シェルスクリプトで二重起動防止 \- Qiita](https://qiita.com/TanukiTam/items/d310777b82e10e58a4db)

## まとめ
1. 特定のファームウェアのバージョンのAmazon Dash ButtonならWi-Fiセットアップできる
1. amazon-dashめっちゃ便利
1. Slack APIからスラッシュコマンドを送信しても文字列にしかならない
1. Amazon Dash Buttonが動かないなら、素直に[AWS IoT ボタン](https://aws.amazon.com/jp/iotbutton/)買ったほうがいいと思う。（私はIoTボタン持ってないので、2500円分の価値があるかどうかは言及できないですが…。）