本業が忙しいため趣味プログラミングが滞っていました。かたりぃなです。
自分が書いた実験コードを久しぶりに読むと辛いものがあるので、リハビリを兼ねて簡単なことからやってみます。
今回のお題はカードゲームMTGをもっと楽しく遊べないかというお題でいきます。
タイトルはMTGwikiにしてますが、ほかのREST-APIも試してみます。
その前に、ここではRESt-APIで該当サーバから情報を取得する例を示しますが、もし利用する場合は自己責任でお願いします。
当然のことですがスクレイピングなどの行為は相手サイトに負荷をかけることになるので、その影響がどうなるのかをしっかり考えましょう。
エンジニアとしての良心というかマナーを守りましょうってやつですね。
さて、MTGを楽しく遊びたい。
具体的にはMTGWikiを見ながらデッキを組んでいると困ることがあります。 今回はこれをソフトウェアで解決できないかという検討です。
まずカードゲームではデッキを作るときに色々と戦略を練るわけですが、「どのようなカードを入れると良いか」がアイデアとしてあっても、それを探すにはDBにクエリを投げるような操作が必要です。
上級者が強いと言われるのは、頭の中にあるDBのレコード数が非常に大きく、レスポンスも良いためと考えています。
初心者はその逆ですね。
さて、私自身それほど強いわけでないので、頭の中のDBはそんなに大きくありません。
なのでMTGwikiを見ながらになるのですが、このとき具体的に困る例として次のようなケースがあります。
- どういう能力をもったカードが欲しいのかは解る。でも正式カード名忘れた
- 使いたいカードのイラストはなんとなく覚えてる。でもカード名も能力も忘れた
MTGwikiをゆっくり眺めてればそのうち答えにたどり着くこともありますが、手間がかかりすぎます。
他の解決策として、だいたいのデッキレシピが固まっているのであればショップに行って店員さんにクエリ投げれば解決できそうです。
しかし試行錯誤している中で購入すると、後で「やっぱり違った」みたいになることもあって悲しいです。
というわけで、「少しでもデッキを組みやすくするアプリを作る」のを目標に色々と試します。
ぶっちゃけMTGwikiのカード個別評価ページにカード画像貼りつけできれば解決しそうな気がしますが、画像引用とかしてしまうと権利的にどうなのとか色々あるのでしょう。多分。
今回はプログラムは書きません。APIの仕様をざっと調べるだけに留めます。
情報源として使えそうなAPIとかサイト
公式サイトの検索ページ
http://gatherer.wizards.com/Pages/Default.aspx
API 日本語検索
MTGwiki
wisdom-guild
API 英語検索(他言語でも検索可能)
Magic: The Gathering Developers
https://docs.magicthegathering.io/
とりあえずはこれらを使ってアプリが作れないか考えてみます。
MTG-wikiはルールや評価が細かく載っているので、デッキを組むには最高の情報源です。
ただ、このサイトには不足している情報があります。
他のサイトも同様で、相互に補完関係です。各サイトに掲載されている情報の有無を整理します。
サイト名称 | カード情報の詳細 | カード評価 | ショップ価格 | イラスト | レガシーカード |
---|---|---|---|---|---|
MTGwiki | o | o | x | x | o |
wisdom-guild | o | x | o | x | o |
公式 | o | x | x | o | x |
この表からいえることは、欲しい情報を統一的に扱うにはすべてのサイトから横断的に情報を集めてくる必要がある。ということですね。
とりあえずAPIでアクセスしてみる
上記の各サイトのAPI仕様を調べてみます。
公式
公式のサイトで適当なカード名で検索かけるとこんなのになります。
たとえば「霊体の先達」で検索するとURLはこうなります。
http://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=414057
少々使いにくいですね。パラメータのidが何を表しているものなのかさっぱりわかりません。
そのうえ古いカードを検索しても出てきません。(後述のAPIから検索かけるとひっかかるのですが。。。)
色々と不便なので諦めます。
ただし、このサイトから得られる情報には重要な情報が含まれています。
他のサイトでも同様に取れるのですが、せっかくなのでここで述べておきます。
MTGのオラクル
上記URLを開くと、カードのテキストとは別に「オラクル」というのがあります。 書いてある内容は(基本的に)カードのテキストと同じなのですが、食い違いがあることがあります。
食い違いが発生する原因は、ルールの変更です。
カードゲームなので、あまりに「強すぎる」とか「製作者がそのヤバさに気づかなかった」といった場合にゲームバランスを崩壊させてしまうため、その対応として変更が加えられることがあります。
単純に強すぎるとかの場合は「使用禁止」と御触れが出ることがありますが、状況によってはこのオラクルが変更されることもあります。
この霊体の先達の例では10年くらい前まで「戦場に出たとき」という文言から「手札から戦場に出たとき」という文言に変更されていました。
詳細はこちら
http://mtgwiki.com/wiki/%E9%9C%8A%E4%BD%93%E3%81%AE%E5%85%88%E9%81%94/Karmic_Guide
私の大好きなコンボです。
MTG-wiki
日本語の情報源としては最高です。 このwiki自体はmedia-wiki(wikipediaと同じ)なので、クエリを投げてあげれば結果が返ってきます。
APIのエンドポイントはここ
http://www.mtgwiki.com/api.php?
ページタイトルを指定して情報を取得するにはこんな感じです。
というわけでカード名をtitleパラメータに指定すれば直接そのカードの詳細情報が記載されたページに飛べるのですが、少々使いにくいポイントがあるようです。
たとえば「世界を目覚めさせる者、ニッサ」のページのURLはこうなっています。
“~/wiki/"以降がページタイトルに相当するのですが、エンコードを解くと「世界を目覚めさせる者、ニッサ/Nissa, Worldwaker」という文字列が得られます。これがページタイトルです。 つまりどういうことかというと
title=<日本語カード名>/<英語カード名>のように指定します。
日本語版が発売されていないカードの場合、title=<英語カード名>で指定します。
それぞれのケースで例示します。
「世界を目覚めさせる者、ニッサ/Nissa, Worldwaker」のページの情報を取得する
「Black_Lotus」のページの情報を取得する
このことから、「英語名称」と「日本語名称」の両方をうまく与えることができればページを開けそうです。
wisdom-guild
ここではお値段と、使用可否を取得したいです。ただ、私自身あまり価格を気にしない(高いカードは買わない)主義なので、簡単に調べ方だけメモします。
それになんか注意事項書いてありますし。「あんまり負荷かけるような使い方しないでね」と。
スクレイピングするつもりはないので、どんなインタフェースになっているかだけ軽く調べるだけに留めます。
とりあえず以下のページを開いて検索条件設定すればクエリ文字列が設定されます。
http://whisper.wisdom-guild.net/
「世界を目覚めさせる者、ニッサ」で検索したときのURL
大量のパラメータが見えますが、見た感じGUIでの設定項目とほぼ一致してそうです。 略称から推測するに、設定項目の上から順にパラメータに入っているのでしょう。
というか価格情報だけを取得したいならMTG-wikiのほうからリンク張ってくれてるので、そこから辿ったほうがラクそうです。
Magic: The Gathering Developers
単純なAPIなので使いやすいです。 https://docs.magicthegathering.io/
とりあえずAPIのエンドポイントは https://api.magicthegathering.io/v1/cards
カード名検索は少々工夫が必要ですが、 「世界を目覚めさせる者、ニッサ」で検索する場合 https://api.magicthegathering.io/v1/cards?name=%E4%B8%96%E7%95%8C%E3%82%92%E7%9B%AE%E8%A6%9A%E3%82%81%E3%81%95%E3%81%9B%E3%82%8B%E8%80%85%E3%80%81%E3%83%8B%E3%83%83%E3%82%B5&language=japanese
で取れます。 最後のlanguage=japaneseで「検索名称が日本語」であることを指定します。
取得できるJSONの仕様の細かい部分はマニュアル読むとして、重要ポイントだけ。
- cardsリストには同一カードでもエキスパンションごとに格納される。
- cards[n].nameがカード名称(英語版)
- cards[n].textがオラクル
- cards[n].foreignNamesが各国語訳されたカード名称
- foreignNamesはlanguage要素で言語種別、name要素でその国の言語表現でのカード名が入る
- cards[n].imageUrlにカード画像URL(英語)が入る
- cards[n].foreignNames.imageUrlに各国語版の画像URLが入る
英語版の「世界を目覚めさせる者、ニッサ」の画像URLは http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=383328&type=card
日本語版「世界を目覚めさせる者、ニッサ」の画像URlは http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=385032&type=card
ですね。
画像は存在しない場合もあって、たとえば特殊カードの画像はここからは取れないみたいです。 上記例ではcards[0]にはimageUrl要素がありません。 set=pMEIになっているので、プロモーションカードか何かでしょう。
あと古いカードも検索できるみたいです。全部を試したわけではないので断言できませんが。
たとえば「Black Lotus」で検索
“https://api.magicthegathering.io/v1/cards?name=Black Lotus”
この中のimageUrl要素から画像ページに飛ぶと。。。
http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=298&type=card
いけました。
まとめ
MTGwikiの情報+上記APIを使うことで、デッキ構築に必要な情報がすべて取れそうです。
具体的にどういうアプリ作るとか考えると楽しそうですね。
ただ、wikiを見るだけならビューワ使えばいいわけで、わざわざアプリ作る意味がないです。
もうちょっと目的に特化させてデッキ構築専用アプリ(多言語対応)とかしたほうが実用的な気がします。
それでは今回はこれくらいで。