VRChatのログイン監視体制を作る①

## 概要
**友達を監視する機能を作りたかった**
(VRChatの公式にて様々なAPI機能が公開されており、それを活用した何かを触ってみた)


以上

##本記事について
本機能は現在開発中だが、とりあえず元となるオンライン、オフラインを検知するソースができたので。
また、こちらは別用途にて利用できると感じたため、記事にしてみた。

通知機能は後日、、、、、、、

##注意点
**API使用の際にはサーバーに負担を掛けないよう心掛けること**
**APIの不正使用などでアカウントが停止された場合自己責任となりますのでご了承ください**

##VRChatのAPI接続方法
以下に載っています。

https://vrchatapi.github.io/#/README

情報を取得する場合は``apiKey``と``authToken``が必要で
``apikey``は上記にべた張りされてます。

``authToken``の取得は以下コードのようにVRChatのID/PWによる基本認証が必要です。
・・・・・多要素認証を行っている場合は分からないです。


```AuthTokenGet.py
username = "VRCのID"
password = "VRCのpassword"
apiKey   = 'JlE5Jldo5Jibnk5O5hTx6XVqsJu4WJ26'# 21/05/22 時点で公開されているキー
data     = {'apiKey':apiKey}
headers  = {'User-Agent': 'SunaFH/1.0.5'}

response = requests.get('https://api.vrchat.cloud/api/1/auth/user', data=data, headers=headers, auth=username,password)
authToken= response.cookies["auth"]
```

##フレンドリストの取得
現在オンラインになっているフレンドリストを取得する場合は、
``https://api.vrchat.cloud/api/1/auth/user/friends``へ``GET``すれば情報が取得できます。
例）

```
response = requests.get('https://api.vrchat.cloud/api/1/auth/user/friends', data=data, headers=headers, params={"authToken": authToken})
```

以下が取得できる情報一覧です

・id
・username
・displayName
・currentAvatarImageUrl
・currentAvatarThumbnailImageUrl
・fallbackAvatar
・userIcon
・profilePicOverride
・last_platform
・tags
・developerType
・status
・statusDescription
・friendKey
・last_login
・isFriend
・location

**多い**

ただ、今回利用する値は名前なので``displayName``を使いました。


##監視ユーザーの管理
変更する可能性はありますが、
今回は以下のようにページ上で簡単に追加、除外できるようにしました。

![2132312312.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187924/62b5cbb8-11a4-e297-3491-ca9a6d8d18c6.png)


**捗るね！！**

##通知機能
通知の部分は開発次第「VRCにてログイン監視体制を作る②」にて公開予定です

##今回のコードについて
~~通知部分まで作成次第全量githubに上げますが、~~
オンラインになっているフレンドに特定のフレンドが含まれているかの確認部分だけ記載します



```
import requests
import json
from urllib.parse import quote
from sys import exit
from datetime import datetime

# 監視するユーザーリストを取得
user_file = open("online_player_list.txt", mode='r',encoding='utf-8')
user_data = user_file.read()
user_file.close()
low_user_data = eval(user_data)

# 既にオンラインで通知を送っているユーザーリスト
on_user_file = open("tmp_players.txt", mode='r',encoding='utf-8')
on_user_data = on_user_file.read()
on_user_file.close()
if on_user_data == "":
    on_low_user_data = []
else:
    on_low_user_data = on_user_data.split(",")
write_tmp = 0

username = "VRCのID"
password = "VRCのpassword"
apiKey = 'JlE5Jldo5Jibnk5O5hTx6XVqsJu4WJ26'# 21/05/22 時点で公開されているキー
data = {'apiKey':apiKey}
headers = {'User-Agent': 'SunaFH/1.0.5'}

# APIにてフレンドリストを取得

response = requests.get('https://api.vrchat.cloud/api/1/auth/user', data=data, headers=headers, auth="username","password")
token = response.cookies["auth"]

response = requests.get('https://api.vrchat.cloud/api/1/auth/user/friends', data=data, headers=headers, params={"authToken": token})
moderations = response.json()

write_online = []
write_offline = []
moderations_filtered = []

for i in (list(moderations)):
    moderations_filtered.append(i['displayName'])
for a in moderations_filtered:
    if a in low_user_data:
        if a not in on_user_data:
            write_online.append(a)
            write_tmp = 1

# 繰り返して既に報告したリストへ入力する
on_low_user_data.extend(write_online)
remove_list = []

for i in on_low_user_data:
    if i in moderations_filtered:
        pass
    else:
        #print(i)
        remove_list.append(i)

# 既にログアウトしている人をオンラインリストから除外
print(type(remove_list))
if len(remove_list) >= 1:
    for i in range(len(remove_list)):
        on_low_user_data.remove(remove_list[i])

with open("tmp_players.txt", "w",encoding='utf-8') as opfile:
    opfile.write(",".join(on_low_user_data))
````

##終わりに
**ストーカー行為はやめようね**

###参照

https://vrchatapi.github.io/#/README

https://qiita.com/y23586/items/484c8465b7a966d237c0