Corradeボット入門（その３：HTTPサーバ化して外部に公開）

Corradeボット入門[その１](https://qiita.com/makopo/items/a59042c544467869707e)と[その２](https://qiita.com/makopo/items/f991bd1bd49523ecaaa4)では、インワールドからボットにインスタントメッセージを送る方法でボットに命令していました。チャットボットやスマートスピーカーなど、クラウドサービスを経由してボットを動作させるには至極不便です。

というわけで、結局、CorradeボットのHTTPインターフェースを有効化して、HTTPサーバーとして動作するようにしてしまいます。そして、ngrokを使って、インターネット上からCorrade関連のポートにアクセスできるようにします。

## CorradeボットをHTTPサーバー化する

### Corrade.iniの編集
[Corradeのマニュアル](http://grimore.org/secondlife/scripted_agents/corrade/tutorials/integrated_web-server)には、`Corrade.ini`ファイルを直接変更する方法が紹介されています。

```xml
<httpserver>true</httpserver>
<httpserverprefix>http://+:8080/</httpserverprefix>
```

Configurator.exeを使う場合は、`HTTP`タブの`Server`項目の`Enabled`チェックボックスにチェックを入れて、上書き保存します。

![enable.png](https://qiita-image-store.s3.amazonaws.com/0/10290/4e508056-eaf7-4b9d-0af8-a9097e79e9a2.png)

2体以上ボットを動かす予定がある場合は、ポート番号を被らない値に変更してください。

HTTPSにしたい！という方は、[ここを見て頑張ってください](http://grimore.org/windows/https_for_.net_httplistener)。

### テスト

ローカルホストで、cURLやPostmanなどでコマンドを発行してみます。IMでコマンドを発行するのと全く同じ構文です。試しに、[その２](https://qiita.com/makopo/items/f991bd1bd49523ecaaa4#地面に座るrelax)の「地面に座る」と「立ち上がる」をやってみましょう。

> 「Corradeボットをインターネットに公開する」でngrokの設定を行うと、ファイアウォールの設定を変更することなく、Corradeサーバーにアクセスできるようになります。ngrok設定前に、別のPCでテストする場合は、お使いのOSに応じて、Corradeポート(デフォルトでは`8080`)への外部からの通信を許可する必要があります。

#### 地面に座る

```
curl -X POST \
  http://<ホスト>:<ポート>/ \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'command=relax&group=<グループのUUID>&password=<グループのパスワード>'
```

Postmanの場合、以下のような感じです。

![relax.png](https://qiita-image-store.s3.amazonaws.com/0/10290/514a3907-4dbe-ecc3-8305-9eea7151195a.png)

成功すると、以下のような内容でHTTP 200レスポンスが返ります。その１やその２の時よりも若干早く、スッと座ってくれます。

```
group=<グループ名>&command=relax&success=True&time=<タイムスタンプ>
```


#### 立ち上がる

```
curl -X POST \
  http://<ホスト>:<ポート>/ \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'command=stand&group=<グループのUUID>&password=<グループのパスワード>'
```

成功すると、以下のような内容でHTTP 200レスポンスが返ります。

```
group=<グループ名>&command=stand&success=True&time=<タイムスタンプ>
```

## Corradeボットをインターネットに公開する

### ngrokの設定

https://ngrok.com からバイナリをダウンロードして、アーカイブを展開して、適当な場所に配置します。

Windowsの場合、`ngrok.exe`を配置したフォルダで、ngrokを実行します。以下は、ポート8080の場合の実行例です。

```
ngrok http 8080
```

うまくいくと、画面が切り替わり、アドレスが振られます。

```
ngrok by @inconshreveable                                                                               (Ctrl+C to quit)

Session Status                online
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://a1d1acee.ngrok.io -> localhost:8080
Forwarding                    https://a1d1acee.ngrok.io -> localhost:8080

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00
```

上記の場合、振られたアドレスは`http://a1d1acee.ngrok.io`です。

> プロキシ環境などで利用している場合は、そもそもngrokを使って良いか規程を十分に確認の上、「[これで無駄な社内手続きともおさらばできる！？ngrokを使って超簡単に公開サーバを手に入れる](https://qiita.com/sh-ogawa/items/b77b5f14d69457ef49d8)」記事等を参考に設定してください。ngrokを使っていたことが後からバレて余計に面倒なことになっても、筆者は責任を負いません。

### テスト

先ほどのURLの部分を、振られたアドレスに変更するだけです。ポート番号は不要です。

```
curl -X POST \
  http://<振られたアドレス>.ngrok.io/ \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'command=relax&group=<グループのUUID>&password=<グループのパスワード>'
```

### 毎回同じアドレスにしたい場合は？

書き始めたら長くなってしまったので、記事を分けました。「[ngrokで常に同じアドレスを使う方法(2017年12月版)](https://qiita.com/makopo/items/338791261f86dfec1adf)」を見てください。課金が必要です。

### ngrokもサービス化したいんだけど？

[ngrok link](https://ngrok.com/product/ngrok-link)にサービス化コマンドが用意されているようですが、完全に商用サービスとなっていて、筆者は手を出せません。[NSSM](http://nssm.cc/)などを使って、自分でWindowsサービス化する必要があります。