Thomas 從零搞定 Google API 全套授權,讓 AI 能上傳 YouTube、讀寫 Drive、收發 Gmail。附 IDE ↔ 終端機 Handover 溝通術。
沒有 OAuth 的世界:你把家門鑰匙(密碼)直接給快遞員 → 他能進你家做任何事,包括翻你的抽屜、改你的門鎖。你無法限制他的行為,也無法收回鑰匙(除非改鎖)。
有 OAuth 的世界:你在門禁系統登記快遞公司 → 快遞員刷工牌進入 → 只能到指定區域(玄關放包裹)→ 你可以隨時在門禁系統取消授權,不用換鎖。
OAuth 的核心設計就是:App 永遠拿不到你的密碼。它只拿到一個有限期的 Token,而且你可以隨時在 Google 帳號設定 撤銷授權。
| 概念 | 白話翻譯 | 文件 |
|---|---|---|
| OAuth Client Secret 用戶端密碼(Client Secret) |
你 App 的「身份證」,告訴 Google「我是誰」。下載一次,長期使用。 | google_oauth_thomastangnz.json |
| Access Token 存取權杖 |
臨時通行證,1 小時過期。程式自動管理,你不用管。 | 自動管理,不用管 |
| Refresh Token 重新整理權杖 |
通行證續期卡,長期有效。Access Token 過期時自動用它換新的。 | google_token_thomastangnz.json |
Client Secret = 你的駕照(證明你是你)
Access Token = 停車場的臨時票(1 小時到期)
Refresh Token = 停車場的月卡(到期自動續,不用重新申請)
https://console.cloud.google.com/apis/library/youtube.googleapis.com
Drive、Gmail、Calendar、Sheets、Docs、Slides 各有獨立的 API,需要時到 API Library 搜名字點 ENABLE 即可。
https://console.cloud.google.com/apis/credentials/consent
左側菜單結構(新版 UI):
2024 年後 Google 把 OAuth Consent Screen 改名為 Google Auth Platform,左側選單變成:總覽 / 品牌 / 目標對象 / 用戶端 / 資料存取權 / 驗證中心 / 設定。網上大多數教程還是舊版截圖,不要被搞混。
在左側「用戶端」(Clients) 頁面:
google_oauth_你的帳號名.json(例:google_oauth_thomastangnz.json)Desktop app 類型適合本機腳本(Python / Claude Code),不需要設定 redirect URI。如果選了 Web app 類型,需要額外處理 callback URL,本機跑腳本會很麻煩。
google_token_thomastangnz.json因為你的 App 沒有提交 Google 審核(也不需要,只有你自己用)。點「進階 → 繼續」就好,完全安全,因為這個 App 就是你自己建的。
| 🎨 | 服務 | 能做什麼 | Scope |
|---|---|---|---|
| 🎥 | YouTube | 上傳影片、管理播放清單、編輯/刪除影片、查看數據 | youtube, youtube.upload |
| 📁 | Google Drive | 讀寫所有文件、上傳下載、管理權限分享 | drive |
| ✉ | Gmail | 收發郵件、搜索、管理標籤 | gmail.modify, gmail.send |
| 📅 | Google Calendar | 讀寫日曆、建立/編輯事件 | calendar |
| 📊 | Google Sheets | 讀寫試算表、批量更新儲存格 | spreadsheets |
| 📄 | Google Docs | 讀寫文件、插入內容 | documents |
| 🎬 | Google Slides | 讀寫簡報、新增投影片 | presentations |
其他服務(Gmail、Calendar、Sheets 等)用到時再去 API Library 啟用對應 API 即可。OAuth 權限已經全給了,不用重新授權,只要啟用 API 就能用。
這是本篇的特色章節。Thomas 在實戰中發現,用「IDE 裡的 Claude」和「終端機裡的 Claude」協作,效率遠超單窗口。
IDE Claude = 軍師(看地圖、制定方案、寫文件)
終端機 Claude = 執行者(拿到指令就埋頭幹活,不問問題)
兩者之間靠一份 handover.md 文件傳遞任務,就像軍師寫好的作戰計劃交給執行者。
# 任務名稱 Handover
## 目標
一句話說明要做什麼
## 背景
- 為什麼要做
- 相關文件路徑
- 已完成的前置步驟
## 具體任務
1. 第一步...
2. 第二步...
3. 第三步...
## 完成後
- 存入記憶(寫到 MEMORY.md 或對應的 lesson 文件)
- 刪除本文件:`rm d:/tmp/xxx-handover.md`
d:/tmp/ 不備份、不 git track,用完即丟。Handover 文件是臨時的溝通橋樑,任務完成後刪掉就好,不需要保留。重要的上下文已經被寫進 Claude 的記憶系統了。
這次實際完成的任務流程:
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
# 讀取本地 Token(首次授權後自動生成的文件)
creds = Credentials.from_authorized_user_file("google_token_thomastangnz.json")
# 建立 YouTube API 客戶端
youtube = build("youtube", "v3", credentials=creds)
# 上傳一個影片
request = youtube.videos().insert(
part="snippet,status",
body={
"snippet": {
"title": "影片標題",
"description": "影片描述",
"tags": ["標籤1", "標籤2"],
"categoryId": "22" # People & Blogs
},
"status": {
"privacyStatus": "unlisted" # 不公開(有連結才能看)
}
},
media_body=MediaFileUpload("video.mp4", resumable=True)
)
response = request.execute()
print(f"上傳成功!影片 ID: {response['id']}")
public = 公開(所有人搜得到)unlisted = 不公開(有連結才能看,推薦用這個)private = 私人(只有你自己能看)# 建立播放清單
playlist = youtube.playlists().insert(
part="snippet,status",
body={
"snippet": {
"title": "播放清單名稱",
"description": "播放清單描述"
},
"status": {"privacyStatus": "unlisted"}
}
).execute()
# 把影片加入播放清單
youtube.playlistItems().insert(
part="snippet",
body={
"snippet": {
"playlistId": playlist["id"],
"resourceId": {
"kind": "youtube#video",
"videoId": "上傳後拿到的影片ID"
}
}
}
).execute()
google_oauth_*.json — 包含你 App 的 Client Secret,洩漏 = 別人可以冒充你的 Appgoogle_token_*.json — 包含你的 Refresh Token,洩漏 = 別人可以直接存取你的 Google 帳號資料這兩個文件放 d:/tmp/,不在任何 git 備份範圍內。
google_oauth_帳號名.jsongoogle_token_帳號名.json例如:google_oauth_thomastangnz.json / google_token_thomastangnz.json
如果有第二個帳號:google_oauth_work.json / google_token_work.json
不用管。程式會自動用 Refresh Token 換新的 Access Token。除非你手動撤銷了授權,否則不需要重新登入。
安全。這個警告是給別人看的(提醒他們小心不認識的 App)。你自己建的 App、自己的 Google 帳號,完全沒問題。不需要花時間提交 Google 驗證審核。
可以。每個帳號生成自己的 token 文件(如 google_token_account2.json),腳本裡指定不同的 token 文件即可。OAuth Client Secret 可以共用同一個。
不一定。任何文字格式都行(.txt、.md、甚至直接在對話裡貼文字)。用 .md 是因為 Claude 讀 Markdown 格式最順暢,結構也最清晰。
因為 IDE Claude 和終端機 Claude 的權限和能力不同。IDE Claude 有 MCP 工具但權限限制多;終端機 Claude bypass 更徹底但缺少上下文。分工合作比一個人死磕效率高。