add staff member
This commit is contained in:
20
config/staff.txt
Normal file
20
config/staff.txt
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
NEKO旅
|
||||||
|
MIRAI@
|
||||||
|
Jett(ジェット)
|
||||||
|
さきやま
|
||||||
|
Ruby0212
|
||||||
|
kuromanji【Nyaa】
|
||||||
|
さいたまのこばやし
|
||||||
|
ワリペン
|
||||||
|
nishi r
|
||||||
|
KiROSX
|
||||||
|
FallenAngelRK
|
||||||
|
puchimame
|
||||||
|
リル姉。
|
||||||
|
はなこα
|
||||||
|
kaku_sim/かくしむ
|
||||||
|
Shino(しの)
|
||||||
|
めっくる -mekkuru-
|
||||||
|
毎日がHoliday'
|
||||||
|
The Gold
|
||||||
|
Deco88
|
||||||
291
src/tools/getuser.py
Normal file
291
src/tools/getuser.py
Normal file
@@ -0,0 +1,291 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
from http.cookiejar import MozillaCookieJar
|
||||||
|
|
||||||
|
import vrchatapi
|
||||||
|
from vrchatapi.api import authentication_api
|
||||||
|
from vrchatapi.api import users_api
|
||||||
|
from vrchatapi.exceptions import UnauthorizedException
|
||||||
|
from vrchatapi.models.two_factor_auth_code import TwoFactorAuthCode
|
||||||
|
from vrchatapi.models.two_factor_email_code import TwoFactorEmailCode
|
||||||
|
|
||||||
|
from common.config_loader import getSecretValue
|
||||||
|
|
||||||
|
COOKIE_FILE = ".vrchat_cookie.txt"
|
||||||
|
|
||||||
|
USER_AGENT = (
|
||||||
|
"VRC_OSC/1.0 "
|
||||||
|
"(contact: test@gmail.com)"
|
||||||
|
)
|
||||||
|
|
||||||
|
URLS = [
|
||||||
|
"https://vrchat.com/home/user/usr_3a362bc1-0eb0-4c42-b6e9-c870b89a033c",
|
||||||
|
"https://vrchat.com/home/user/usr_f7e6053b-c427-4a69-b906-c063cacbf7c5",
|
||||||
|
"https://vrchat.com/home/user/usr_adf90786-449e-4608-a614-15b8525282c2",
|
||||||
|
"https://vrchat.com/home/user/usr_b9affae3-8af4-4d77-b3d9-98d066117429",
|
||||||
|
"https://vrchat.com/home/user/usr_212db5f1-f628-4d36-a19f-461ec35b591b",
|
||||||
|
"https://vrchat.com/home/user/usr_013779d9-8746-4953-a1a5-d38735d4f72b",
|
||||||
|
"https://vrchat.com/home/user/usr_bec2319d-b98f-4aaf-9591-9df0b8601d4e",
|
||||||
|
"https://vrchat.com/home/user/usr_38b99395-1372-4bc5-8bed-f209b62279c3",
|
||||||
|
"https://vrchat.com/home/user/usr_8da1c108-05fd-408b-b618-6a3a3145b9c8",
|
||||||
|
"https://vrchat.com/home/user/usr_0d5eac85-a631-45e8-b5d7-ba9744299b83",
|
||||||
|
"https://vrchat.com/home/user/usr_c20b2f2c-ea3c-4b4d-b1ac-1f2ee484c8e1",
|
||||||
|
"https://vrchat.com/home/user/usr_6af54193-8930-46e5-97ea-548236e8e85d",
|
||||||
|
"https://vrchat.com/home/user/usr_27078dc7-299c-4d6e-9de4-fcc0f80409d8",
|
||||||
|
"https://vrchat.com/home/user/usr_6d0041b4-e242-43e9-999c-3d87c94eefb4",
|
||||||
|
"https://vrchat.com/home/user/usr_4681fd97-ff3b-4b53-bed5-9beb5bc9e33b",
|
||||||
|
"https://vrchat.com/home/user/usr_b53f3cf3-b0d8-4dde-9cb1-8669f1e26996",
|
||||||
|
"https://vrchat.com/home/user/usr_18abe24e-4672-41e7-a8c4-b13629a49872",
|
||||||
|
"https://vrchat.com/home/user/usr_113475ea-b9e4-4509-959f-0a19c0337be2",
|
||||||
|
"https://vrchat.com/home/user/usr_af3871ad-4792-4702-b765-b474d53276b7",
|
||||||
|
"https://vrchat.com/home/user/usr_82ac9b50-96a8-43ff-a105-26162341f82d",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def log(level, message):
|
||||||
|
print(f"[{level}] {message}")
|
||||||
|
|
||||||
|
|
||||||
|
def wait_and_exit(code):
|
||||||
|
input("Press Enter to exit...")
|
||||||
|
sys.exit(code)
|
||||||
|
|
||||||
|
|
||||||
|
def get_required_secret(section, key):
|
||||||
|
value = getSecretValue(section, key)
|
||||||
|
|
||||||
|
if not value:
|
||||||
|
raise RuntimeError(
|
||||||
|
f"{section}.{key} is not set"
|
||||||
|
)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def setup_cookie_jar(api_client):
|
||||||
|
cookie_jar = MozillaCookieJar(COOKIE_FILE)
|
||||||
|
|
||||||
|
if os.path.exists(COOKIE_FILE):
|
||||||
|
try:
|
||||||
|
cookie_jar.load(
|
||||||
|
ignore_discard=True,
|
||||||
|
ignore_expires=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
log("ERROR", f"cookie load failed: {e}")
|
||||||
|
|
||||||
|
api_client.rest_client.cookie_jar = cookie_jar
|
||||||
|
|
||||||
|
return cookie_jar
|
||||||
|
|
||||||
|
|
||||||
|
def save_cookie_jar(cookie_jar):
|
||||||
|
try:
|
||||||
|
cookie_jar.save(
|
||||||
|
ignore_discard=True,
|
||||||
|
ignore_expires=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
log("ERROR", f"cookie save failed: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
def login(api_client, cookie_jar):
|
||||||
|
auth_api = authentication_api.AuthenticationApi(api_client)
|
||||||
|
|
||||||
|
try:
|
||||||
|
current_user = auth_api.get_current_user()
|
||||||
|
|
||||||
|
save_cookie_jar(cookie_jar)
|
||||||
|
|
||||||
|
log(
|
||||||
|
"INFO",
|
||||||
|
f"login ok: {current_user.display_name}"
|
||||||
|
)
|
||||||
|
|
||||||
|
return current_user
|
||||||
|
|
||||||
|
except UnauthorizedException as e:
|
||||||
|
|
||||||
|
reason = str(e.reason)
|
||||||
|
|
||||||
|
if "Email 2 Factor Authentication" in reason:
|
||||||
|
|
||||||
|
code = input(
|
||||||
|
"[ACTION] Email 2FA Code: "
|
||||||
|
).strip()
|
||||||
|
|
||||||
|
auth_api.verify2_fa_email_code(
|
||||||
|
TwoFactorEmailCode(code)
|
||||||
|
)
|
||||||
|
|
||||||
|
elif "2 Factor Authentication" in reason:
|
||||||
|
|
||||||
|
code = input(
|
||||||
|
"[ACTION] TOTP Code: "
|
||||||
|
).strip()
|
||||||
|
|
||||||
|
auth_api.verify2_fa(
|
||||||
|
TwoFactorAuthCode(code)
|
||||||
|
)
|
||||||
|
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
|
current_user = auth_api.get_current_user()
|
||||||
|
|
||||||
|
save_cookie_jar(cookie_jar)
|
||||||
|
|
||||||
|
log(
|
||||||
|
"INFO",
|
||||||
|
f"login ok: {current_user.display_name}"
|
||||||
|
)
|
||||||
|
|
||||||
|
return current_user
|
||||||
|
|
||||||
|
|
||||||
|
def extract_user_id(url):
|
||||||
|
|
||||||
|
match = re.search(
|
||||||
|
r"(usr_[0-9a-fA-F\-]+)",
|
||||||
|
url,
|
||||||
|
)
|
||||||
|
|
||||||
|
if not match:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return match.group(1)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
log("CHECK", "STEP=1 URL確認")
|
||||||
|
|
||||||
|
user_ids = []
|
||||||
|
|
||||||
|
for url in URLS:
|
||||||
|
|
||||||
|
user_id = extract_user_id(url)
|
||||||
|
|
||||||
|
if not user_id:
|
||||||
|
log("ERROR", f"invalid url: {url}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
user_ids.append(user_id)
|
||||||
|
|
||||||
|
if not user_ids:
|
||||||
|
log("FATAL", "user_id がありません")
|
||||||
|
wait_and_exit(1)
|
||||||
|
|
||||||
|
log("INFO", f"user_count={len(user_ids)}")
|
||||||
|
|
||||||
|
log("CHECK", "STEP=2 ログイン")
|
||||||
|
|
||||||
|
configuration = vrchatapi.Configuration(
|
||||||
|
username=get_required_secret(
|
||||||
|
"vrchat",
|
||||||
|
"username",
|
||||||
|
),
|
||||||
|
password=get_required_secret(
|
||||||
|
"vrchat",
|
||||||
|
"password",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
with vrchatapi.ApiClient(configuration) as api_client:
|
||||||
|
|
||||||
|
api_client.user_agent = USER_AGENT
|
||||||
|
|
||||||
|
api_client.default_headers[
|
||||||
|
"User-Agent"
|
||||||
|
] = USER_AGENT
|
||||||
|
|
||||||
|
cookie_jar = setup_cookie_jar(
|
||||||
|
api_client
|
||||||
|
)
|
||||||
|
|
||||||
|
login(
|
||||||
|
api_client,
|
||||||
|
cookie_jar,
|
||||||
|
)
|
||||||
|
|
||||||
|
users = users_api.UsersApi(api_client)
|
||||||
|
|
||||||
|
log(
|
||||||
|
"CHECK",
|
||||||
|
"STEP=3 displayName取得開始"
|
||||||
|
)
|
||||||
|
|
||||||
|
total = len(user_ids)
|
||||||
|
|
||||||
|
for index, user_id in enumerate(
|
||||||
|
user_ids,
|
||||||
|
start=1,
|
||||||
|
):
|
||||||
|
|
||||||
|
log(
|
||||||
|
"CHECK",
|
||||||
|
f"{index}/{total} {user_id}"
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
user = users.get_user(
|
||||||
|
user_id
|
||||||
|
)
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"{user.display_name}"
|
||||||
|
)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
|
||||||
|
log(
|
||||||
|
"ERROR",
|
||||||
|
f"{user_id}: {e}"
|
||||||
|
)
|
||||||
|
|
||||||
|
time.sleep(10)
|
||||||
|
|
||||||
|
save_cookie_jar(cookie_jar)
|
||||||
|
|
||||||
|
log("CHECK", "STEP=4 結果確認")
|
||||||
|
log("INFO", "完了")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
try:
|
||||||
|
main()
|
||||||
|
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
|
||||||
|
log(
|
||||||
|
"INFO",
|
||||||
|
"Ctrl+C detected"
|
||||||
|
)
|
||||||
|
|
||||||
|
log(
|
||||||
|
"CHECK",
|
||||||
|
"STEP=4 結果確認"
|
||||||
|
)
|
||||||
|
|
||||||
|
log(
|
||||||
|
"INFO",
|
||||||
|
"終了しました"
|
||||||
|
)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
|
||||||
|
log(
|
||||||
|
"FATAL",
|
||||||
|
str(e)
|
||||||
|
)
|
||||||
|
|
||||||
|
wait_and_exit(1)
|
||||||
Reference in New Issue
Block a user