黎明期には多くの方に使用いただきました マイクリのヒーローやアイテムの価格情報サイトの閉鎖を行うことにしました。この記事はそのサービスの歴史とシステム詳細に関する記録として執筆しています。
まずはお礼
多くの方に使っていただき、サービスを開始して本当に良かったです。プレイヤーの方が、スマホにリンクをおいてくれていたことを聞くたびに嬉しくてとびあがりそうでした。ほんとに感謝しかありません。
マイクリ価格情報サイトとは
マイクリ価格情報は、マイクリプトヒーローズのマーケット情報を集約し、ほしいアイテムの最低価格を一瞬で把握できる便利サイトです。OpenSeaも昔は動作が重かったし検索もしづらかったのでその問題解決のために作成しました。
近々の売買記録も併記しているため適正価格かどうかの判断や出品の際の参考情報としても活用頂いたと聞いております。
リリース後にマイクリゲーム内のマーケットの情報も取得し比較できる唯一のサービスとして、多くの方に使用頂きました。最盛期はデイリーで平均500アクセス、350ユニークユーザーの方に利用いただきました。
マーケット種類のカバーは広かった
NFTマーケットが雨後の筍のごとく増えた時期でしたし、マイクリも飛ぶ鳥を落とす勢いでしたので参照するマーケットも広範囲に及びました。多くのマーケットではAPIが無いのでデータ取得には工夫がある程度必要でした。OpenSeaはAPIが整っていましたが癖があり苦戦をしました。いい経験ですね。
スクレイピングの場合サイトがhtmlの構造を変えるとデータの取得ができなくなってしまいます。頻繁に手直しが必要でした。
- OpenSea
- マイクリゲーム内マーケット
- miime
- HB Wallet(閉鎖)
- bazzzar (閉鎖)
- Spider
OpenSeaはAPIキーの取得が必要なので普通にプロセス則り申請しまた。他のマーケットに対してもすべて運営さんに確認した後に取得を開始しています。データの取得に関しては過去にも多くの裁判沙汰があり慎重にしたほうがいいと思っています。
マイクリ内マーケットは、データのありかがログインしないと参照できなく、不正アクセスの対象となるエリアなので、しっかりと運営さんに相談しました。やり取りをしてくれたのは、たまやんさんだったと思います。内容としては「ウエルカムだけど、API用意できないので自力でデータ取れるならいいですよ」とのこと。ログイン後のデータの取得は手元にあるPCであれば、簡単にできますが、サーバーで自動化するのは実は結構な苦難で、天啓を得るのに2週間かかりました。
(技術的な詳細については悪用が怖いので門外不出。頭のいい人はすぐに分かるのかもしれません。そんなにトリッキーではないです)
そのころ、たるみさんから「マイクリ内のデータも見れるといいな」というコメントをDMでもらい、「頑張ってるんですけどなかなか難しいんですよね」と話しました。新機能リリース後には垂水さんのコミュニティーなどで宣伝もしてもらい嬉しさ満点でした。
システム構造 進化と苦労
もともとこのシステムは自前のPCでサクッと作ったPythonのコードをベースとしています。そんなにずっと使ってもらうことを意図してなく、かつその頃はブロガーでしたので、自分のサイトの集客に使えればいいかな程度のことを考えました。そのため作ったPythonコードをなんの手も加えずに動作させられるように、GCE(Google Computer Engine)にてComputer EngineにてバーチャルマシンにLinuxを搭載したものを借りて運用を開始しました。
他の選択肢も考えたのですが、定時実行(Cron機能)を気軽に使えることを念頭に結局選んだ感じです。このときにCloud Functionsなどに移行する努力をしていればなと、後日後悔をします。
ブログに記載するための記事もPythonで描写しそのままWordPressにアップロードします。これを1時間ごとに行う仕組みです。
モダンなサイトのスクレイピング
このあとマイクリ内マーケットやその他のサイトからデータを取得するときにそのモダンなページにはPythonの基本的な機能では太刀打ちできないことが判明します。多くのモダンなサイトはJavaScriptを動作させた後にブラウザに実際のデータを描写できるようにしています。この動作をトレースしないとデータがスクレイピングできないことになります。
ここで仕方なく puppeteerを導入することにしました。これは、google社の提供している、Chromeのヘッドレスコントローラです。これを使うとプログラムで人間がChromeで行っていることを再現することができます。現在のモダンサイトのスクレイピングではイチオシの方法です。
このライブラリは Node(Java Scriptベースのサーバーサイド言語)にて使うものなのでここで仕方なくNodeにてマイクリやmiimeのサイトなどからデータを取得するスクレイピングエンジンを開発します。
このエンジンの開発過程においてマイクリのサイトについてはログインの壁や、どんどんふえていく出品量に苦慮しました。APIなどでテキストで取得できるOpenSeaと異なり、実際に内部的にChromeを動作させながらデータを取得するのはコンピュータパワーを大幅に消費します。
モダンなサイトのデータ取得にはコストがかかる
僕の借りていたサーバーは初期ではほぼ無料のプランを使っていましたが、あっという間に高性能なプランに変更せざる終えませんでした。
いろいろ最適化や分散化をプログラムに施し、サーバーの性能を落としたりしてみましたが、一回コケてしまうとChromeのデーモン(ゾンビみたいなもの)が残り、動作が不安定になり、最後はサーバーがクラッシュしてしまいます。
結局小手先の改善はあまり効果がありませんでした。
何度も泣きました
最終的には今年の3月にCloud Function を用いた分散処理型データ収集構造を構築して大幅にコストを下げることに成功しました。これによりサーバー代のコストは激減しました。さっさとやればよかった。他のサービスも含まれているので多少の誤差があれ高コストな青色で示されたサーバー代がオレンジ色のCloud Functionに集約されました。
10分の1のコストを実現しました
Cloud Functionでも使うコンピュータのパワーは良い性能が必要なのですが、ずっとサーバーを借りる方式とことなり、使用している時間のみのモダンな仕組みがコストにも直接に効いてきたのです。
手作りのリファレンス
OpenSea以外のサイトからのデータ取得の場合は、整合性を取るためにアイテム番号に基づいた、リファレンスの辞書が内部的に必要でした。ただ、初期は数も少なかったので手動で、csvでサクッとつくってしまいました。そのため、ヒーローの発売のたびに手動でデータの更新をする必要がでてきてしまいました。最終的にはAPIを使い辞書を自動メンテナンスする仕組みが整っており、手をはなれていますが、初期にはんぺーさんによく誤字を指摘されたものです。それもいい思い出です。
広告を乗せる
こちらは課金はしていません。相互宣伝を行っていただいた方にお礼として好きなアイテムの箇所にバナーを載せますということを行いました。気がついた方もいるかなと思いますが、これもプログラムで自動に掲載されるようにしていました。垂水さん、グリティさん、キヨスイさんの3人です。相互宣伝の場として活用できほんとにありがたかったです。
反省点
フロントエンドの移行ミス
最終的に現在もフロントエンドはワードプレスのままです。
ワードプレスでの表現力には限界があります。Java Scriptを埋められないことは無いのですが、あまりにも面倒な手続きが必要でソート機能やグラフ機能を断念していました。
ReactやVueなどで構築した別のサイトを構築すればよかったのですが、そのうちやろうやろうと思っていました。そのうちはいけません。
他のサイトで類似のサービスがガンガン始まって、機能も豊富です。あっという間にモチベーションが下がり手をつけずに放置してしまった。
これは早期に判断して別途サイトを構築してサービスをブーストさせるべきだったと今では思います。NFTの価格.comにするという志をもっていたのに、僕は何をしていたんでしょうか?ほんとうに自分が残念です
汎用的なプログラム構造ではなかった
あたらしいサイトの対応のたびにコピペしてエンジンをつくっていました。OpenSeaのデータ処理部分はHeroとItemで別コードが動いています。重複する箇所も多くメンテナンスせいのとても低いものでした。このあたり、初期からしっかり設計しておけばメンテンナンスもとても楽だったと思います。
数千行のコードを見るたびに半分のコード量でつくれるなと思ったものです。でも大掛かりな修正はOpenSeaのコードでは結局おこないませんでした。たのコードはFunctionsに移行するときに、洗練させてスッキリさせています。
OpenSea
OpenSeaのアフィについては実は個人とビジネスでの対応の差があります。初期はAPIを取得したのですが、普通にOpenSeaの方を話さず運営をおこなっていたため、個人として扱われていましたので一番繁盛していたときの売上を損失していたと思います。
ある日、動作確認の為にOpenSeaの方とお話したところ、ビジネスとしてのアフィの扱いと個人は違うから云々ありました。ただ、実績をもとに君のサイトはちゃんとしているので、ビジネスサイトとして扱おうとなりました。もし、あなたがビジネスでOpenSeaと付き合う場合はしっかりと運営さんとお話しましょう。
最後に
なぜ停止するかというとサイトにたいするアクセスの激減とデータ取得に関する2つのポイントにより決定しました。
最近マイクリサイト自体の不安定が多く報告されました。マイクリサイトからの情報取得をやめることにしました。ゲームが主体ですので1%でも迷惑になる可能性のあることをやめることに。
OpenSeaからのデータ取得が最近安定しておらずアイテムのデータが取得できないことが増えました。これについては多少調べましたが改善ができませんでした。
こういった背景で100%サービスを停止することを決定しました。再度になりますが、多く方に使っていただけたサービスを提供することができ本当にありがたかったです。
次回のサービスではWordPressは使用せずに行う予定でおります。今後とも皆様のブロックチェーンゲームライフが楽しいものでありますように
2020年5月13日
ここに記す