-
Notifications
You must be signed in to change notification settings - Fork 44
/
change_gamertag.py
110 lines (91 loc) · 3.23 KB
/
change_gamertag.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
"""
Example script that enables using your one-time-free gamertag change
"""
import argparse
import asyncio
import os
import sys
from httpx import HTTPStatusError
from xbox.webapi.api.client import XboxLiveClient
from xbox.webapi.api.provider.account.models import (
ChangeGamertagResult,
ClaimGamertagResult,
)
from xbox.webapi.authentication.manager import AuthenticationManager
from xbox.webapi.authentication.models import OAuth2TokenResponse
from xbox.webapi.common.signed_session import SignedSession
from xbox.webapi.scripts import CLIENT_ID, CLIENT_SECRET, TOKENS_FILE
async def async_main():
parser = argparse.ArgumentParser(description="Change your gamertag")
parser.add_argument(
"--tokens",
"-t",
default=TOKENS_FILE,
help=f"Token filepath. Default: '{TOKENS_FILE}'",
)
parser.add_argument(
"--client-id",
"-cid",
default=os.environ.get("CLIENT_ID", CLIENT_ID),
help="OAuth2 Client ID",
)
parser.add_argument(
"--client-secret",
"-cs",
default=os.environ.get("CLIENT_SECRET", CLIENT_SECRET),
help="OAuth2 Client Secret",
)
parser.add_argument("gamertag", help="Desired Gamertag")
args = parser.parse_args()
if len(args.gamertag) > 15:
print("Desired gamertag exceedes limit of 15 chars")
sys.exit(-1)
if not os.path.exists(args.tokens):
print("No token file found, run xbox-authenticate")
sys.exit(-1)
async with SignedSession() as session:
auth_mgr = AuthenticationManager(
session, args.client_id, args.client_secret, ""
)
with open(args.tokens) as f:
tokens = f.read()
auth_mgr.oauth = OAuth2TokenResponse.model_validate_json(tokens)
try:
await auth_mgr.refresh_tokens()
except HTTPStatusError:
print("Could not refresh tokens")
sys.exit(-1)
with open(args.tokens, mode="w") as f:
f.write(auth_mgr.oauth.json())
xbl_client = XboxLiveClient(auth_mgr)
print(
":: Trying to change gamertag to '%s' for xuid '%i'..."
% (args.gamertag, xbl_client.xuid)
)
print("Claiming gamertag...")
try:
resp = await xbl_client.account.claim_gamertag(
xbl_client.xuid, args.gamertag
)
if resp == ClaimGamertagResult.NotAvailable:
print("Claiming gamertag failed - Desired gamertag is unavailable")
sys.exit(-1)
except HTTPStatusError:
print("Invalid HTTP response from claim")
sys.exit(-1)
print("Changing gamertag...")
try:
resp = await xbl_client.account.change_gamertag(
xbl_client.xuid, args.gamertag
)
if resp == ChangeGamertagResult.NoFreeChangesAvailable:
print("Changing gamertag failed - You are out of free changes")
sys.exit(-1)
except HTTPStatusError:
print("Invalid HTTP response from change")
sys.exit(-1)
print("Gamertag successfully changed to %s" % args.gamertag)
def main():
asyncio.run(async_main())
if __name__ == "__main__":
main()