ふゆにどっこい

Discordのbotを使ってスプラ2の情報を取得


discordでbot作成〜サーバへ設置

ここからDiscordのbotを作成する

画像にある「New APP」を選択

作成するbotに必要な情報を求められるので、入力して右下のボタン「Waiting for form completion」をクリック

表示された画面を下にスクロールしていくと画像のように「Create a Bot User」と書かれたボタンがあるのでクリック
そして「Token:click to reveal」と書かれた部分をクリックするとTokenIDが表示されるので手元に控えておく(コード内で使用するよ)

上にスクロールして画像にある「Generate OAuth2 URL」ボタンをクリック

右下にコピーとあるのでコピーしてブラウザでURL先を表示

ここで自分が立てたサーバを選択することでbotの追加は完了。いぇあ

スプラトゥーン2のAPIをブラウザで閲覧できるようにする

スプラ2のAPIの情報を見るにはただURLを叩くだけではうまくいかないようです。
スマホ端末から NintendoSwitchOnlineのスプラ2メニューを閲覧することで必要な情報を取得するのでアプリをいれていない、またはよくわからないという人は「NintendoSwitchOnline スプラ2」と検索してみてちょ

・pipとmitmproxyをインストール
※ターミナルを開いて一行ずつ実行すること

 $ sudo easy_install pip
  $ pip install mitmproxy --upgrade --ignore-installed six

・自分のPCのIPを調べる

  $ ifconfig

なにやらいっぱい表示されると思いますが「en0:」と書かれた場所にある「inet」と書かれた所にある「.」区切りの数字を控えればおk

・スマホで接続しているネットワーク(Wi-Fi)の設定ににあるHTTPプロキシ設定を変更する
通常では自動かオフなどになっていると思うのでとりあえず自分で設定できるように変更

サーバ:「・自分のIPを調べる」で控えたinetの数字
ポート:8080
認証:オフ

・mitmproxyを起動してスマホで証明書をインストール

 $ mitmproxy -p 8080

スマホから http://mitm.it にアクセス


恐らくこんなページが表示されるのでiphoneならリンゴマーク、Androidならドロイド君をクリックして証明書をインストール

・証明書を信頼する
僕がiphoneしか持っていないのでAndroidは分からないですが、、、恐らく証明書をインストールしただけではうまくいかなさそう
NintendoSwitchOnlineがずっと読み込む中のまま止まるんだけどオイ。。みたいな人はこれを試してみて


「設定」
→「一般」
→「情報」
→スクロールして一番下にある「証明書信頼設定」
→「mitmproxy」を信頼する

andoridで証明書を信頼する方法を調べた所、以下の記事がヒット
Android 7 以降で mitmproxy が動作しない
Androidの方はお試しあれ

・スプラ2APIの情報を取得するために必要な情報を入手する
スマホでNintendoSwitchOnlineのスプラ2メニューを開くと、起動しているmimproxy上にアクセスログみたいなものが記録されます。

その中に「https://app.splatoon2.nintendo.net」といったURLがあると思うのでクリック
すると、「cookie:」という箇所に「iksm_session=」から始まる英数字があるので控えておく

コードを書く

本来ならば自前のサーバにプログラムファイルを置くべきだと思うけどとりあえずローカルのPCで動かすよ

・使用する言語
python3

・discord.pyのインストール

  $ python3 -m pip install -U discord.py

・「○○.py」というファイルを作成する。
作成方法はなんでもおk、ただ拡張子にご注意を

・「○○.py」を開いて編集する

下記のコードをペタっと貼り付ける

import discord
import urllib
import json
from urllib.request import build_opener, HTTPCookieProcessor
from urllib.parse import urlencode
import http
from http.cookiejar import CookieJar

client = discord.Client()

def printJson(url):
    cookie = "iksm_session=mitmproxyで取得したcookie値"
    opener = build_opener(HTTPCookieProcessor(CookieJar()))
    opener.addheaders.append(("Cookie", cookie))
    res = opener.open(url)
    json_dict = json.loads(res.read().decode('utf8'))
    return json_dict

@client.event
async def on_message(message):
    if message.content.startswith('./ika_stage'):
        await client.send_message(message.channel, 'ステージ情報を取得するよ!ちょっと待ってね...')
        json_dict = printJson("https://app.splatoon2.nintendo.net/api/data/stages")
        await client.send_message(message.channel, json_dict['stages'][0]['name'])
        await client.send_message(message.channel, "https://app.splatoon2.nintendo.net" + json_dict['stages'][0]['image'])

client.run('bot作成時に控えたtokenID')

・実際に動かしてみる

  $ python3 ○○.py

全てJSON形式で返ってくるので比較的扱いやすいと思います。終わり✋

参考

Pythonで簡単なDiscord Botの作り方
イカリング2をPCブラウザで見れる方法があるらしいのでやってみた
Spla2 API
[Python]イカリング2のJsonを取得してみた