ブログで外部の情報を共有したいときに、カードに基本情報を載せつつリアルタイム性も持たせたくて、いくつかの API を集めました。記事を書く際に [share url] [/share] というショートコードを挿入するだけで自動解析が可能です。共有したい URL を入力するだけで追加の情報は不要、とても便利です。
ゲーム情報
Steam ゲーム情報
Steam ゲームを共有する最も簡単な方法は、公式提供のウィジェットを iframe タグで呼び出すことです:
しかし Steam は半ば壁越しの状態なため、読み込み速度は実に痛々しく、場合によってはまったく読み込めない地域もあります(例:私の家😣)。同様に、Steam ゲーム情報 API https://store.steampowered.com/api/appdetails も読み込み速度の関係であまりおすすめできません。
小黑盒 API
ここでは小黑盒の API https://api.xiaoheihe.cn/game/web/get_game_detail の利用を推奨します。
必須パラメータは現在のタイムスタンプ _time と Steam ゲーム ID appid です。例: https://api.xiaoheihe.cn/game/web/get_game_detail/?_time=1663404056&appid=289070。
リクエスト時に os_type=web&version=999.0.2 の 2 パラメータを付与する場合は、さらに hkey パラメータが必要となり、付けないと「hkey は空にできません」と表示されます。ネット上には最新の hkey 計算アルゴリズムが存在せず、かつ頻繁に変更されるため、調査する時間は割きません。現時点では一部のゲームはどうやら hkey パラメータなしでは価格情報が返却されないため、利用時は降格処理を入れておく必要があります。
Steam API
Steam API の必須パラメータはゲーム ID appids です。ゲームの地域 cc=cn を付けると返却価格が人民元(CNY)になります。また l=schinese パラメータを付けるとタグやゲーム説明文などが中国語テキストに置き換わります(パブリッシャーが中国語ローカライズを行っている場合)。
Steam API は非常に大量の情報を返却し、小黑盒 API と比べてデータ量は約 2 倍で、遅い読み込み速度をさらに悪化させます。このような状況に対して Steam は filters パラメータを提供しており、必要な情報だけを指定・フィルタリングできます。ただしこのパラメータはオブジェクトコレクション(中括弧{}または角括弧[]で囲まれたデータ構造)のみをフィルタリングできるため、filters 使用時はゲーム名 name などの非オブジェクトコレクションデータは除外されます。現時点でこの制限を解決する方法は見つかっていません。使用例: https://store.steampowered.com/api/appdetails/?appids=814380&cc=cn&l=schinese。
Noteちなみに小黑盒 API が返却する価格・割引はすべて小黑盒独自のもので、Steam の価格・割引ではありません。
解析結果は以下の通り:
ゲーム対応プラットフォームリンク
プラットフォームごとのストアページリンクを取得するには、各プラットフォームの API(通常は検索 API)を直接使用する必要があります。
Steam
Steam プラットフォームでは、steam_appid を基準 URL https://store.steampowered.com/app/ に連結してゲームリンクを構築できます。
例:《オーバークック 2》のリンクは https://store.steampowered.com/app/728880 です。
Switch
Switch プラットフォームのゲーム検索は https://search.nintendo.jp/nintendo_soft/search.json API で実現可能で、キーパラメータ q はゲーム名を表し、英語または日本語に対応しています。中国語名を直接使用しても、例えば q=あつまれ どうぶつの森 のようにしてもゲーム情報は取得できません。
例:《ゼノブレイド3》(Xenoblade 3)の API URL は https://search.nintendo.jp/nintendo_soft/search.json?q=Xenoblade3 です。API 返却の id 値を使って Switch ストアリンクを構築できます: https://store-jp.nintendo.com/list/software/70010000053335.html。
Ubisoft
Ubisoft プラットフォームのゲーム検索 API は https://zh-cn.ubisoft.com/news2/search_name で、game_keyword パラメータが必要で中国語ゲーム名検索に対応しています。
例:《スカルアンドボーンズ》を検索する API URL は https://zh-cn.ubisoft.com/news2/search_name?game_keyword=碧海黑帆 です。
返却された gameabb 値を https://zh-cn.ubisoft.com に連結するとゲームリンクが得られます: https://zh-cn.ubisoft.com/skull_and_bones。
Blizzard
Warning💩 検索精度の低さ警告
Blizzard プラットフォームの検索は不正確な結果が出ることがあります。
Blizzard プラットフォームのゲーム検索 API は https://tw.shop.battle.net/api/search で、q(ゲーム名)と l(言語コード、例: en-us または zh-tw)の 2 パラメータが必要です。
例:《Warcraft III: Reforged》を検索する API URL は https://tw.shop.battle.net/api/search?q=Warcraft III: Reforged&l=en-us です。返却データの destination を https://tw.shop.battle.net/zh-tw ベース URL に連結してゲームリンクを構築できます: https://tw.shop.battle.net/zh-tw/product/warcraft-iii-reforged。
その他のプラットフォーム
Playstation、Xbox、iOS などについては直接的な API が見つかっていないため、通常はクローラーでゲームリンクを取得しています。
Epic は暗号化パラメータとアンチクロール戦略を採用しており、Origin プラットフォームには公開 API がないため、これらのプラットフォームでは小黑盒が提供するゲームリンクを直接使用します。
Bilibili 情報
動画
Steam ゲームカード共有と同様に、Bilibili も iframe タグで動画情報を共有できます:

Bilibili 共有
Bilibili 動画情報 API の呼び出しは比較的簡単で、動画の BV 番号または AV 番号を表すパラメータ bvid または aid のみが必要です。例: https://api.bilibili.com/x/web-interface/view?bvid=1NT411u7n9。
解析結果は以下の通り:
ダイナミクス
Bilibili ダイナミクス情報 API もシンプルで、ダイナミクスを表すパラメータ id と、オプションでタイムゾーンオフセット(分単位、デフォルトは -480)の timezone_offset が必要です。例: https://api.bilibili.com/x/polymer/web-dynamic/v1/detail?id=706453546894098487。
Noteダイナミクスコンテンツ配列
rich_text_nodesはスタンプを配列の区切り文字として使用します。例えば「これはテキストだよ[ハートをあげる]もっとテキスト」という文は配列内で 3 要素に分かれます:これはテキストだよ、[ハートをあげる]、もっとテキスト。したがって配列を走査して要素を連結することで完全なダイナミクスコンテンツを取得します。
弾幕
弾幕情報 API には動画の oid パラメータ、つまり動画の cid が必要で、動画情報 API で取得できます。例: cid が 834814323 の動画の弾幕を取得する: https://api.bilibili.com/x/v1/dm/list.so?oid=834814323 。API は XML 形式でデータを返却します。
Note
1.動画の
cidと動画の AV/BV 番号は同一概念ではありません。例: BV 番号 1NT411u7n9 の動画に対応するcidは 834814323 です。
- 返却データは deflate 圧縮されており、解凍処理が必要です。PHP では
gzinflate()関数で解凍できます。
以下のデータに注目:
<maxlimit>タグには動画の最大弾幕数が含まれます。<state>タグは動画弾幕が開放されているかを表し、0は正常に弾幕送信可能、1は弾幕送信機能が無効です。<d p="114.63900,1,25,16777215,1673445087,0,xxxxxxxx,yyyyyyyyyyyyyyyyyyy,10"> 圧力はついに二創に移った</d>タグには各弾幕の詳細情報が含まれます。詳細は bilibili-API-collect 属性 p を参照。これにより、内容圧力はついに二創に移ったの弾幕が動画の114.639 秒に出現し、通常右から左へスクロールする弾幕で、フォントサイズは標準、フォントカラーは白、2023 年 1 月 11 日 21 時 51 分 27 秒に送信(タイムスタンプ 1673445087)、弾幕プールタイプは通常弾幕、送信者 mid の HASH は 8 桁の英数字 xxxxxxxx、弾幕 dmid は 19 桁の数字 yyyyyyyyyyyyyyyyyyy、弾幕ブロックレベルが 10 より大きい場合にこの弾幕をブロックできることが分かります。
Github リポジトリ情報
同様に Github リポジトリ情報 API もシンプルで、https://api.github.com/repos/ に {ユーザー名}/{リポジトリ名} を連結するだけです。例: https://api.github.com/repos/SocialSisterYi/bilibili-API-collect 。
解析結果は以下の通り:
ブログ記事/ページ情報
Typecho を最新の 1.2 バージョンにアップグレードしたところ、記事情報を出力するプラグインが使えなくなったため、自分で機能を追加することにしました。
Function.php に以下を追加:
次に独立ページテンプレートを新規作成し、URL パラメータを取得して getCustom() を呼び出します。
最後に管理画面で独立ページを追加し、テンプレートに記事情報を選択します。記事 cid またはページ slug に対応するパラメータ uid のみを受け取り、記事呼び出し例:https://vinking.top/getInfo.html?uid=67 、独立ページ呼び出し例:https://vinking.top/getInfo.html?uid=about 。
記事解析結果は以下の通り:
現時点ではこれら最もよく使われる API のみを使用しており、さらに外部解析が必要になったらその時に実装します🙈。
通常 URL 解析
最近、通常ページを解析できる API を書きましたが、一部 URL で解析失敗する場合があります、とりあえず使ってください...
2022.12.3:最適化により、さまざまなサイトでの互換性が大幅に向上しました。
Title と Description がともに解析成功
URL Title 解析失敗
《原神》公式サイトを例にとると、下図からページの title タグ内容が config.54af175465c7448a0fa377d065a2d6da.js という js ファイルで動的に生成されていることが分かり、ページが完全に読み込まれる前の静的 HTML には <title> タグが含まれないため、ページタイトルを直接取得できません。
しかしこのページでは keywords メタデータが定義されているため、<title> タグが取得できない場合は keywords の最初の値を解析後のタイトルとして採用します。これは keywords の最初の値が通常ページタイトルと一致し、他に明確なページタイトル情報がない場合に有効な代替手段となるためです。

Title 解析失敗の例
URL Description 解析失敗
URL が存在しない
国内からのアクセスがタイムアウト
国内からのアクセスがタイムアウトした場合は自動的にプロキシで再試行し、再びタイムアウトした場合は「URL が存在しない」として降格処理します