galaxy-sixth-sensey - 【VRChat API】favorite済みワールド全てをunfavoriteする
2020/08/16
【VRChat API】favorite済みワールド全てをunfavoriteする

対象読者

やることはCLIの初歩なので、成熟している必要はありません。

各コマンドの解説も本記事で行うので、見てみてください 😎

想定環境

使うもの

本題

そろそろワールドのfavorite枠が足りなくなってきたので、favoriteしてきたワールドのポータルを集めたワールドを作りました

移動もべんり!#VRChat pic.twitter.com/gPTwnusJyt

— ⿻あいや⿻ VRChat&言語自作&技術書典「せつラボ」 (@public_ai000ya) August 15, 2020

(VRChat始めてから一か月ですが、もう足りなくなりました……。みなさん、すてきなワールドをありがとうございます ♥️

全てのワールドfavoriteをポータルに移植できたので、ワールドfavoriteを全て削除したいと思います。

それは次のCLIコマンドで実現できます。

$ hash=$(echo -n 'aiya000:password' | base64)
$ curl \
    -H "Authorization: Basic $hash" \
    'https://api.vrchat.cloud/api/1/worlds/favorites?apiKey=JlE5Jldo5Jibnk5O5hTx6XVqsJu4WJ26' \
    > favorite_worlds_unformated.json
$ cat favorite_worlds_unformated.json \
    | jq -r '.[].favoriteId' \
    | xargs -I {} \
        curl -X DELETE \
            -H "Authorization: Basic $hash" \
            'https://api.vrchat.cloud/api/1/favorites/{}?apiKey=JlE5Jldo5Jibnk5O5hTx6XVqsJu4WJ26'

上記では確認のため、一度favorite_worlds_unformated.jsonに中間内容を保存しましたが、保存しなくてもいけると思います。 👇

$ curl -H "Authorization: Basic $hash" 'https://api.vrchat.cloud/api/1/worlds/favorites?apiKey=JlE5Jldo5Jibnk5O5hTx6XVqsJu4WJ26' \
    | jq -r '.[].favoriteId' \
    | xargs -I {} curl -X DELETE -H "Authorization: Basic $hash" 'https://api.vrchat.cloud/api/1/favorites/{}?apiKey=JlE5Jldo5Jibnk5O5hTx6XVqsJu4WJ26'

解説

base64

base64は「いい感じのハッシュ値」を作るコマンドです。

VRChat APIはAuthorizationヘッダーに、<VRChat ID>:<VRChat パスワード>という文字列をbase64化した(「いい感じのハッシュ値」にした)ものを要求します。 これはいわゆる「認証情報」です。

認証情報を要求することは…… 例えばVRChatアカウントの情報を、他の人にいじられないようにするために、必要です。

内容は$hash変数に保存しておきます。

curl & favorite_worlds_unformated.json

curlコマンドというのはWeb APIを叩くコマンドです。

-Hというオプションでヘッダーを指定できるので、上記URLの指定する通りに"Authorization: Basic $hash"を指定してあげます。

https://api.vrchat.cloud/api/1/worlds/favoritesというURLは「ユーザーにfavoriteされたワールドを一覧する関数名」のようなものです。 詳細は下記ページにて確認できます。

VRChatはURLクエリーというもので、APIキーを要求します。 上記CLIでいう?apiKey=JlE5Jldo5Jibnk5O5hTx6XVqsJu4WJ26の部分です。

APIキーは、現在はJlE5Jldo5Jibnk5O5hTx6XVqsJu4WJ26ですが、将来変わるかもしれません。

下記ページの章 ‘Client API Key’ で確認できます。

これでfavorite_worlds_unformated.jsonに「favoriteしたワールド一覧」が保存されました。

favoriteしたワールドを全削除する

本稿の本題です。

削除したいワールドの一覧はfavorite_worlds_unformated.jsonに入っていますが、整形されていませんので、jqコマンドを使って整形します。

$ cat favorite_worlds_unformated.json | jq -r '.[].favoriteId'

あとはこれを、VRChat APIのhttps://api.vrchat.cloud/api/1/favorites/{}に流してあげるだけです。

https://api.vrchat.cloud/api/1/favorites/{}{}には「削除したいワールドのfavoriteId」というものがあります。 それは$ cat favorite_worlds_unformated.json | jq -r '.[].favoriteId'で手に入る、整形済み一覧の各要素のことです。

https://api.vrchat.cloud/api/1/favorites/{}は同じくAuthorizationヘッダーとapiKeyを要求するので、乗せてあげます。

curlの-X DELETEは「DELETEで、指定されたURLを実行する」というものです。 今のところは「’Delete Favorite’がDELETEを求めるから、指定してあげる」という感じの理解で大丈夫です。

そして最後に | xargs -I {} curl -X DELETE -H "Authorization: Basic $hash" 'https://api.vrchat.cloud/api/1/favorites/{}?apiKey=JlE5Jldo5Jibnk5O5hTx6XVqsJu4WJ26' で、favorite_worlds_unformated.jsonの整形済み各要素を、’Delete Favorite’に投げてあげる、ということをします。

これで完了です!


この記事はこちらから修正リクエストを送ることができます。
【VRChat API】favorite済みワールド全てをunfavoriteする - github
ゴミ箱ボタンの左にある、鉛筆ボタンを押してね!