Skip to content

Instantly share code, notes, and snippets.

@rithvikvibhu
Last active December 4, 2023 14:49
  • Star 32 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
Star You must be signed in to star a gist
Embed
What would you like to do?
Get tokens for Google Home Foyer API

Get tokens for Google Home Foyer API

Intro

This script (python 3) generates tokens that can be used when making requests to the Google Home Foyer API. There are 2 kinds of tokens used here:

  1. Master token - Is in the form aas_et/*** and is long lived. Needs Google username and password.
  2. Access token - Is in the form ya29.*** and lasts for an hour. Needs Master token to generate.

If you do not want to store the Google account password in plaintext, get the master token once, and set it as an override value.

It's safer/easier to generate an app password and use it instead of the actual password. It still has the same access as the regular password, but still better than using the real password while scripting. (https://myaccount.google.com/apppasswords)

Usage

# Install python requirements
pip install gpsoauth

# Update the constants at the beginning of the file

# Get the tokens!
python3 get_tokens.py
# Get tokens for Google Home Foyer API
# https://gist.github.com/rithvikvibhu/952f83ea656c6782fbd0f1645059055d
from gpsoauth import perform_master_login, perform_oauth
from uuid import getnode as getmac
# Creds to use when logging in
USERNAME = '<google_username>'
PASSWORD = '<google_password_or_app_password>'
# Optional Overrides (Set to None to ignore)
device_id = None
master_token = None
access_token = None
# Flags
DEBUG = False
def get_master_token(username, password, android_id):
res = perform_master_login(username, password, android_id)
if DEBUG:
print(res)
if 'Token' not in res:
print('[!] Could not get master token.')
return None
return res['Token']
def get_access_token(username, master_token, android_id):
res = perform_oauth(
username, master_token, android_id,
app='com.google.android.apps.chromecast.app',
service='oauth2:https://www.google.com/accounts/OAuthLogin',
client_sig='24bb24c05e47e0aefa68a58a766179d9b613a600'
)
if DEBUG:
print(res)
if 'Auth' not in res:
print('[!] Could not get access token.')
return None
return res['Auth']
def _get_android_id():
mac_int = getmac()
if (mac_int >> 40) % 2:
raise OSError("a valid MAC could not be determined."
" Provide an android_id (and be"
" sure to provide the same one on future runs).")
android_id = _create_mac_string(mac_int)
android_id = android_id.replace(':', '')
return android_id
def _create_mac_string(num, splitter=':'):
mac = hex(num)[2:]
if mac[-1] == 'L':
mac = mac[:-1]
pad = max(12 - len(mac), 0)
mac = '0' * pad + mac
mac = splitter.join([mac[x:x + 2] for x in range(0, 12, 2)])
mac = mac.upper()
return mac
if not device_id:
device_id = _get_android_id()
print('''
This script generates tokens that can be used when making requests to the Google Home Foyer API.
There are 2 kinds of tokens used here:
1. Master token - Is in the form `aas_et/***` and is long lived. Needs Google username and password.
2. Access token - Is in the form `ya29.***` and lasts for an hour. Needs Master token to generate.
If you do not want to store the Google account password in plaintext,
get the master token once, and set it as an override value.
It's safer/easier to generate an app password and use it instead of the actual password.
It still has the same access as the regular password, but still better than using the real password while scripting.
(https://myaccount.google.com/apppasswords)
''')
print('\n[*] Getting master token...')
if not master_token:
master_token = get_master_token(USERNAME, PASSWORD, device_id)
print('[*] Master token:', master_token)
print('\n[*] Getting access token...')
if not access_token:
access_token = get_access_token(USERNAME, master_token, device_id)
print('[*] Access token:', access_token)
print('\n[*] Done.')
MIT License
Copyright (c) 2020 Rithvik Vibhu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@Telmo
Copy link

Telmo commented Sep 17, 2023

I don't know if this will help. I tried multiple scripts/permutations and kept getting the Could Not get token messages. For some reason I decided to edit get_tokens.py in vi/vim and notices that when copying the app password from the google webpage it adds hidden characters. I instead typed the password displayed and this worked.

@AlexInABox
Copy link

Thanks @jawilson

@Prabhakar1980
Copy link

Managed to get it working.

  • Setup Debian 11 LXC
  • apt install python3
  • mkdir mastertoken
  • cd mastertoken
  • apt install python3-venv
  • python3 -m venv venv
  • source venv/bin/activate
  • pip install "urllib3<2.0.0"
  • pip install gpsoauth
  • Generated an App Password "gpsoauth" and adapted get_token.py via
  • nano get_token.py (used get_token.py)
USERNAME = 'username@example.com'
PASSWORD = '<GENERATED-APP-PASSWORD>'
  • python3 get_token.py
[*] Getting master token...
[*] Master token: XXX
  • deleted App Password "gpsoauth"
  • Generated an App Password "Google Home Integration for Home Assistant"
  • used this App Password for Integration Setup

Best regards, Matthias Schabhüttl

Hi ,

how to do this step

Generated an App Password "gpsoauth"

Hopefully the App Password is the above one , i am not sure ?

I have an app password which I used for Password. It is not producing the access token. Below is the output

python3 get_tokens.py

This script generates tokens that can be used when making requests to the Google Home Foyer API.
There are 2 kinds of tokens used here:

  1. Master token - Is in the form aas_et/*** and is long lived. Needs Google username and password.
  2. Access token - Is in the form ya29.*** and lasts for an hour. Needs Master token to generate.
    If you do not want to store the Google account password in plaintext,
    get the master token once, and set it as an override value.
    It's safer/easier to generate an app password and use it instead of the actual password.
    It still has the same access as the regular password, but still better than using the real password while scripting.
    (https://myaccount.google.com/apppasswords)

[] Getting master token...
[!] Could not get master token.
[
] Master token: None

[] Getting access token...
[!] Could not get access token.
[
] Access token: None

[*] Done.

@VNRARA
Copy link

VNRARA commented Sep 27, 2023

I think having a account with passkeys is making this impossible even when making app passwords.

@n4tur3502
Copy link

No matter what I do in haOS i cannot get this working. It always seems to give me the "could not get token" message. I have used my correct email and the app password.

@newstartech
Copy link

I tried a lot. get latest python v3.12.0 installed. run pip install gpsoauth - Ok. copy text of get_tokens.py raw text, saved to my pc. Change username to my google username full email address. password section, tried with app password generated by Google security. (note: it is 16 chars. google displayed with 4 sets with space in between. I tried with space or without). Even I turned off google 2 way auth method, so I can use my google password instead. I always get "Could not get master token", "Master token:None" , "Could not get access token", "Access token:None" don't know why? Anyone can help?

@tophattwaffle
Copy link

Same issue with:

[] Getting master token...
[!] Could not get master token.
[
] Master token: None

[] Getting access token...
[!] Could not get access token.
[
] Access token: None

@DRFR0ST
Copy link

DRFR0ST commented Oct 18, 2023

Try this: leikoilja/ha-google-home#599 (comment)

I have tried all of the suggested solutions and none of them worked, except for the one linked above.

@Frankymuc
Copy link

hi, i have my gogle account name and passwort included this scrpt. if i start its comes:
python3 get_tokens.py
File "/home/frank089/pythonsc/get_tokens.py", line 10
PASSWORD = pasword/
^
SyntaxError: invalid syntax

if the / not working with this scipt? must i change my google password an all on google account aps using google passwort?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment