💥

拡散可能性について考えていたら cluster をハックしていた話

2024/12/25に公開

この記事は クラスター Advent Calendar 2024 の 25日目の記事です。

はじめに

こんにちは Smith です、クラスター株式会社のプラットフォーム事業部でプロダクトマネージャーをやっています。
クラスター株式会社では、バーチャル空間向けのコンテンツを作ったり誰かが作った様々なコンテンツを楽しめる cluster というサービスを提供しています。

困ったぞ

みなさんは cluster で 「推しのイベントだけリストでくれー!」 なんて思ったことはありませんか?
色々なことを棚に上げて言うと、私はあります。
「なので、作っちゃいましょう!」という記事ではないですが、そういうものを作りました。

できた

できました。

推しているユーザーの cluster.mu 上でのプロフィールベージの URL を登録すると、そのユーザーの今後開催予定のイベントが表示されます。
ユーザーは複数登録できます。

https://dolow.github.io/cluster_fetcher/

免責

この記事では cluster.mu で公開されている Web API を利用していますが、ユーザーによる API の再利用を想定して Web API が公開されているわけではありません。

それ以外の理由でも事前の告知なく仕様変更したり使えなくなったりする可能性があります。

また、仕様においては公知の情報のみで構成しているため本質的には迂遠な仕様や実装があります、ご了承ください。

ざっくり作り方

12/25 に間に合わせるためにかなりダッシュで書きます。(現在 22:36)

データソースの確認

まずは推しのイベント情報を手に入れていれるための通常の方法を確認しましょう。
未ログインでも手に入れられる情報が良いです。
色々はしょると、cluster.mu で推しのユーザーID で検索した結果が色々な事情を鑑みてもちょうど良さそうです。

データ取得検証

情報ソースが見つかったらやることは一つですね、ブラウザの開発者ツールを立ち上げましょう。
このページのロード中に発生する通信の中からそれっぽいものに目星をつけます。
いかにもな感じのリクエストがあったのでレスポンスを見ていると、どうやらこれが目当てのリクエストのようです。
幸い、このページは未ログインでも閲覧できるページのようなので、Web API も認証なしでデータを返してくれることが期待できます。

1

2

念の為、認証情報が必要かどうかを軽く手元で確認します。

% curl "https://api.cluster.mu/v1/events/search?q=hello_cluster&fromDate=20241101&toDate=20241231&includeClosed=true&pageSize=40"

レスポンスは帰ってきたものの、なんか良からぬ雰囲気です。

{"id":"pXXpefXN","code":"invalid_request","status":400,"detail":"missing required HTTP header \"X-Cluster-App-Version\"; missing required HTTP header \"X-Cluster-Device\"; missing required HTTP header \"X-Cluster-Platform\"","meta":{"name":"X-Cluster-Platform"}}

この API を使ってくれと言わんばかりの親切なエラーレスポンスですね!
HTTP ヘッダーが足りないよという親切なエラーが返ってきたので、実際のブラウザからのリクエスト内容を参考にヘッダーを付与します。

% curl -H "X-Cluster-App-Version: 3.14.2412091240" -H "X-Cluster-Device: Web" -H "X-Cluster-Platform: Web" "https://api.cluster.mu/v1/events/search?q=hello_cluster&fromDate=20241101&toDate=20241231&includeClosed=true&pageSize=40"

それっぽいレスポンスが返ってきた!

データ取得の検証が成功したらもう出来たも同然で、後は手を動かすだけす。

構成を考える

普段の私ならここで飽きていますが、記事を書くためにちゃんと全部作ります。

適当な Web サイトを作ってそこで推しのイベント一覧を表示しようと思います。
この際に問題になるのが CORS というブラウザのセキュリティ仕様です。
あるサイト(ドメイン)から別のサイト(ドメイン)の情報をそのまま取得することはできません。
なのでイベント一覧を表示するためのサイトに加え、簡単なサーバーも作ります。
フロントエンドから GAS にイベントデータをリクエストし、GAS が cluster.mu から取得する、という構成です。

用意しなければならないのは以下のふたつ。

  • イベントのデータをアグリゲーションするサーバー
  • アグリゲーションされたデータをいい感じに表示するフロントエンド

イベントのデータをアグリゲーションするサーバー

取得したイベント情報は永続化しておく必要はないので、都度取得することにします。 (cluster サーバーごめん)
なので DB 不要です、 今回は GAS で簡単な Web API を作ります。

GAS のソースはコチラ。

https://gist.github.com/dolow/1d1375bd443ea10d8f67a17ca92b2794

この GAS では、ユーザーID(@から始まるやつの@抜き)を受け取った分だけ cluster.mu からイベント検索します。
今回は過去のイベントは取らないことにしたので、 Web API がリクエストを受けた日から 30日後までのイベントを対象とします。
あとはとても長いメソッドチェーンでいい感じにアグリゲーションして、出来上がった配列をレスポンスします。

アグリゲーションされたデータをいい感じに表示するフロントエンド

GAS を Web API としてデプロイしたら、それを叩いて情報を取得していい感じに表示するフロントエンドを作ります。
今回は Svelte を採用しました、Svelte プロジェクトはコチラ。

https://github.com/dolow/cluster-event-fetcher

プロジェクトと言っても、自分が実装したのは実質的に下記のファイルのみです。

src/routes/+page.svelte

ここでは、このページを閲覧したユーザーがリストに含めたいユーザーを自分で登録します。
画面上部のテキスト入力フィールドに、対象のユーザーの cluster.mu でのプロフィール画面の URL を入力することで登録ができます。
登録は複数のユーザーが登録できます。

3

登録するかリロードすると GAS の Web API にリクエストを飛ばし、GAS が取ってきたイベント情報を受け取ります。

フロントエンドでは受け取った情報はユーザー毎に日付の近い順で表示します。


何が言いたいかと言うと

この記事の目的は推しのユーザーのイベント一覧が取得できるプロジェクトの解説ではありません。
拡散可能なメディアやコンテンツというものについて考えた話です。

cluster はバーチャル空間がコア価値ですが、何かをつくるという点においてはバーチャル空間周辺のデータも再利用可能な重要な存在です。
現状、再利用を想定して公開されている Web API はありませんが、なんらかの形で cluster 自体の二次、三次創作が現れるのは大歓迎です。
n次創作が現れるということは、オリジナルにそれなりの価値があり、更にユーザーが独自に価値を追加したり改変したりして多様な価値を生むポテンシャルやそれを許容する土壌がある、ということです。

Henry Jenkins というメディア学者が著した論文に "If It Doesn't Spread, It's Dead" というタイトルのものがあります。
この論文では、「消費者の手によって価値が変換されたり付加されたりという形で拡散されないメディアは死んでいる」としています。

https://henryjenkins.org/blog/2009/02/if_it_doesnt_spread_its_dead_p_1.html

今回は cluster で扱っているデータを(半ば強引に)二次創作として拡散可能なメディアとして体現したサービスを作ってみました。
cluster のコアである空間内のエンティティは基本的には UGC によるものなので、プラットフォームとして一概に二次創作、三次創作を許容するわけにはいきません。
それでもクリエイターが許した場合には、 n次創作による作品自体の自律的な成長機会が与えられないかと考えています。

来年以降は機能や仕組みとして、そういった化学反応がなにか起こせないかと考えているので気長にお待ち下さい。

そんじゃ良いお年を、アリーヴェデルチ!

Discussion