From e86e46b85be5f89099ba32a5032dbfe412297083 Mon Sep 17 00:00:00 2001 From: William P Date: Tue, 11 Jun 2024 19:54:31 +0000 Subject: [PATCH] initial commit --- .gitignore | 3 +++ .vscode/launch.json | 13 +++++++++++++ main.py | 46 +++++++++++++++++++++++++++++++++++++++++++++ totp.py | 8 ++++++++ 4 files changed, 70 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 main.py create mode 100644 totp.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c5bd6df --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +venv/ +__pycache__/ +.env \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d5e19c8 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "configurations": [ + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "justMyCode": true, + "envFile": "${workspaceFolder}/.env" + } + ] +} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..d77b485 --- /dev/null +++ b/main.py @@ -0,0 +1,46 @@ +# Step 1. We begin with creating a Configuration, which contains the username and password for authentication. +import vrchatapi +from vrchatapi.api import authentication_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 totp import getTOTP +import os + +configuration = vrchatapi.Configuration( + username = os.getenv("USER_NAME"), + password = os.getenv("USER_PASSWORD"), +) + +group_id = '' + +# Step 2. VRChat consists of several API's (WorldsApi, UsersApi, FilesApi, NotificationsApi, FriendsApi, etc...) +# Here we enter a context of the API Client and instantiate the Authentication API which is required for logging in. + +# Enter a context with an instance of the API client +with vrchatapi.ApiClient(configuration) as api_client: + # Set our User-Agent as per VRChat Usage Policy + api_client.user_agent = "GroupInstanceLogger/0.1alpha me@williamtpeebles.com" + + # Instantiate instances of API classes + auth_api = authentication_api.AuthenticationApi(api_client) + + try: + # Step 3. Calling getCurrentUser on Authentication API logs you in if the user isn't already logged in. + current_user = auth_api.get_current_user() + except UnauthorizedException as e: + if e.status == 200: + if "Email 2 Factor Authentication" in e.reason: + # Step 3.5. Calling email verify2fa if the account has 2FA disabled + auth_api.verify2_fa_email_code(two_factor_email_code=TwoFactorEmailCode(input("Email 2FA Code: "))) + elif "2 Factor Authentication" in e.reason: + # Step 3.5. Calling verify2fa if the account has 2FA enabled + auth_api.verify2_fa(two_factor_auth_code=TwoFactorAuthCode(getTOTP())) + current_user = auth_api.get_current_user() + print(current_user) + else: + print("Exception when calling API: %s\n", e) + except vrchatapi.ApiException as e: + print("Exception when calling API: %s\n", e) + + print("Logged in as:", current_user.display_name) \ No newline at end of file diff --git a/totp.py b/totp.py new file mode 100644 index 0000000..34c5a7b --- /dev/null +++ b/totp.py @@ -0,0 +1,8 @@ +import pyotp +import time +import os + +def getTOTP(): + totp_key = os.getenv("TOTP_KEY") + totp = pyotp.TOTP(totp_key) + return totp.now() \ No newline at end of file