hilight.js

2018年2月7日水曜日

discordのbotからイカリング2にアクセスする

splatoon2の連動サービスであるイカリング2。アプリ以外からでも情報を読めるように出来るということで、discordのbot上から情報を取得して表示してみた。

環境


  • ubuntu 16.04.3 LTS + LXDE
  • javascript
  • node.js 9.4.0
  • npm 5.6.0
  • discord.js 11.3.0
  • ipad iOS 11.2.2


前提


イカリング2にアプリ以外からアクセスできるようになるまでは、
イカリング2をPCブラウザで見れる方法があるらしいのでやってみたを参照。

イカリング2から情報を取得するのは、
[Python]イカリング2のJsonを取得してみたを参照。

上記を参照しながら、ひっかかったところだけまとめていく。


pipのインストールでひっかかる


参照サイトのように

sudo easy_install pip

と打っても、easy_installなんてコマンドはないと言われる。
easy_installは、setuptoolsというパッケージをインストールすることで使えるようになるらしいが、既にメンテナンスされておらず、代わりにdistributeというのを使った方がいいらしい。
が、distributeについてはよくわからなかったので、普通にaptでインストールすることにした。

sudo apt install python-pip3

pipはpythonのパッケージ管理ツールで、python2用とpython3用で別々に存在するらしい。
ここでは、新しい方をインストールしておこうということでpython3用のpip3を選択した。
そのため、コマンドを打つ時は、pipではなくpip3になる。
ちなみにpython2用のpipも共存できる。


mitmproxyのインストールでひっかかる


mitmproxyインストール中にエラーで中断してしまった。
どうも以下のパッケージがインストールされていないといけないらしい。

  • python-dev
  • libffi-dev
  • libssl-dev
  • libxml2-dev
  • libxslt1-dev
  • libjpeg8-dev
  • zlib1g-dev

自分の場合は、sslなんちゃらが見つからないよと言われていたので、libssl-devをインストールしたら通るようになった。
めんどくさい場合は、全部インストールしておけば問題ないだろう。

sudo apt install python-dev libffi-dev libssl-dev libxml2-dev libxslt1-dev libjpeg8-dev zlib1g-dev



mitmproxyの起動でひっかかる


参照サイト の通りに、ポート8080を指定したら、既に使われていると出て起動できなかった。
調べてみるとSublimeText3がそのポートを使用していたので終了させた。
すると今度はchromeがポート8080を使い出して起動できない。
結局、他の使われていないポートを使用することで起動した。
ここではポート8081を使うようにする。

mitmproxy -p 8081

iOS端末の方でも、HTTPプロキシの設定でポートを8081にする必要がある。


PCのIPが分からなくてひっかかる


linux ip 確認 でググッてたどり着いたのが

ip route

だったが、IPらしきものが複数表示されて、どれがPCのIPかぜんぜんわからん。 ip route 見方 でググっても経路どうこうと専門的な説明ばかりで、結局PCのIPと言われた場合はどのIPを指すのかぜんぜんわからん。

実際に試した感じでは、下の画像の○で囲んだ部分が、PCのIPと言われた時に参照するIPのようだ。

一番上の頭にdefaultがついているのがルーターを指し、一番下の行が自分のPC、真ん中の169.254.0.0というのは無視していいもののようだ。
ちなみにwifi搭載機で有線接続を行っていると、ルーターと自分のPCのところに、有線分の行が追加される。

といわけでIPが分かったので、iOS端末のHTTPプロキシ設定でサーバーのところに、このIPを書き込む。


iOS端末がネットに繋がらなくてひっかかる


http://mitm.itにアクセスして証明書のインストールまでは出来たが、iOS端末でNintendoSwitchOnlineアプリを開くと、接続が不安定ですと言われて先に進めなくなった。
(そもそもhttp://mitm.itにアクセスできない場合は、mitmproxyの起動か、iOS端末のHTTPプロキシの設定に問題がある)

証明書をインストールした後に、iOS端末の[設定]-[一般]-[証明書信頼度設定]から、インストールしたmitmproxyをONにする必要があった。
これでイカリング2にアクセスできるようになり、mitmproxy上で色々情報が見れるようになった。


参考サイトのサンプルコードがpythonでひっかかる


ここからは、[Python]イカリング2のJsonを取得してみたを参照しながら作業を進めるが、タイトルにもあるようにpythonを使用している。

というわけで調べた結果、javascriptでjsonを取得する場合、node.jsのモジュールであるrequestを使うのがよさそうだ。
他にもいろいろ方法があるが、discord.jsもnode.jsのモジュールなので、同じnode.js上で動くものを選んだ。
というわけで、requestモジュールをインストールする。

npm install request --save

これを使用して、jsonの取得処理を書くとこうなる。

let req = require( 'request' );
let j = req.jar();
 
const url = 'https://app.splatoon2.nintendo.net/api/onlineshop/merchandises';
const cookie = 'iksm_session=xxxxx';  // xxxxxを取得したcookieの値に置き換え
j.setCookie( cookie, url );
 
const options = {
  url: url,
  method: 'GET',
  jar: j,
  headers: {
    'content-type': 'application/json',
  },
  json: true
}
 
req( options, ( err, res, obj ) => {
  console.log( JSON.stringify( obj, null, '\t' ) );
});

上の例では、ゲソタウンから取得したJSONをコンソール上に表示する。

取得したjsonを利用して、botでゲソタウンの先頭のギアを表示してみる。

"use strict"
 
const Discord = require("discord.js");
const client = new Discord.Client();
const token = "xxxxx";  // xxxxxをbotのトークンに置き換え
 
client.on("ready", () => {
    console.log("im ready test bot");
});
 
 
client.on("message", (message) =>
{
    if ( message.isMentioned(client.user) )
    {
        let req = require( 'request' );
        let j = req.jar();
 
        const url = 'https://app.splatoon2.nintendo.net/api/onlineshop/merchandises';
        const cookie = 'iksm_session=xxxxx';  // xxxxxを取得したcookieの値に置き換え
        j.setCookie( cookie, url );
 
        const options = {
            url: url,
              method: 'GET',
              jar: j,
              headers: {
                  'content-type': 'application/json',
              },
              json: true
        }
 
        req( options, ( err, res, obj ) =>
        {
            const gear = obj.merchandises[0];
 
            const desc = 'ブランド:' + gear.gear.brand.name + '\n' +
                        'ギアパワー:' + gear.skill.name + '\n' +
                        'サブギアパワー:' + gear.gear.brand.frequent_skill.name;
 
            message.channel.send( desc, {
                'embed': {
                    title: gear.gear.name,
                    'image': {
                        'url': 'https://app.splatoon2.nintendo.net' + gear.gear.image,
                    }
                }
            } );
        });
    }
 
});
 
client.login(token);

こんな感じになる

0 件のコメント:

コメントを投稿