🥽

TypeScriptでVRChat APIの認証を自動化してみる

2024/12/22に公開

この記事はUniMagic Advent Calendar 2024の10日目の記事です(12日遅れ)
一応ゆにまじに関係ある話題です

前提

VRChatのブラウザページで使用されているAPIはユーザーが使用して良いと言われており、外部ツールや自動化などに用いることができます(例えばVRCXなど)
これにあたり、いい感じに認証を自動化したかったので作成しました

環境

bun v1.0
valibot v0.27
speakeasy v2.0

免責事項

この記事を参考にしたことによって発生した問題について筆者は一切の責任を負いません

ソースコード

今回は複数ファイルなのでgistにまとめてあります
https://gist.github.com/o-tr/badc97d63cd7895575cfac29bdb0ebe8

※二段階認証でTOTPを使用している前提のコードです

解説

credentials.json

同じディレクトリに作成することで設定できます

{
    "username":"username", // VRChatのログイン時に使用するユーザー名/メールアドレス
    "password":"password", // VRChatのログイン時に使用するパスワード
    "api_token":"JlE5Jldo5Jibnk5O5hTx6XVqsJu4WJ26", // 固定値
    "otp":"", // totp認証に用いるシークレット
    "ua":"example/0.0.1 example@example.com", // "ツール名/バージョン 連絡先"のフォーマットで設定
}

認証を行って得られたトークン、二段階認証トークンもこのファイルに保存されます

ランタイム

当初nodejs/tsxを用いていましたが、把握していない仕様があるのか、バグなのかわかりませんがfetchをした際にVRChat側にCookieが認識されない問題が発生したため回避策としてbunを使用しています

TOTP

speakeasyを用いて自動的にTOTP認証を行っています

さいごに

nodejs/tsxで認証がうまくいかない問題、ローカルのサーバーへリクエストを送信して問題なく送られていることは確認しています
なので、ヘッダーの並び順かなにか細かいところなのかなと思っていますがそこまで調べる気力がなかったので誰か調べてください(適当)

宣伝

魔術学舎United、略してUniMagic(ユニマジック)とは、VRの世界に関係の深い技術を学ぶ学園空間型のイベントです。
15名~18名程度で構成されるクラスで、2週間の授業と1週間の修了制作を通して、技術についての知見を深めていきます。
https://twitter.com/UniMagicVRC

Discussion