banner
Vinking

Vinking

你写下的每一个BUG 都是人类反抗被人工智能统治的一颗子弹

先生、この方法で~解析共有のスタンド外情報

時々ブログで外部情報を共有する必要があるため、共有するカードに基本情報を持たせ、リアルタイム性を持たせるためにいくつかの 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 のアルゴリズムは頻繁に変動するため、この件を研究する時間を費やすつもりはありません。現在のところ、一部のゲームはどうやら hkey パラメータなしでは価格情報を返さないようですので、使用する場合はダウングレード処理を行う必要があります。

Steam API#

Steam の API の必要なパラメータはゲームの ID appids で、ゲームの地域を問い合わせるために cc=cn を含めることをお勧めします。これにより、返される価格は人民元(CNY)になります。また、 l=schinese パラメータを含めると、タグやゲームの概要などのテキストが中国語のテキストに置き換えられます(前提として、発行者がゲームページの中国語ローカライズを行っている必要があります)。

最後に、Steam API は非常に多くの情報を返すため、小黒盒 API のデータ量の約 2 倍になり、もともと遅い読み込み速度をさらに悪化させます。このような状況に対処するために、Steam は filters パラメータを提供しており、ユーザーが必要な情報を指定してフィルタリングすることを許可しています。ただし、このパラメータはオブジェクトコレクション(すなわち、中括弧 {} または角括弧 [] で囲まれたデータ構造)をフィルタリングするためのものであることに注意が必要です。つまり、filters パラメータを使用してフィルタリングを行うと、ゲーム名などのすべての非オブジェクトコレクションデータは除外されます。この制限を解決する方法はまだ発見されていません。使用法は次のようになります: 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 タグを使用して動画情報を共有できます:

Bilbili 分享

Bilibili 動画情報の API 呼び出しは比較的簡単で、動画を表す BV 番号または AV 番号のパラメータ bvid または aid が必要です。例えば:https://api.bilibili.com/x/web-interface/view?bvid=1NT411u7n9

解析結果は以下の通りです:

動態#

Bilibili の動態情報の API も同様に簡単で、動態を表すパラメータ id と、オプションのタイムゾーンオフセット timezone_offset(分単位、デフォルト値は -480)が必要です。例えば: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 です。
  2. 返されたデータは 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 に次のように追加します:

// 記事情報を取得
public static function getCustom($uid){
    $type = is_numeric($uid) ? 'post' : 'page';
    $cidType = $type === "post" ? 'cid' : 'slug';
    $f = Typecho_Widget::widget('Widget_Archive@'.$uid,'pageSize=1&type='.$type, $cidType.'='.$uid);
    $archive_info = ['title'=> $f->title ,'desc' => $f->description ,'category' => $f->category ,'time' => date('Y.m.d', $f->created)];
    return $archive_info;
}

次に、独立したページテンプレートを新しく作成し、URL のパラメータを取得して getCustom() を呼び出します。

/**
* 記事情報
* @package custom
*/
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
function filter($uid){
    preg_match_all("/[a-zA-Z0-9]/",$uid,$a);
    return join('',$a[0]);
}
if(!empty(filter($_SERVER["QUERY_STRING"]))){
    foreach (explode('&', filter($_SERVER["QUERY_STRING"])) as $value) {
    	if (strpos($value,'uid')!== false) $uid = explode('=', $value)[1];
    }
    $returnJson=['state'=>1,'data'=> Func::getCustom($uid)];
    echo json_encode($returnJson, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
}else{
    $returnJson=['state'=>-2,'message'=>"有効なUID入力がありません"];
    echo json_encode($returnJson, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
}

最後に、バックエンドに独立したページを追加し、テンプレートを記事情報に設定します。対応する記事の 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 国内アクセス超時#

URL が国内アクセス超時の場合、自動的にプロキシを使用して再試行し、再度アクセスが超時の場合は「URL が存在しない」として処理します。

この記事は Mix Space によって xLog に同期更新されました。元のリンクは https://www.vinking.top/posts/codes/game-and-social-media-sharing

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。