Amazon Dash ButtonでDiscordに投稿する [Battlefield Dash Button]

衝動的にボタン買いました。
SlackでWebhookから投稿出来る記事は数多く見ていましたので、
個人的にSlackより使っている[Discord](https://discordapp.com/)でも同じような感じでいけるんじゃね？という思いつきです。

## 目指すところ

毎日のようにBattlefield 1をプレイしているので「これを押したら今から出撃しますよ」という意味で、ボタンを押したらDiscordに投稿するというbotにします。


## 準備

- Amazon Dash Button（人気ボタンは入荷待ちのため[消臭力 Dash Button](https://goo.gl/YNDCgm)にしました）
- Raspberry Pi Model B
- Discord
- Node.js
- Wifi環境

## ボタンのセットアップ

Dash Buttonのセットアップについては、他記事が詳しいので省略します。
下記を参考にしました。

- http://qiita.com/jsoizo/items/3b8bba4160f41aef20f4
- http://qiita.com/momochan/items/d8dc0b95cfaee216ace4

## DiscordのWebhook利用設定

Discordを起動し、左ナビのメッセージを投稿したいchannelの設定ボタン（歯車の画像）をクリックすると、設定画面に入ります。

<img width="242" alt="スクリーンショット 2016-12-22 2.28.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/30278/7705b1e8-1a93-4e86-aa62-7ecb4196472d.png">


一番下のWebhookを選択し、Webhookを作成ボタンをクリックすると作成できます。名前（これが投稿名になる）をつけてさらにアバターを変えたければ設定。
WebhookURLが表示されているはずなので、これをコピー。後ほど使います。

```
https://discordapp.com/api/webhooks/{webhook.id}/{webhook.token}
```

所属しているサーバーの管理権限があればいいのですが、なければ管理者に権限もらってください。


## Raspberry Pi側の下準備

[Radikoサーバー](http://qiita.com/komacchi/items/ca09d195699815c81c3e)にしてはいるものの、
そういえばgitだのnodeだの入れてなかったのを思い出したので下準備です。

### Raspberry Pi にgitをインストール

いつもの

```
$ sudo apt-get update
```

```
$ sudo apt-get install git
$ git --version
```

### nvm経由でNode.jsを入れる

既に入れてあった古いバージョンを一旦削除

```
$ sudo apt-get purge nodejs
```

### インストール用ディレクトリを追加

```
$ sudo mkdir /usr/local/nvm
$ sudo chmod 777 /usr/local/nvm
```

### nvmリポジトリのclone

```
$ git clone https://github.com/creationix/nvm.git /usr/local/nvm
```

### nvmを使えるように読み込む
```
$ source /usr/local/nvm/nvm.sh
```

**ようやくnodeインストール**
LTSの最新を利用します

```
$ nvm ls-remote //nodeのバージョン一覧
$ nvm install v6.9.2 //現時点でのv6系LTS
```

動作確認

```
$ node -v
$ npm -v
```

## dasherのインストール

[dasher](https://github.com/maddox/dasher)が良さげだったのでこちら使います。

```
$ git clone https://github.com/maddox/dasher.git
$ cd dasher
$ npm install
```

うまくいかない。
socketwatcherがrebuildできなかったのでnodeのバージョンが高すぎた疑惑。あえて古いの入れてみます。

```
nvm install 0.10.48
```

入ったのを確認。

```
$ node -v
v0.10.48
```

### ボタンのMACアドレスを確認
```
$ script/find_button
```

Dash Button ﾎﾟﾁｰ

```
Watching for arp & udp requests on your local network, please try to press your dash now
Dash buttons should appear as manufactured by 'Amazon Technologies Inc.'
Possible dash hardware address detected: xx:xx:xx:xx:xx Manufacturer: unknown Protocol: udp
Possible dash hardware address detected: xx:xx:xx:xx:xx Manufacturer: unknown Protocol: arp
Possible dash hardware address detected: xx:xx:xx:xx:xx Manufacturer: BUFFALO.INC Protocol: arp
Possible dash hardware address detected: xx:xx:xx:xx:xx Manufacturer: Apple Protocol: arp
```

Manufacturer: unknownのMACアドレスがそれです。

ということで、`config/config.json`に記載。

```
$ vi config/config.json
```

記載例はこちら

```config.json
{"buttons":[
  {
    "name": "BFbot", //区別用の名前
    "address": "xx:xx:xx:xx:xx",
    "url": "https://discordapp.com/api/webhooks/{webhook.id}/{webhook.token}", // DiscordのWebhook 書式は公式ドキュメント参照
    "method": "POST",
		"formData": {
			"username": "BFbot", //Bot名
      "content": "ここに投稿内容をご自由に"
		}
  } //ここまでのセットをカンマ区切りで複数記載可能
]}
```

今回、DiscordのWebhookを利用するにあたり、formからのpostを送らないと受け取ってもらえなかったので、formDataの形式にしました。

複数記載可能ということは、httpリクエストを飛ばす先も変えてその書式に合わせればいいだけなので、ひとつの設定ファイルだけでSlackとか別のサービスへの設定を自由に追加できます。
つまりボタン増やせるということです。これがdasherにした理由でもあります。

### 起動

起動してボタンの押下を監視します。

```
$ sudo npm run start

> dasher@1.1.1 start /home/pi/dasher
> node app.js

[2016-12-21T14:43:33.082Z] BFbot added.
[2016-12-21T14:43:44.806Z] BFbot pressed.
```

## 実際の動作

<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">ヤッターBattlefield Dash Buttonできた <a href="https://t.co/fEzvbKUmLu">pic.twitter.com/fEzvbKUmLu</a></p>&mdash; komacchi (@komacchi) <a href="https://twitter.com/komacchi/status/811634301368287233">2016年12月21日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ちなみに、ショーシューリキButtonだと味気ないなと思っていたところ、神が、いやむしろGodが降臨されたので、まずは出力して切り抜いて仮止めしてみました。
プリンタの具合と出力紙の都合でアレなことになってますが、あらためて光沢紙に出力して切り抜いて貼り付けるつもりです。


これで「**Battlefield Dash Button**」の爆誕ですヤッター


ただのボタンかもしれませんが、少し見方を変えれば、家庭内で役立つことにも使えそうで夢膨らみますね。
例えば子供が帰って来たときに「このボタン1回押してね」ということにしておけば通知がSlackなりDiscordなりに飛んでくるので、仕事中でも安否確認に役立ちます。
さあボタン増やすぞ！