34
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-16

追記(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"]) # オンラインなフレンド一覧を表示

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

34
22
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?