Edited at

VRChatのオンラインなフレンドをPythonで取得する


追記(2019/1/25)

VRChat APIを使うためのPythonパッケージ vrchat-api-python を公開しました。

内部的に以下で書かれている処理を行っています。


注意

この記事で使用しているVRChat APIの仕様は非公式なドキュメント (https://vrchatapi.github.io/) に基づくものです。

私が調べた限りではVRChat公式

では存在自体が言及されておらず、一般ユーザがVRChatクライアントやVRCSDK以外の手段でアクセスすることが容認されているかどうかは不明です。

一応、APIの仕様について中の人が言及していることもあるので完全にブラックというわけではないようですが、下記のコードを実行する際はアカウントの停止措置等のリスクを承知の上でサーバに無理をかけない範囲で行ってください。


背景

VRChatでオンラインなフレンドを確認する場合は


  • VRChatクライアント内でフレンド画面を開く


  • 公式ページ にログインする

方法がありますが、この記事ではスクリプト的に確認する方法としてPythonでVRChatのAPI (以下VRChat API) を叩いてみます。

VRChat APIでは以下の手順を踏んでフレンドやインスタンス等の情報にアクセスします。



  1. https://api.vrchat.cloud/api/1/configをGETしてapiKeyを取得 (以下すべてのアクセスにapiKeyパラメータを使用)


  2. https://api.vrchat.cloud/api/1/auth/userをGETしてauthTokenを取得 (VRChatのユーザ名・パスワードでBasic認証を行う)


  3. apiKey, authTokenをパラメータとして目的のAPIにアクセス


201/7/8追記:

2.について、ドキュメントではauthTokenがレスポンスとして返ってくると書いてありますが、返り値に含まれなくなったようです。代わりに同じものをCookieから取り出すことができます(以下を参照)。


以下はこれらの実行例です。


apiKeyの取得

import json

import requests

API_BASE = "https://api.vrchat.cloud/api/1"

url = "{}/config".format(API_BASE)
response = requests.get(url)
apiKey = json.loads(response.text)["clientApiKey"] # 2018/6/16時点で "JlE5..." みたいなのが返ってくる


authTokenの取得

from requests.auth import HTTPBasicAuth

USER = "your-user-name"
PASSWORD = "your-password"

url = "{}/auth/user".format(API_BASE)
response = requests.get(url,
params={"apiKey": apiKey},
auth=HTTPBasicAuth(USER, PASSWORD))
# token = json.loads(response.text)["authToken"] # "authcookie_[UUID]" みたいなのが返ってくる
token = response.cookies["auth"] # (API変更のためCookieからauthTokenを取得、2018/7/8追記)


フレンド一覧の取得

url = "{}/auth/user/friends".format(API_BASE)

response = requests.get(url,
params={"apiKey": apiKey, "authToken": token})
friends = json.loads(response.text)
for f in friends:
print(f["displayName"]) # オンラインなフレンド一覧を表示


この他にもワールドやワールドインスタンスの情報も取得できるため、「多くのフレンドが集まっているワールドを一覧表示」といったことも可能です。