ポケモンHOMEの情報をエクセル,CSV形式出力

どうも、おくおくです。
最近は、 Pythonを使うことで対戦補助エクセルの機能性向上を目指し日々尽力しています。
今回ですが、対戦補助エクセルにも入っている「ポケモンHOMEのデータ」を「エクセル」に出力する方法が確立したのでそちらのご報告です。

とりあえず、物から紹介。Windowsならこれをダウンロードして使えばオッケーなはず!Macに関しては詳しくわからないのですが、pythonの中身をコピーして。多少修正してもらえば使えるはずです。
自分の別PCでダウンロード&使用したのですが、ウィルス対策ソフトで危険ですという表示が数回出ました。。
確かにデジタル署名など取ってないので盲目的に信頼してくださいとしか言えない状態です。
exeファイル使用するのが嫌であれば、下記で紹介しているpythonのコードを使ってもらえれば
対戦補助エクセルに必要なcsvは取得できるので、その対応をしてもらっても大丈夫です。
drive.google.com
こちらがexe化したものです。ダウンロードして起動させたら、ポケモンHOMEのjsonファイルとそれから必要な部分を切り取ってcsvとして出力してくれます。

続いて、中身に関してです。基本的には下記サイトに記されていることの合わせ技です。
retrorocket.biz
intellectual-curiosity.tokyo

ポケモンHOMEのAPIをたたいて、JSONファイル(ポケモンHOME内でまとめられている情報)を取得しています。↑のサイトを見るとわかるのですが、一つ目のJSONファイルには各シーズンやルールについて、この番号ですよという数字が決まっており、それを出力してくれます。
その情報をもとにもう一つのAPIをたたくことで、ポケモンの情報が出てきます。
以下がpyhonのコードの中身です。

import requests
import json
import pandas as pd
import sys
import os

#この部分は、EXE化するときに用いる部分。EXE内にjsonファイルからcsvに変換するのに使用するファイルが保存されている。
#そのファイルを読み出すための記述。
def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)

#ここからが、一つ目のAPIをたたくための部分。pythonでたたくときは、headerとdataをここで指定する。
headers = {
    'accept': 'application/json, text/javascript, */*; q=0.01',
    'countrycode': '304',
    'authorization': 'Bearer',
    'langcode': '1',
    'user-agent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Mobile Safari/537.36',
    'content-type': 'application/json',
}

data = '{"soft":"Sw"}'
#↑で設定したheaderとdataを用いてAPIを叩いて得られたjsonファイルを保存している。requestはwebページから情報を取ってくるときに使用できる。
#別アプリで、ポケ徹さんからポケモンや技データを取得した際にもこのrequestを使っている。
response = requests.post('https://api.battle.pokemon-home.com/cbd/competition/rankmatch/list', headers=headers, data=data)
with open("pokemon.json","w",encoding="UTF-8") as f:
    f.write(response.text)

with open("pokemon.json", "r", encoding = "utf-8") as f:
  data = json.load(f)["list"]

# jsonファイルからタームごとに必要な情報だけを配列にまとめる
terms = []
for season in data:
  for id in data[season]:
    terms.append({"id" : id, "season" : data[season][id]["season"], "rule" : data[season][id]["rule"], "rst" : data[season][id]["rst"], "ts1" : data[season][id]["ts1"], "ts2" : data[season][id]["ts2"]})

term = terms[0]
 # terms[0]は最新シーズンのシングルバトルの詳細。対戦環境の取得。
id = str(term["id"])
rst = str(term["rst"])
ts1 = str(term["ts1"])
ts2 = str(term["ts2"])

#1つ目のjsonファイルから得た情報を用いて、ポケモンのデータのまとまったjsonファイルを取得する。
#5つに分かれているので5つ分取得保存。
for x in range(1,6):
    adress = "https://resource.pokemon-home.com/battledata/ranking/"+id+"/"+rst+"/"+ts2+"/pdetail-"+str(x)
    headers = {
        'user-agent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Mobile Safari/537.36',
        'content-type': 'application/json',
    }

    response = requests.get(adress, headers=headers)
    with open("pokemons_file"+str(x)+".json","w",encoding="UTF-8") as f:
        f.write(response.text)

#↑で得られたjsonファイルは技名やポケモン名、アイテム名が番号で記入されている
#技id1は「はたく」、アイテムid1は「マスターボール」など
#これらのidと技名を変換する表を読み込んでる。適当に作ったのでencodingなど違う。
#これら表がほしければご連絡ください。自分で作ってもらってもOKです。
move_df = pd.read_csv(resource_path("move_id.csv"),encoding="shift-jis")
poke_df = pd.read_csv(resource_path("poke_id.csv"), encoding="UTF-8")
item_df = pd.read_csv(resource_path("item_id.csv"),encoding="shift-jis")

#jsonファイルの情報をpandasのデータファイルに保存している。
#jsonファイルの中身を見てもらえればわかるが、ポケモンNo.→リージョンフォーム→「temoti」→[waza]or[item]という形に分かれている。
#それらを取得できるように記述している。
#CSVから対戦補助エクセルに移す都合上、技用のものとアイテム用のものを分けて保存している。
Home_poke =pd.DataFrame()
Home_poke2 = pd.DataFrame()
for y in range(1,6):
    with open("pokemons_file"+str(y)+".json","r") as f:
        json_read = json.load(f)
        for x in json_read:
            id = poke_df[poke_df["id"]==int(x)]
            for y in json_read[x]:
                list=[]
                list2=[]
                name = id[id["リージョン"]==int(y)]
                list.append(name.iloc[0,3])
                list2.append(name.iloc[0,3])
                for z in json_read[x][y]["temoti"]["waza"]:
                    move = move_df[move_df["id"]==int(z["id"])]
                    list.append(move.iloc[0,2])
                    list.append(z["val"])
                Home_poke = Home_poke.append([list])
                for z in json_read[x][y]["temoti"]["motimono"]:
                    item = item_df[item_df["id"]==int(z["id"])]
                    list2.append(item.iloc[0,2])
                    list2.append(z["val"])
                Home_poke2 = Home_poke2.append([list2])

            
#それぞれのデータフレームの列名を名付けて出力。
Home_poke.columns = ["ポケモン名","技1","割合1","技2","割合2","技3","割合3","技4","割合4","技5","割合5","技6","割合6","技7","割合7","技8","割合8","技9","割合9","技10","割合10"]
Home_poke.to_csv("pokeHome_move.csv",encoding="shift-jis")
Home_poke2.columns = ["ポケモン名","アイテム1","割合1","アイテム2","割合2","アイテム3","割合3","アイテム4","割合4","アイテム5","割合5","アイテム6","割合6","アイテム7","割合7","アイテム8","割合8","アイテム9","割合9","アイテム10","割合10"]
Home_poke2.to_csv("pokeHome_item.csv",encoding="shift-jis")

↑のコードでは「idと技名、アイテム名、ポケモン名を変換するcsvファイル」を外部から読み込んでいます。
それを作って読み込めば、後は上記コードのコピペで動くはずです!
jsonファイルやcsvファイルが出力されるので、そちらを対戦補助エクセルにコピペすることで最新のポケモンHOMEの結果をエクセル上で見ながら対戦ができます。エクセルへのコピーに関しては対戦補助エクセルにマクロを作成し、ワンクリックで行えるようにする予定です。

では、本日の記事はここまでとなります。
対戦補助エクセルver4では今回紹介したポケモンHOMEの情報の更新機能のほかに、画像認識機能も付け加える予定です。
続報は気長にお待ちいただければと思います。
では、また会える日を楽しみにしています!