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 vrchatapi.models.group_instance import GroupInstance from vrchatapi.models.world import World from totp import getTOTP import os from random import randint from datetime import datetime def fakeGroupInstances(): group_instances = [] # For testing purposes # Worlds API object that is valid enough to not cause errors in testing fakeWorld = World( "usr_123TEST-789-abcd-efghi-aaa69420", "McLovin", 90, 50, datetime.now(), "A test world, it does not exist. No VRC API's were harmed", 0, False, 0, "world_AAAA-TEST-49494-69420", "http://null.example/hello.jpg", [], "4/20/2020", "Fake world", None, 0, "vrchat", 0, None, 0, 0, "9/11/2021", "public", ["nothing", "testing"], "http://testing.localhost/thisisnotreal.png", [], datetime.now(), 5, 90, []) # Fake instance fakeInstance1 = GroupInstance("TESTTESTgrp_69420_aaaaaaaaa", "test", fakeWorld, randint(1, 50)) group_instances.append(fakeInstance1) return group_instances 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 # Calling verify2fa if the account has 2FA enabled auth_api.verify2_fa(two_factor_auth_code=TwoFactorAuthCode(input("Enter 2FA Code: "))) 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)