デッキエディタ開発記録 vol.11 – 今更公式APIに気付く

2019年2月17日

ちょっとショッキングな事があったので報告。

なんと、ウィザーズ社が公式に全カードデータ(※恐らく画像も)を引っ張って来れるAPIを提供していました。

Magic: The Gathering Developers

何故か「ユーザーが勝手にやれば良いよ」的な事だと思い込んでいたので、公式のAPIを探すと言う発想がそもそも私には無かったようです。

マジか…!

正直今の心境は「1割の愕然」「9割の喜び」です。

ドキュメントを流し読みしただけですが、これはとんでもないオモチャを手に入れてしまったかも知れません。

 


早速触ってみよう

このAPIはhttpsプロトコルでパラメータを投げたら、JSONデータが返ってくるベーシックなヤツです。

あとはパースして焼くなり煮るなり好きにしたまえって事ですね。

一応利用制限があって、サードパーティ製(※うちのサイトも勿論コレ)のリクエストは5,000回/1時間までだよ、そしてローカルに保存できるのは保存してリクエストを減らしていくのが双方にとって有益だよ、win-winだよ。

って事が書いてあります。

例えば当サイトのエディタとかもローカルDBにデータを保存して、それを使っていますのでwin-winしてるって事になります。

この辺はWEB屋さんのお行儀と言うか、安定性を高めるためとか通信量を減らすためとか考慮するとこうなるって話なんだけど。

中には毎リクエストレスポンスが変化するものとかも有るので、全部が全部保存する訳では無かったりするのですが、それは設計的なお話なので割愛。

そんなつまんない事より、早速カード情報を取得してみましょう!

 


取りあえず適当に取得してみた

かの有名なマロー氏を「本当に凄いんだ!」と言わしめるカラデシュから、レアカードを1枚だけ取得してみた所…凄まじい量のデータがレスポンスされて来ました。

以下「カード1枚だけのデータ」です。

[cards] => Array
        (
            [0] => stdClass Object
                (
                    [name] => Spirebluff Canal
                    [cmc] => 0
                    [colors] => Array
                        (
                        )

                    [colorIdentity] => Array
                        (
                            [0] => R
                            [1] => U
                        )

                    [type] => Land
                    [supertypes] => Array
                        (
                        )

                    [types] => Array
                        (
                            [0] => Land
                        )

                    [subtypes] => Array
                        (
                        )

                    [rarity] => Rare
                    [set] => KLD
                    [setName] => Kaladesh
                    [text] => Spirebluff Canal enters the battlefield tapped unless you control two or fewer other lands.
{T}: Add {U} or {R}.
                    [flavor] => There's so much more to Ghirapur than can be accessed by traditional roads.
                    [artist] => Adam Paquette
                    [number] => 249
                    [layout] => normal
                    [multiverseid] => 417822
                    [imageUrl] => http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=417822&type=card
                    [rulings] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [date] => 2016-09-20
                                    [text] => If one of these lands is your first, second, or third land, it enters the battlefield untapped. If you control three or more other lands, however, it enters the battlefield tapped.
                                )

                            [1] => stdClass Object
                                (
                                    [date] => 2016-09-20
                                    [text] => If one of these lands enters the battlefield at the same time as one or more other lands (due to Oblivion Sower or Warp World, perhaps), it doesn’t take those lands into consideration when determining how many other lands you control.
                                )

                        )

                    [foreignNames] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [name] => Turmklippenkanal
                                    [text] => Der Turmklippenkanal kommt getappt ins Spiel, es sei denn, du kontrollierst zwei oder weniger andere Länder.
{T}: Erhöhe deinen Manavorrat um {U} oder {R}.
                                    [flavor] => Abseits der ausgetretenen Pfade kann man so viel mehr von Ghirapur entdecken.
                                    [imageUrl] => http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=418614&type=card
                                    [language] => German
                                    [multiverseid] => 418614
                                )

                            [1] => stdClass Object
                                (
                                    [name] => Canal riscoaguja
                                    [text] => El Canal riscoaguja entra al campo de batalla girado a menos que controles otras dos o menos tierras.
{T}: Agrega {U} o {R} a tu reserva de maná.
                                    [flavor] => En Ghirapur hay muchos más sitios que aquellos a los que se accede por caminos tradicionales.
                                    [imageUrl] => http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=420462&type=card
                                    [language] => Spanish
                                    [multiverseid] => 420462
                                )

                            [2] => stdClass Object
                                (
                                    [name] => Canal du belvédère
                                    [text] => Le Canal du belvédère arrive sur le champ de bataille engagé à moins que vous ne contrôliez deux autres terrains ou moins.
{T} : Ajoutez {U} ou {R} à votre réserve.
                                    [flavor] => Ghirapur recèle bien d'autres merveilles où ne mènent pas les routes traditionnelles.
                                    [imageUrl] => http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=418878&type=card
                                    [language] => French
                                    [multiverseid] => 418878
                                )

                            [3] => stdClass Object
                                (
                                    [name] => Canale delle Guglie Vertiginose
                                    [text] => Il Canale delle Guglie Vertiginose entra nel campo di battaglia TAPpato a meno che tu non controlli al massimo altre due terre.
{T}: Aggiungi {U} o {R} alla tua riserva di mana.
                                    [flavor] => Molto di ciò che Ghirapur ha da offrire non può essere raggiunto tramite vie tradizionali.
                                    [imageUrl] => http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=419142&type=card
                                    [language] => Italian
                                    [multiverseid] => 419142
                                )

                            [4] => stdClass Object
                                (
                                    [name] => 尖塔断の運河
                                    [text] => あなたがコントロールしている他の土地が3つ以上であるかぎり、尖塔断の運河はタップ状態で戦場に出る。
{T}:あなたのマナ・プールに{U}か{R}を加える。
                                    [flavor] => ギラプールには、昔ながらの道では行けない場所がたくさんある。
                                    [imageUrl] => http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=419406&type=card
                                    [language] => Japanese
                                    [multiverseid] => 419406
                                )

                            [5] => stdClass Object
                                (
                                    [name] => 첨탑 절벽 운하
                                    [text] => 첨탑 절벽 운하는 당신이 다른 대지를 두 개 이하로 조종하지 않는 한 탭된 채로 전장에 들어온다.
{T}: {U}나 {R}를 당신의 마나풀에 담는다.
                                    [flavor] => 기존의 도로를 통하지 않고도 다양한 방법으로 기라푸르에 올 수 있다.
                                    [imageUrl] => http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=419670&type=card
                                    [language] => Korean
                                    [multiverseid] => 419670
                                )

                            [6] => stdClass Object
                                (
                                    [name] => Canal dos Espigões
                                    [text] => Canal dos Espigões entra no campo de batalha virado, a menos que você controle dois outros terrenos ou menos.
{T}: Adicione {U} ou {R} à sua reserva de mana.
                                    [flavor] => Há muito mais em Ghirapur além do que pode ser acessado pelas ruas tradicionais.
                                    [imageUrl] => http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=419934&type=card
                                    [language] => Portuguese (Brazil)
                                    [multiverseid] => 419934
                                )

                            [7] => stdClass Object
                                (
                                    [name] => Путь Крутошпилья
                                    [text] => Путь Крутошпилья выходит на поле битвы повернутым, если под вашим контролем есть не менее трех других земель.
{T}: добавьте {U} или {R} в ваше хранилище маны.
                                    [flavor] => В Гирапуре есть множество мест, куда не попасть по обычным дорогам.
                                    [imageUrl] => http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=420198&type=card
                                    [language] => Russian
                                    [multiverseid] => 420198
                                )

                            [8] => stdClass Object
                                (
                                    [name] => 尖塔崖天渠
                                    [text] => 除非由你操控的其他地数量为两个或更少,否则尖塔崖天渠须横置进战场。
{T}:加{U}或{R}到你的法术力池中。
                                    [flavor] => 数得清吉拉波外万千通路,道不尽吉拉波内无数精彩。
                                    [imageUrl] => http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=418086&type=card
                                    [language] => Chinese Simplified
                                    [multiverseid] => 418086
                                )

                            [9] => stdClass Object
                                (
                                    [name] => 尖塔崖天渠
                                    [text] => 除非由你操控的其他地數量為兩個或更少,否則尖塔崖天渠須橫置進戰場。
{T}:加{U}或{R}到你的魔法力池中。
                                    [flavor] => 數得清吉拉波外萬千通路,道不盡吉拉波內無數精彩。
                                    [imageUrl] => http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=418350&type=card
                                    [language] => Chinese Traditional
                                    [multiverseid] => 418350
                                )

                        )

                    [printings] => Array
                        (
                            [0] => KLD
                            [1] => PKLD
                        )

                    [originalText] => Spirebluff Canal enters the battlefield tapped unless you control two or fewer other lands.
{T}: Add {U} or {R} to your mana pool.
                    [originalType] => Land
                    [legalities] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [format] => 1v1
                                    [legality] => Legal
                                )

                            [1] => stdClass Object
                                (
                                    [format] => Commander
                                    [legality] => Legal
                                )

                            [2] => stdClass Object
                                (
                                    [format] => Duel
                                    [legality] => Legal
                                )

                            [3] => stdClass Object
                                (
                                    [format] => Frontier
                                    [legality] => Legal
                                )

                            [4] => stdClass Object
                                (
                                    [format] => Legacy
                                    [legality] => Legal
                                )

                            [5] => stdClass Object
                                (
                                    [format] => Modern
                                    [legality] => Legal
                                )

                            [6] => stdClass Object
                                (
                                    [format] => Vintage
                                    [legality] => Legal
                                )

                        )

                    [id] => 6ecb3f07-6f12-54fa-99f1-776ec95091e6
                )
        )

ヒューッ!

見ろよやつのデータ量を、まるでトロンみてえだ。

取りあえず私のローカルデータベースには無い情報を見て行きましょう、これにより無駄な新たな機能が追加出来るようになるはずです。

 

colorIdentity

今回サンプルで取得したデータは《尖塔断の運河/Spirebluff Canal》なんですが、理由は「そのカードが出せる色」の情報ってあるのかなーと。

で、これは見事に青と赤をパラメータに持っていました!

念のため、おば賛美のデータも取得してみましょう。

[colors] => Array
        (
                [0] => Green
        )

[colorIdentity] => Array
        (
                [0] => G
                [1] => U
                [2] => W
        )

凄い凄い、これでバーパラ(※バッパラ?ウチのシマではバーパラでした。)が5色表示されれば完璧ですね!

[colors] => Array
        (
                [0] => Green
        )

[colorIdentity] => Array
        (
                [0] => G
        )

What’s

なんか、違うらしい…w

一瞬テキスト欄に書かれているマナシンボルが表示されるのかなと思ったけど、バーパラのテキストにはそもそもマナシンボルは書かれていません。

良く分からないね、残念。

 

number

お目当て2号、これは文句なし!

カードのコレクターナンバーなんですけど、なんかMTG Arenaのデッキリストがインポート/アウトポート出来るらしいじゃないですか?(今更)

そこでコレクターナンバーがフォーマットに含まれていて絶望してたんですよ!

つまりこのナンバーデータをローカルに保存すれば、Arena対応!とかなんかイマドキ感出せるのかなって。

エターナルに手を出し始めたし、MTGOにも対応するのもアリですな。

 

imageUrl

これはいわゆるカード画像へのURLですがpngデータなんですよね…。

http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=417822&type=card

今容量の都合で全画像データをjpgで中画質程度で書き出した物を使っているので、ちょっとコレは重いですね。

自動でjpg変換して保存するスクリプト組む事も出来るけど、コスト考えると微妙な気がする。

今後エターナルでマニアックすぎて画像が手に入らない時とかは使わせてもらいましょう。

 

foreignNames

これが一番驚いてます、英語以外に10ヵ国語

  • カード名
  • テキスト
  • フレーバーテキスト
  • 画像

が詰め込まれています。

マジでこのAPIで全てが手に入るんですねー(遠い目)

 

printings

これも面白いですね、収録されたエディション名一覧。

先ほど取得したバーパラとか凄い事なってますw

[printings] => Array
	(
		[0] => 10E
		[1] => 2ED
		[2] => 3ED
		[3] => 4ED
		[4] => 5ED
		[5] => 6ED
		[6] => 7ED
		[7] => 8ED
		[8] => CED
		[9] => CEI
		[10] => CN2
		[11] => FBB
		[12] => LEA
		[13] => LEB
		[14] => M10
		[15] => M11
		[16] => M12
		[17] => PM11
		[18] => PRM
		[19] => PTC
		[20] => RAV
		[21] => SUM
		[22] => WC00
		[23] => WC01
		[24] => WC02
		[25] => WC98
	)

再録されスギィ。

データとしては使いどころが無さそうだけど、好きです(直球)

 

legalities

ラストはリーガリティ、これかなりクリティカルです!

フォーマット別に使える使えないのデータでしょ?これをローカルに持てば「再録されたカードを全て検索対象」にする事が出来ます、凄い!!

例えば、献身で華麗なる再録を遂げた《吸収/Absorb》はモチロン現スタン環境で使える訳ですが

俺はスタンでもインベイジョン版を使いたいんだ

って要望にもエディタが対応出来るようになる、需要の高いアンステ土地とかも同様に。

 

いやー、これは色々と捗りそうですな。

 


あとがき

カード登録作業をほっぽり出してAPI叩いて遊んでた訳ですが、凄く面白い機能を発見しまして…w

エディションを指定すると、

ブースターパックの中身が生成される

って言う。

コレやばくないですか?リクエストの度に違う結果が返ってくるから、そう言う事なんだと思います。

マスピとかトークンとかどうなるのかちょっと分かんないのでもう少し検証と解析を行ってみますが、こんな面白い機能放っておける訳が無いです!

作りましょう、ブースター開封シミュレータを!!

みんな開封中毒なんでしょ?

エア開封ですら脳汁出しちゃうんでしょ?(偏見)

 


関連記事

デッキエディタ開発記録 vol.12 – デッキ複製機能実装

雑談

Posted by theuri