featured_image
2023-11-17
Image: Created with ChatGPT and DALL-E by OpenAI

iPhoneアプリの課金売り上げランキング(いわゆるトップセールスランキング)を公式APIから取得する、2023年11月現在使用可能な手法

いまだに生き残っている古いAPIをどうにか使ってセルランを取る方法

KEY POINTS
  • Appleは積極的に課金売り上げランキングを取得させてくれる感じではない
  • 2021年10月後半に新しい形式のAPIが登場したが、そのAPIでは課金売り上げランキングの取得経路が塞がれている
  • 最新型ツールからはランキングを取れないので、最初期からある旧式のAPIを使う必要がある

アプリの課金売り上げランキング、口語ではセルランと略されるランキングがあります。これはとくにモバイルゲーム業界においては何かと気になってしまうものだと思います。
なのでiPhoneアプリのランキングの簡易表示を行うBotを作り、Slack上でランキングを取り出せるような仕組みを私の現在の職場では導入しています。

実はこのランキングの源泉となるデータは調査会社が提供するサンプリングデータではなく、Appleが公式提供しているものを使っています。
そして公式データの割に使用例をあまり見かけない気がします。なので具体的な取得方法をこの記事で説明しようと思います。


いきなり結論

まず結論を言ってしまえば 最初期からある旧式のAPIを、それっぽく使う が答えになります。oh.......
それっぽくというのは勘で見つけたパラメータを使うからです。公式ドキュメントなんて上等なものは現存しません。だから「あまり見かけない」のです。
検索エンジンやGitHubを駆使すれば断片的な情報を得ることができるかもしれません。とはいえもはやこれは ロストテクノロジー に分類されるものでしょう。

この旧式APIの状況は非常に不明瞭です。以下のようなことがいつまでできるかわかりません。
この記事ではまず自分の知っている直近の状況について軽く説明を行い、そのあとで具体的な方法を説明しています。

私の知る直近の状況

これは非公式なもので、あくまでも外野から見た様相でしかありません。
実際どうなってるのかはAppleのみぞ知るという感じです。

かつて(2010年ごろ?〜2021年4月以前)の状況

かつては以下の2つのAPIにて課金売り上げランキングを取得することができました。

  • http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa から始まるURLを使うもの
    • https://www.apple.com/jp/rss/ で公開されている
    • おそらく最初期からある旧式API
    • 見るからに古そうで放置気味だが、とりあえず機能はしている
    • APIの開発者向け公式ドキュメントは現在見当たらない
      • Qiitaや個人ブログに残された10年くらい前の古い記録からすると、昔はドキュメントが存在していたと思われる
  • https://rss.itunes.apple.com/api/v1 から始まるURLを使うもの
    • かつてはRSSフィードジェネレーターというツール https://rss.itunes.apple.com/ja-jp で生成できていた
    • これもまあ、古そうな見た目のジェネレーターだったが前者よりはあきらかに新しいものだった
    • 2023年現在使用不可

2021年4月以後の状況

自分が知る限りでは2021年4月以後にいろいろと挙動が怪しくなり、ほぼ無告知で状態が変化するようになりました。

2021年4月

  • https://rss.itunes.apple.com/api/v1 の課金売り上げ情報(top-grossing)が更新されなくなる現象が発生
  • 自分の観測範囲では、2021-04-12以降の情報が取れなくなっていた
  • RSSジェネレーターは当時一応機能はしていた

2021年8月ぐらい?

2021年10月後半

  • (おそらく)無告知で新方式に変わり、v1が廃止される
    • 最初期からある旧式APIは廃止されていない
  • セルラン分析サイト管理人の悲痛なツイート https://twitter.com/game_idaa/status/1448558011224449025
  • ジェネレーターのURLが https://rss.applemarketingtools.com/ に変更
  • 今風の見た目のジェネレーターに更新
  • APIが https://rss.applemarketingtools.com/api/v2 から始まるURLを使用しており、バージョンがv2に変わっている
  • 一見v1と互換性があるように見えるが、v1に存在した一部の機能がオミットされている
    • 課金売り上げ情報(top-grossing)を取れなくなった
    • 取得上限が厳しくなった

2023年11月現在

  • 先述の通り、新型API(v2)ではtop-grossingが取れない
  • 最初期からある旧式APIはどういうわけかいまだに生きており、こちらではtop-grossingが取得可能

旧式APIを実際に使用して、課金売り上げランキングを取得する

注意点

iPhoneアプリ以外のアプリがランクインする可能性がある

App StoreはiPhoneに限りません。このAPIのレスポンスにはMacの買い切り系アプリが含まれる可能性もあります。
まあ実際にはiPhone/iPadアプリが圧倒的多数なので無視できるのですが、一部の国や地域では Macのアプリがランクインする ことがたまにあります。
総売上そのものが小さい地域においては、少数の高価な買い切りソフトが大きく影響を及ぼすというだけであるとは思います。

もしこれを使ってBotか何かを作る場合、特に日本国外のランキングを取得するのであれば iPhoneアプリ以外がランクインしても問題ない作りにしておく必要 があります。
過去にどこかの国のとあるジャンルのランキングに「Final Cut Pro」が突如ランクインしていたことが実際にありました。

アプリ名が日本語で出てくるとは限らない

複数国で展開しているアプリはアプリ名が日本語で出てこない可能性があります。
たとえば「崩壊」シリーズは「Honkai」という名前で出てくるし、「荒野行動」は「Knives Out」になります。

データの仕様を明確に定めたドキュメントが見当たらない

なので現状の実データを見た上でパーサーを作る必要があります。

URLの構造

https://www.apple.com/jp/rss/ にて公開されている「トップ10ソング」のURLを見てみると以下のようになっています。

http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topsongs/sf=143462/limit=10/xml

大体想像がつくと思いますが、このような構造になっています。設定できるパラメータは他にもジャンル指定等いろいろあるようですが主要なものだけ説明しています。

http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/[取得したい情報の種類]/sf=[国や地域を示すID]/limit=[取得上限]/[形式]

「取得したい情報の種類」について

言うまでもなくこれが全部ではないです

  • topfreeapplications: 無料アプリ
  • toppaidapplications: 有料アプリ
  • topgrossingapplications: 売り上げの多いアプリ
    • これは当てずっぽうで見つけた(なので例のページにリンクがない)

「国や地域を示すID」について

これも各自で調べるしかないのですが、私の調査によって以下の国・地域に関しては判明しています

  • 日本: 143462
  • 香港: 143463
  • 台湾: 143470
  • マカオ: 143515

「形式」について

少なくとも xml json を選べるようです。

以上をふまえて、旧式APIを使って日本の売り上げトップ10アプリを取得する具体例

URLの例

以下のようなURLで情報を取得できます。curlか何かでダウンロード可能です。

http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topgrossingapplications/sf=143462/limit=10/json

プログラムでのおおざっぱな実装例

ここではPythonを例にしますが、多くの言語で容易に実装できるはずです。
やっていることはデータの取得とJSONのパースだけです。

import requests
from functools import cached_property


class TopGrossing:
    COUNTRY_IDS = {
        "jp": 143462,
        "tw": 143470,
    }

    def __init__(self, country="jp", limit=10):
        self.country_id = self.COUNTRY_IDS[country]
        self.limit = limit

    @property
    def url(self):
        return f"http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topgrossingapplications/sf={self.country_id}/limit={self.limit}/json"

    @cached_property
    def entries(self):
        return requests.get(self.url).json()["feed"]["entry"]

    def print_results(self):
        for i in range(self.limit):
            rank = i + 1
            print(
                f"第{rank}位 {self.get_app_name(rank)} {self.get_app_store_preview_link(rank)}"
            )

    def get_app_name(self, rank: int) -> str:
        return self.entries[rank - 1]["im:name"]["label"]

    def get_app_store_preview_link(self, rank: int) -> str:
        return self.entries[rank - 1]["link"][0]["attributes"]["href"].split("?")[0]

実行

tg = TopGrossing()
tg.print_results()
第1位 ピッコマ https://apps.apple.com/jp/app/%E3%83%94%E3%83%83%E3%82%B3%E3%83%9E/id1091496983
第2位 LINEマンガ https://apps.apple.com/jp/app/line%E3%83%9E%E3%83%B3%E3%82%AC/id597088068
第3位 eFootball™ 2024 https://apps.apple.com/jp/app/efootball-2024/id1117270703
第4位 YouTube: Watch, Listen, Stream https://apps.apple.com/jp/app/youtube-watch-listen-stream/id544007664
第5位 GODDESS OF VICTORY: NIKKE https://apps.apple.com/jp/app/goddess-of-victory-nikke/id1585915174
第6位 モンスターストライク https://apps.apple.com/jp/app/%E3%83%A2%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%B9%E3%83%88%E3%83%A9%E3%82%A4%E3%82%AF/id658511662
第7位 プロ野球スピリッツA https://apps.apple.com/jp/app/%E3%83%97%E3%83%AD%E9%87%8E%E7%90%83%E3%82%B9%E3%83%94%E3%83%AA%E3%83%83%E3%83%84%EF%BD%81/id940320341
第8位 Puzzle & Dragons https://apps.apple.com/jp/app/puzzle-dragons/id493470467
第9位 Knives Out https://apps.apple.com/jp/app/knives-out/id1312031248
第10位 TikTok -Global Video Community https://apps.apple.com/jp/app/tiktok-global-video-community/id1235601864