Reputation: 11
I wrote a little python app which will stop and create broadcast via the youtube api at defined times. It works all fine but the token created at the first start or when a token does not exists when the app is started gets expired after a few days. A refresh token is included but after a few days it fails to refresh the token.
I would like to only have to login once and just allow a refresh of the token.
Here is my login function
SCOPES = ["https://www.googleapis.com/auth/youtube"]
...
...
def _authenticate(self, create_new_token: bool = False):
try:
credentials = None
dirname = os.path.dirname(__file__)
token_filename = os.path.join(dirname, self.TOKEN_FILE)
if os.path.exists(token_filename): # do we have a token file allready?
credentials = Credentials.from_authorized_user_file(
token_filename, self.SCOPES
)
if create_new_token:
credentials = None # will force to have to login again and create a new token file
if (
not credentials or not credentials.valid
): # do we have no token or is the token no longer valid?
if (
credentials and credentials.expired and credentials.refresh_token
): # is the token expired?
try:
self.logger.debug("Token expired. Attempting to refresh...")
credentials.refresh(Request())
self.logger.debug("Token successfully refreshed.")
except Exception as e:
self.logger.error(f"Error renewing token: {e}")
raise e
else:
try:
dirname = os.path.dirname(__file__)
filename = os.path.join(
dirname,
self.config[self.CONF_YOUTUBE_SETTINGS][
self.CONF_CREDENTIALS_FILE
],
)
flow = InstalledAppFlow.from_client_secrets_file(
filename,
self.SCOPES,
)
credentials = flow.run_local_server(
port=0, access_type="offline", prompt="consent"
)
except Exception as e:
self.logger.error(
f"Failed to login, maybe the credentials file does not exist? `{filename}` Error was: {e}"
)
raise e
try:
with open(token_filename, "w") as token:
token.write(credentials.to_json())
self.logger.info(
f"Token was succefully writen to token file `{token_filename}`"
)
except Exception as e:
self.logger.error(
f"Failed to login, maybe the credentials file does not exist? `{token_filename}` Error was: {e}"
)
raise e
self.youtube = build("youtube", "v3", credentials=credentials)
return self.youtube
except Exception as e:
self.logger.error(f"Failed to authenticate: {str(e)}")
return None
Here are some logs of my python script: Successful refresh of the token
2025-01-13 23:59:02,157 - DEBUG - Token expired. Attempting to refresh...
2025-01-13 23:59:02,157 - DEBUG - Making request: POST https://oauth2.googleapis.com/token
2025-01-13 23:59:02,159 - DEBUG - Starting new HTTPS connection (1): oauth2.googleapis.com:443
2025-01-13 23:59:02,584 - DEBUG - https://oauth2.googleapis.com:443 "POST /token HTTP/1.1" 200 None
2025-01-13 23:59:02,584 - DEBUG - Token successfully refreshed.
2025-01-13 23:59:02,585 - INFO - Token was succefully writen to token file `/home/My/youtube-manager/token.secret`
2025-01-13 23:59:02,587 - INFO - file_cache is only supported with oauth2client<4.0.0
2025-01-13 23:59:02,598 - DEBUG - URL being requested: POST https://youtube.googleapis.com/youtube/v3/liveBroadcasts/transition?part=status&broadcastStatus=complete&id=11111&alt=json
2025-01-13 23:59:04,189 - INFO - Broadcast with the id `11111` was stopped successfully
And here it failed
2025-01-14 11:59:02,161 - DEBUG - Token expired. Attempting to refresh...
2025-01-14 11:59:02,162 - DEBUG - Making request: POST https://oauth2.googleapis.com/token
2025-01-14 11:59:02,164 - DEBUG - Starting new HTTPS connection (1): oauth2.googleapis.com:443
2025-01-14 11:59:02,398 - DEBUG - https://oauth2.googleapis.com:443 "POST /token HTTP/1.1" 400 None
2025-01-14 11:59:02,399 - ERROR - Error renewing token: ('invalid_grant: Token has been expired or revoked.', {'error': 'invalid_grant', 'error_description': 'Token has been expired or revoked.'})
2025-01-14 11:59:02,399 - ERROR - Failed to authenticate: ('invalid_grant: Token has been expired or revoked.', {'error': 'invalid_grant', 'error_description': 'Token has been expired or revoked.'})
2025-01-14 11:59:02,399 - ERROR - Failed to stop broadcast: 'YouTubeStreamManager' object has no attribute 'youtube'
Upvotes: 0
Views: 24