🙌

VRChat APIを使ってフレンドのステータス一覧をNode.jsで取得する

2023/03/11に公開

はじめに

VRChatのAPIは、有志により非公式に仕様が公開されています。
VRChatのAPIを利用することで様々な操作を行うことができます。

ドキュメントがありますが、ネットに公開されている情報だと、つまづくポイントが多数だったため、この記事を備忘録とします。

なお、あくまで非公式に公開されているAPIのため、この記事の実行は完全に自己責任で行ってください。

検証環境

  • Node.js v18.14.2
  • M1 MacBook Air(2020)

やり方

作業用ディレクトリーの作成

作業用のディレクトリーを作成し、移動します。

mkdir vrchat_api
cd vrchat_api

Node.jsの環境整備

npm initで必要な情報を入力します。
※ 試したいだけなら全部Enterでいいです。

そしてnpm installでnpmパッケージをインストールしてください。

npm init
npm install axios@0.26.1 axios-cookiejar-support@4.0.6 dotenv vrchat

なお、axios関連のパッケージのインストールで脆弱性の表示が出ますがvrchatのnpmパッケージとの相性問題の都合上、古いaxiosをインストールする必要があるためです。

そのため、本コードの実行は実験用に留め、外部に公開する等は避ける必要があります。

.envファイルの設置

基本的に、VRChatのAPIの利用にはIDとパスワードが必要です。
ソースコード内に書くのは望ましくないので、.envファイルをディレクトリー内に設置します。

usernamepasswordはご自身のものに置き換えてください。

.env
VRCHAT_USERNAME=username
VRCHAT_PASSWORD=password

JavaScriptファイルの設置

以下のファイルを設置しましょう。

なおapplication/1.00 user@example.comはテスト用に書かれたUser-Agentです。
ここに正しい情報を入力するのはVRChatのAPIを利用する際のルールのようなものなので、アプリケーション名やメールアドレスを正しいものに置き換えてください。

index.js
const axios = require("axios");
const vrchat = require("vrchat");
const readline = require("readline/promises");
const tough = require("tough-cookie");
require("dotenv").config();

async function main() {
  // VRChatのAPIを叩くために必要なヘッダーを設定する
  const axiosConfiguration = axios.create({
    headers: {
      "User-Agent": "application/1.00 user@example.com",
    },
  });

  // クッキーを有効にする
  axios.defaults.withCredentials = true;

  const SystemApi = new vrchat.SystemApi(
    undefined,
    undefined,
    axiosConfiguration
  );

  // APIキーを取得してクッキーに保存する
  const config = await SystemApi.getConfig();
  axios.defaults.jar.setCookie(
    new tough.Cookie({ key: "apiKey", value: config.data.apiKey }),
    "https://api.vrchat.cloud",
    {},
    function () {}
  );

  const configuration = new vrchat.Configuration({
    username: process.env.VRCHAT_USERNAME,
    password: process.env.VRCHAT_PASSWORD,
    apiKey: config.data.apiKey,
  });

  const AuthenticationApi = new vrchat.AuthenticationApi(
    configuration,
    undefined,
    axiosConfiguration
  );

  const user = await AuthenticationApi.getCurrentUser();

  // 2FAが有効な場合は2FAコードを入力する
  if (!user.id) {
    // 2FAコードをコンソールから入力する
    const readInterface = readline.createInterface({
      input: process.stdin,
      output: process.stdout,
    });
    const code = await readInterface.question(
      "2段階認証アプリから6桁のコードを入力してください: "
    );
    readInterface.close();

    // 2FAコードを入力してログインする
    await AuthenticationApi.verify2FA({ code: code }, axiosConfiguration);
  }

  // VRChatのフレンドリストを取得する
  const FriendsApi = new vrchat.FriendsApi(
    configuration,
    undefined,
    axiosConfiguration
  );
  const friends = await FriendsApi.getFriends(
    0,
    undefined,
    true,
    axiosConfiguration
  );
  console.log(friends);
}

main();

Node.jsの実行

先程のJavaScriptファイルを実行します。
2段階認証を設定している場合は、2段階認証の認証コードを入力してください。

❯ node index.js
2段階認証アプリから6桁のコードを入力してください:

フレンドの状態がコンソールに一覧で表示されます!!
あとはデータを加工して、自分の好きなように調整してください。
フレンド一覧

お疲れ様でした!!!

参考情報

Discussion