○○分後に死ぬSpatial.chat ~ 裏仕様10000分数制限との戦い、そして事件は起こった ~ #iotlt #protoout


いや、戦えません。撤退する話です。

そしてそこまで大トラブルにはなってない（個人の感想）けど面白いので記事にしておきます。

トラブル発生 -> ネタにして実装&記事まで書くができたのでトラブルに逆に感謝。

## Spatial.Chatのフリープランは裏仕様がある

[IoTLTのハッカソン](https://iotlt.connpass.com/event/227414/)で知りました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">こんな感じで追い出された人いません？<a href="https://twitter.com/hashtag/iotlt?src=hash&amp;ref_src=twsrc%5Etfw">#iotlt</a> <a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://t.co/HKRyVXJZAy">pic.twitter.com/HKRyVXJZAy</a></p>&mdash; Watanabe Tsubasa (@shuyin02) <a href="https://twitter.com/shuyin02/status/1457202326486204420?ref_src=twsrc%5Etfw">November 7, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ということでどうやら10000分の制限があるみたいです。

ページを見てもフリープランの分数制限は書いてないので50人までという制限を気にしてましたが、どうやら10000分みたいですね。（スターターは20000って書いてますが笑）

>  ![スクリーンショット 2021-11-07 14.26.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/a6f6d14a-26e6-e650-1916-100b18d64d75.png "スクリーンショット 2021-11-07 14.26.38.png")

## そして事件が...

まぁこの事象がハッカソンで発生したのでまぁみんな締め出されたというわけです。

**ざわつく参加者たち**

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">大パニック！！！汗<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a><a href="https://twitter.com/hashtag/iotlt?src=hash&amp;ref_src=twsrc%5Etfw">#iotlt</a></p>&mdash; YE0905 (@EgashiraYosuke) <a href="https://twitter.com/EgashiraYosuke/status/1457201401239531521?ref_src=twsrc%5Etfw">November 7, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

**ざわざわ**

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/iotlt?src=hash&amp;ref_src=twsrc%5Etfw">#iotlt</a> 配信落ちてて草</p>&mdash; rin; (@strawbeRinMilk) <a href="https://twitter.com/strawbeRinMilk/status/1457202464118083588?ref_src=twsrc%5Etfw">November 7, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

**ざわ。。。**

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">僕も同じですね〜<br>SpaticalChatの無料枠上限超えてしまったのかも...？<a href="https://twitter.com/hashtag/iotlt?src=hash&amp;ref_src=twsrc%5Etfw">#iotlt</a> <a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a></p>&mdash; まつおかさん（まつおかやで） (@mitsuoka0423) <a href="https://twitter.com/mitsuoka0423/status/1457202617361199105?ref_src=twsrc%5Etfw">November 7, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


鳴り止まない問い合わせ...

.
.
.
.
.
.
.
.
.


は嘘です。ハックタイムだったのでみんな集中しててそこまで気になってなかったかも。

逆にいうと発表中とかにこの事象にならなくてよかったですね〜

## どこで残りの分数を確認できるのか

`https://spatial.chat/s/<spaceのID>/plans?password=<個別のパスワード>`のURLにアクセスすることでプランのアップグレード及び残り分数の確認が出来ます。

**パスワードまでGETのパラメータにいるのはどうなんだろうか...?** などは思いますが進みましょうか。

こんな感じで確かに **10000から0に向かって寿命が減っている** のが分かります。

> ![スクリーンショット 2021-11-07 14.33.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/d6aaf78e-12ac-cfe3-5683-4665ba24590f.png "スクリーンショット 2021-11-07 14.33.16.png")

ついさっき`パスワードまでGETのパラメータにいるのはどうなんだろうか...?`と書いたばかりですが、逆にここにアクセスすればデータ取れるのでスクレイピングとかやれそーって思いました。

## JavaScriptでSpatial.Chatの寿命を取得します。

まずはaxiosでチャレンジしてみる

```jumyou.js
const axios = require(`axios`);

const main = async () => {
    const URL = `SpatialChatのプラン確認用URL`;
    
    const res = await axios.get(URL);
    
    console.log(res.data);
  };
  
main();
  
```



実行してみるが、どうやらサーバーレンダリングはしてなさそうで、axiosだと取得できなかった。

となるとフロントでのレンダリングが行われてる感じなので、puppeteerを入れて試す。

```
$ npm i puppeteer
```

セレクタの特定が必要なのでChrome Devツールで調べます。

> ![スクリーンショット 2021-11-07 14.55.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/8946bc27-5d61-1fce-8307-a44a4a4cc716.png "スクリーンショット 2021-11-07 14.55.28.png")

なるほどなるほど

> class="MinutesLeftRange_titleLeft_1dfZK"

動的生成されてそう感すごいけどまぁとりあえずだしこれを使います。

この時点だと **残りの寿命は8752分らしいですね**

```jumyou-puppeteer.js

const puppeteer = require('puppeteer');


const main = async () => {
    const URL = `SpatialChatのプラン確認URL`;
    
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(URL);

    await page.waitForSelector(`.MinutesLeftRange_titleLeft_1dfZK`);

    const jumyou = await page.evaluate(() => {
        return document.querySelector(`.MinutesLeftRange_titleLeft_1dfZK`).innerText;
    });

    console.log(`Spatial.Chatの寿命はあと${jumyou}分です。`);

    
    await browser.close();

};
  
main();
```

さーこんなので取れるだろうか

```bash
$ node jumyou-pupp.js
8752
```

とれた！きましたね！寿命取れましたw


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">即席でSpatialChatの寿命チェッカー作りました。 <a href="https://twitter.com/hashtag/iotlt?src=hash&amp;ref_src=twsrc%5Etfw">#iotlt</a> <a href="https://t.co/O1eA4gN61T">pic.twitter.com/O1eA4gN61T</a></p>&mdash; 菅原のびすけ (@n0bisuke) <a href="https://twitter.com/n0bisuke/status/1457229211500875784?ref_src=twsrc%5Etfw">November 7, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## せっかくなのでobnizと繋げましょうか

ハッカソンがobniz縛りなので。obnizにも繋げてみます。

```
npm i obniz
```

```jumyou-obniz.js
const puppeteer = require('puppeteer');
const Obniz = require('obniz');
const obniz = new Obniz('obnizのID');

let led = {};
obniz.onconnect = async function () {
    led = obniz.wired('LED', {anode:0, cathode:1});
}

const main = async () => {
	 const URL = `SpatialChatのプラン確認URL`;
    
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(URL);

    await page.waitForSelector(`.MinutesLeftRange_titleLeft_1dfZK`);

    const jumyou = await page.evaluate(() => {
        return document.querySelector(`.MinutesLeftRange_titleLeft_1dfZK`).innerText;
    });

    console.log(`Spatial.Chatの寿命はあと${jumyou}分です。`);

    if(jumyou < 8752){
        console.log(`寿命やばい`);
        led.on(); // obnizのLEDつける
    }

    await browser.close();

};
  
main();

```

実行してみるとこんな感じ

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> にも繋がった笑 <a href="https://twitter.com/hashtag/iotlt?src=hash&amp;ref_src=twsrc%5Etfw">#iotlt</a> <a href="https://t.co/GaQePXraC6">pic.twitter.com/GaQePXraC6</a></p>&mdash; 菅原のびすけ (@n0bisuke) <a href="https://twitter.com/n0bisuke/status/1457232171911966728?ref_src=twsrc%5Etfw">November 7, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## まとめ - 無料50人までには注意


SpatialChatの罠、50人いけるけど、50人で繋ぐと数時間で死ぬって話ですね苦笑

今回作った「スクレイピングしてobnizでアラートさせる」みたいな話は電車遅延とか何かのニュース系には使えそうな気はしますが、、まぁ今回作ったSpatialChatの話題は限定的すぎてあまり再現性なさそうですねw 10000分 / 1日ですからね...

ProtoPediaにも登録しておいたのでコメントもらえると嬉しいです

> [○○分後に死ぬSpatial.chat](https://protopedia.net/prototype/2645)

誰かの何かの参考になるか分からないけどなったら嬉しいです笑

それでは！