PythonでScryfallからMagic: the Gatheringのカードの情報をゲットした話

#PyhtonでScryfallの情報を取得するには、Scrythonを使ってください。

**Scrython：　https://github.com/NandaScott/Scrython**

**完**

#以下、おまけ

前回の記事では、Scrythonが使えない代わりに、requestsとbs4でScryfallの情報を取得しました。
前回の記事： https://qiita.com/Takeshi_Sue/items/753efb7d0c4680c31df1

その後、Scryfallからもっと直接的に情報を取得する方法があることを知りました。

以下のおまけでは、その「Scryfallからもっと直接的に情報を取得する方法」について書いていきます。

今回の目標は、以下の二つです
•Scryfallから特定のカードを検索する。
•その特定のカードの裁定を取得する。

#Scryfallとは

Scryfallは、マジック：ザ・ギャザリングのカードを検索できるサイトです。
https://scryfall.com/

公式からも、Gathererというデータベースが提供されています。
https://gatherer.wizards.com/Pages/Default.aspx

一部カードの情報が、公式のGathererからは意図的に消去されているため、個人的にはScryfallの方が好みです。
例：Crusade
Scryfall: https://scryfall.com/card/ddf/27/crusade
Gatherer: https://gatherer.wizards.com/pages/card/Details.aspx?multiverseid=14503

#Scryfallから特定のカードを検索する。

基本的に、「https://api.scryfall.com/cards/search?q=」の先に、 https://scryfall.com/docs/syntax に記載されている通りに検索したい文字列を入れれば、検索されます。

例１：　名前「asmor」で検索

```py
import requests
import pprint

search_query = 'asmor'

cards = requests.get(f"https://api.scryfall.com/cards/search?q={search_query}")

cards_json = cards.json()

print(type(cards_json))
pprint.pprint(cards_json)

```

結果：
![asmor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851956/9544e8a2-6a6d-3f17-7d39-0eab7c52ef55.png)


例２：　オラクルに「draw」を含み、タイプがクリーチャーである。

```py

import requests
import pprint

search_query = 'o:draw t:creature'

cards = requests.get(f"https://api.scryfall.com/cards/search?q={search_query}")

cards_json = cards.json()

print(type(cards_json))
pprint.pprint(cards_json.keys())
pprint.pprint(cards_json['total_cards'])

```

結果：
![draw_creature.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851956/89addb76-d6ef-f45a-dd0f-bda044671523.png)


このようにすれば、特定のカードを探し当てることができます。

#その特定のカードの裁定を取得する。
問題なのは、その特定のカードの裁定はURIとしてリンク先のみ提供されていることです。
例えば、以下のような形でそれがわかります。

```py

import requests

search_query = 'asmor'

cards = requests.get(f"https://api.scryfall.com/cards/search?q={search_query}")

cards_json = cards.json()

print('type(cards_json) = ', type(cards_json), end = '\n\n')

print('cards_json.keys() = ', cards_json.keys(), end = '\n\n')

print("cards_json['data'][0].keys() = ", cards_json['data'][0].keys(), end = '\n\n')

print("cards_json['data'][0]['rulings_uri'] =", cards_json['data'][0]['rulings_uri'])

```

結果：
![URI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851956/2650761e-8a4e-af37-572a-94b82a0436b5.png)


そのため、そのURIから情報を取得します。
以下のような形で、実際の裁定(comment)は、かなり奥深くにあることがわかります。

```py

import requests

search_query = 'asmor'

rulings = requests.get("https://api.scryfall.com/cards/d99a9a7d-d9ca-4c11-80ab-e39d5943a315/rulings")

rulings_json = rulings.json()

print('type(rulings_json) = ', type(rulings_json), end = '\n\n')

print('rulings_json.keys() = ', rulings_json.keys(), end = '\n\n')

print('type(rulings_json["data"]) = ', type(rulings_json["data"]), end = '\n\n')

print('len(rulings_json["data"]) = ', len(rulings_json["data"]), end = '\n\n')

print('rulings_json["data"][0].keys() = ', rulings_json["data"][0].keys(), end = '\n\n')

for key in rulings_json["data"][0]:
  print(f'rulings_json["data"][0][{key}] = {rulings_json["data"][0][key]}', end = '\n\n')

for i in range(len(rulings_json["data"])):
  print(f'rulings_json["data"][{i}]["comment"] = {rulings_json["data"][i]["comment"]}', end = '\n\n')

```

結果：
![comments.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851956/57138fa7-bf29-e39b-8786-602e51f3ce2e.png)



#感想
素直にScrythonを使おう！