Spaces:
Sleeping
Sleeping
| """One-time local script to obtain a Google Drive refresh token. | |
| Run this ONCE on your laptop after downloading `client_secret.json` from GCP: | |
| pip install google-auth-oauthlib | |
| python get_refresh_token.py | |
| A browser window will open. Log in with the Google account whose Drive you | |
| want the thyroid initial-visit notes saved to. After consent, the script prints | |
| three values you copy into Hugging Face Space β Settings β Variables and | |
| secrets: | |
| GDRIVE_CLIENT_ID | |
| GDRIVE_CLIENT_SECRET | |
| GDRIVE_REFRESH_TOKEN | |
| You can then delete `client_secret.json` (or keep it offline β never commit | |
| it; .gitignore already excludes it). | |
| """ | |
| from __future__ import annotations | |
| import json | |
| import sys | |
| from pathlib import Path | |
| try: | |
| from google_auth_oauthlib.flow import InstalledAppFlow | |
| except ImportError: | |
| sys.stderr.write( | |
| "Missing dependency. Run:\n pip install google-auth-oauthlib\n" | |
| ) | |
| sys.exit(1) | |
| SCOPES = ["https://www.googleapis.com/auth/drive.file"] | |
| CLIENT_SECRET_PATH = Path(__file__).parent / "client_secret.json" | |
| def main() -> None: | |
| if not CLIENT_SECRET_PATH.exists(): | |
| sys.stderr.write( | |
| f"client_secret.json not found at {CLIENT_SECRET_PATH}\n" | |
| "Download it from GCP Console β APIs & Services β Credentials β " | |
| "your OAuth client β DOWNLOAD JSON, then place it in this folder.\n" | |
| ) | |
| sys.exit(1) | |
| flow = InstalledAppFlow.from_client_secrets_file(str(CLIENT_SECRET_PATH), SCOPES) | |
| creds = flow.run_local_server( | |
| port=0, | |
| prompt="consent", | |
| authorization_prompt_message="A browser window is opening for Google login...", | |
| success_message="Authorization complete. You can close this tab and return to the terminal.", | |
| ) | |
| if not creds.refresh_token: | |
| sys.stderr.write( | |
| "No refresh_token returned. This usually means you have already authorised\n" | |
| "this OAuth client and Google did not re-issue one. To force a new refresh\n" | |
| "token, go to https://myaccount.google.com/permissions, revoke the app,\n" | |
| "and run this script again.\n" | |
| ) | |
| sys.exit(1) | |
| with CLIENT_SECRET_PATH.open() as f: | |
| client_data = json.load(f) | |
| installed = client_data.get("installed") or client_data.get("web") or {} | |
| client_id = installed.get("client_id", "") | |
| client_secret = installed.get("client_secret", "") | |
| print() | |
| print("=" * 70) | |
| print("SUCCESS β copy these THREE values into Hugging Face Space secrets:") | |
| print("=" * 70) | |
| print() | |
| print(f"GDRIVE_CLIENT_ID = {client_id}") | |
| print(f"GDRIVE_CLIENT_SECRET = {client_secret}") | |
| print(f"GDRIVE_REFRESH_TOKEN = {creds.refresh_token}") | |
| print() | |
| print("Optional, only if you want a fixed Drive folder name:") | |
| print('GDRIVE_FOLDER_NAME = Thyroid Initial Visits (default if unset)') | |
| print() | |
| print("Keep these secret. Anyone with the refresh_token can write to your Drive") | |
| print("(scoped to files this app creates only β drive.file scope).") | |
| print("=" * 70) | |
| if __name__ == "__main__": | |
| main() | |