diff --git a/main.py b/main.py index d77b485..36dfb47 100644 --- a/main.py +++ b/main.py @@ -1,46 +1,14 @@ -# 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 +from vrcapi import getGroupInstances +from datetime import datetime -configuration = vrchatapi.Configuration( - username = os.getenv("USER_NAME"), - password = os.getenv("USER_PASSWORD"), -) +if __name__ == "__main__": + instance_data = [] + group_instances = getGroupInstances() -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 + for instance in group_instances: + instance_record = {"timestamp": datetime.now(), + "instance_id": {instance.instance_id}, + "member_count": {instance.member_count}} + instance_data.append(instance_record) + + print(instance_data) \ No newline at end of file diff --git a/totp.py b/totp.py index 34c5a7b..9dd6ef4 100644 --- a/totp.py +++ b/totp.py @@ -1,5 +1,4 @@ import pyotp -import time import os def getTOTP(): diff --git a/vrcapi.py b/vrcapi.py new file mode 100644 index 0000000..701da43 --- /dev/null +++ b/vrcapi.py @@ -0,0 +1,64 @@ +import vrchatapi +from vrchatapi.api import authentication_api +from vrchatapi.exceptions import UnauthorizedException, ApiException +from vrchatapi.models.two_factor_auth_code import TwoFactorAuthCode +from vrchatapi.models.two_factor_email_code import TwoFactorEmailCode +from totp import getTOTP +import os + +def getGroupInstances(): + group_instances = [] + + configuration = vrchatapi.Configuration( + # Get username/password from env variables + username = os.getenv("USER_NAME"), + password = os.getenv("USER_PASSWORD"), + ) + + group_id = os.getenv("GROUP_ID") + + 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: + # 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: + # Calling email verify2fa if the account has 2FA disabled, give warning that automatic runs cannot be done + print("IMPORTANT: Your VRChat Account is only enabled for **email** based 2-factor authentication! " + "You will not be able to automate runs of GroupInstanceLogger\n" + "Set up your account to use TOTP-based 2FA so the application can log you in automatically\n\n") + auth_api.verify2_fa_email_code(two_factor_email_code=TwoFactorEmailCode(input("Email 2FA Code: "))) + elif "2 Factor Authentication" in e.reason: + # Check if TOTP code is defined in env variables + if os.getenv("TOTP_KEY") is not None: + print("Attempting to authenticate with defined TOTP key") + auth_api.verify2_fa(two_factor_auth_code=TwoFactorAuthCode(getTOTP())) + else: + # TOTP prompt if not configured + auth_api.verify2_fa(two_factor_auth_code=input("Enter 2FA Code: ")) + # Calling verify2fa if the account has 2FA enabled + current_user = auth_api.get_current_user() + + # Call groups APIs + groups_api_instance = vrchatapi.GroupsApi(api_client) + + try: + api_response = groups_api_instance.get_group_instances(group_id) # Get group + for instance in api_response: + group_instances.append(instance) + return group_instances + except ApiException as e: + print("Exception when calling GroupsApi->get_group: %s\n" % e) + 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