あつ森でメッセージBotを作ろう　～プロキシ編～

# はじめに
「**あつまれ どうぶつの森**（あつ森）」発売から4年が経ちますね。
私は発売初日からタイムトラベル無しで1年ほど遊びましたが、虫や魚を全部集めて、お店のカタログコンプした後はほぼノータッチでした。
しかし最近ある日、ふと「**あつ森**で**Bot**作れないかなぁ…？」という願望（笑）ができ、APIがないか調べてみました。
そこからPythonでゲームにメッセージ送信できるGUI「**ACNH_Chat_Client**」というものを知り、その動作の様子や仕組みに感銘を受けて無事再燃しました＼( 'ω')／

https://github.com/mizuyoukanao/ACNH_Chat_Client

<iframe width="560" height="315" src="https://www.youtube.com/embed/e0etoNp7JUI?si=pYiAXK3H7jwJlXuH" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

一方で、このプログラムの最終更新は**4年前**となっており、ソースコードを確認したところ、現在では<INS>仕様が変更された・動作しなくなったAPI</INS>も含まれていました。
そこで、このプログラムをベースに現行のバージョンでも動くようAPIを解析し、改変したプログラムを記載するとともに、苦労したところを備忘録的に今後まとめていきたいと思います。

今回はその前準備としてプロキシツールを使ったAPI解析を行います。

# 前提
APIを解析するにあたり、「**mitmproxy**」というプロキシツールを使用します。

https://qiita.com/hkurokawa/items/9034274cc1b9e1405c68

このプロキシツールは開発者向けに**Python API**が提供されていることが特徴で、`pip`インストールでもセッティングできます。
ですが、今回は環境構築をする必要がない**コマンドライン**を使う手法で試していきます。

## mitmproxyをインストールする
この記事では**iOS向け**の解説となります。

:::note warn
Androidの場合、現状多くの端末（Android7.0>）は、Google社の方針でセキュリティが強化されたため、Root化しない限りmitmproxyは**動作しません**。
しかしながら<INS>Androidエミュレータ</INS>を使用する方法もあります（今後執筆予定）。

もし可能であれば、下記参考文献「*mitmproxy instructions*」（英語）に方法が書いてあるのでチャレンジしてみてください！
:::

1\. 以下のサイトでmitmproxyのインストーラをダウンロード、インストールを行います。

https://mitmproxy.org/

:::note
macOSの場合は「**[Homebrew](https://brew.sh/ja/)**」を使ってインストールします。
```ruby
brew install mitmproxy
```
:::

2\. PCのIPアドレスを確認します。コマンドプロンプトから、`ipconfig`と打ち込むと構成情報が色々出るのでその中の「**IPv4　アドレス**」をメモします。
macOSなら、`ipconfig getifaddr en0`で。上手くいかなければ、`en0`を`en1`に変えて試してみてください。

3\. PCの方で「**mitmweb**」を開いておきます。

4\. スマートフォンのネットワーク構成を変更します。
* <INS>iOS</INS>
「設定」>「Wi-Fi」から`i`をタップし、一番下にあるHTTPプロキシの構成を
「**手動**」に変更します。
「サーバ」は、手順2でメモしたIPアドレス、ポートは「**8080**」にします。


5\. スマートフォンで初回設定を行います。
* <INS>iOS</INS>
スマートフォンで証明書をインストールします。 
「 http://mitm.it/ 」と入力し、OSにあった「**.pem**ファイル」をダウンロードします。
「設定」>「一般」>「VPNとデバイス管理」から「mitmproxy」を選択、構成プロファイルをインストールしてください。
加えて、「一般」>「情報」>「証明書信頼設定」から「**ルート証明書を全面的に信頼**」するのも忘れないように！

ここまでで前準備は終わりです！

# Try!
1\. PCで「**mitmweb**」を起動、スマートフォンでは「**Nintendo Switch Online**」を起動、必要に応じてログインをしておきます。
2\. おなじみのホーム画面が出るので「**あつまれ どうぶつの森**」を選択します。
3\. タヌポータルが起動しますが、ここで「mitmweb」を見ると、今回はあつ森関係のAPI（URLにacbaaが入っている）と通信している様子が確認できます。最後が「**auth_token**」で終わるAPIを確認してみましょう。
![mitm2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720276/7d598cb0-5df8-00fb-70e2-6bd3a79e0fb4.png)

4\.通信に関する詳細情報が表示されるので、上のメニューを「Request」から「Response」に切り替えます。
下にJSONが返されているので、ここのtokenがあつ森APIのトークンとなります！！
![mitm3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720276/46a6fba1-a1a1-f601-eeb5-e99f72235d7e.png)

:::note
トークンの有効期限は2時間です。
もし切れた際は、ホームから入り直せば新しいトークンを入手できます。
:::

5\. 「ACNH_Chat_Client」でテストしてみます。
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720276/a1c246e6-4aab-12da-1255-565f78dd366d.gif)
無事、PCで入力した「Hello World!」が送信されていますね。
ちなみにスマートフォンでメッセージを送信する際、「mitmweb」を確認すると、メッセージ送信用のAPIが用意されており、bodyに入力した文字列が格納されたJSON型で送られていることが分かります。

![acnh2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720276/4b909596-1602-7275-93a3-a476ce8ed301.png)
![acnh3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720276/6fd6936f-ac9d-2e95-428b-3df975a56f96.png)

# まとめ
お恥ずかしながらあつ森を熱心に遊んでいた頃は、プログラミングのプの字も知らなかった者です（）
しかしこうしてプログラミングに興味を持ってから色々調べてみると、今まで何気なく使っていたツールがAPIで成り立っていることを知り、感慨深いものがありました。
次回また時間があれば、「ACNH_Chat_Client」の修正版を置いておきます。


# 参考文献
* [mitmproxy instructions](https://github.com/frozenpandaman/s3s/wiki/mitmproxy-instructions)