前言
在建置「全球股市數據倉庫 (global-stock-data-warehouse)」時,自動化流程(GitHub Actions)是核心心臟。許多讀者在設定環境變數時常感到困惑。本篇將跳過基本的通知設定(如 Resend 或 Telegram),直接切入最重要的兩大核心變數,並分享一個能幫你節省數小時除錯時間的「403 錯誤」解決方案。
核心變數設定:讓自動化動起來
在 GitHub 專案的 Settings > Secrets and variables > Actions 中,我們必須準確設定以下兩個 Repository secrets:
1. GDRIVE_SERVICE_ACCOUNT (Google Drive 服務帳號金鑰)
這個變數是為了讓 GitHub Actions 有權限將抓取到的數據存上雲端硬碟。
設定重點:
這是一串 JSON 格式 的內容。
你需要先在 Google Cloud Console 建立一個「服務帳號 (Service Account)」,並下載其金鑰 JSON 檔。
關鍵步驟:請務必將該 JSON 檔中的 client_email 地址,手動加入到你 Google Drive 存放資料夾的「共用對象」中,並給予「編輯者」權限,否則程式會無法寫入。
將整個 JSON 檔案內容完整複製,貼入 GitHub 的 Secret 欄位。
進入 Google Cloud 控制台:用您的 Google 帳號登入 https://console.cloud.google.com/。 然後搜尋google driver api 點選

因為已經啟用了 所以點選管理進去

點選憑證後 建立憑證然後選擇服務帳戶

如下名稱自訂

點選剛剛建立的服務帳戶

建立新的金鑰

選擇建立josn即可 隨後就會自動下戴json檔案 打開檔案內容就可以複製貼上變數

Secrets and variables > Actions 後產生新的變數如下圖把剛剛建立的json檔案放在裏頭
gooogle driver設定共用分享剛剛建立的帳號

權限要設定編輯者

2. GH_PAT (Personal Access Token)
這是你的個人訪問令牌,允許 GitHub Actions 以你的身份執行特定操作(如更新專案或執行特定 Workflow)。
- 設定重點:
- 前往 GitHub 個人設定的 Developer settings > Personal access tokens (建議使用 Fine-grained tokens)。
- 權限範圍:至少需要具備 Contents (讀寫) 與 Workflows 的存取權限。
- 注意:Token 生成後只會顯示一次,請務必妥善保存。若失效或過期,GitHub Actions 將會報錯。
github 點選帳號下方settings

畫面左邊最底下Developer Settings

點選Personal access tokens 中的Fine-grained tokens

點選 Generate new token

輸入github密碼

名稱自訂

點選Only Select repositories 選擇指定的repo

Permissions 選擇Action ,Contents 和Metadata

Action和Contents點選read and write 後就可以按Generate token

出現下圖畫面 Generate token

就可以複製到如下產生的金鑰,但只會出現這一次,所以要妥善保存

然後就可以在github上點選下圖中的Secrets and variables > Actions 後產生新的變數如下圖把剛剛建立的token放在第二個變數 如果圖片不清楚可以點選圖片放大
點選圖片會有按鈕可以點選放大

raw-image
這樣資料庫更新完畢後就會自動呼叫另外一個repo專案https://github.com/grissomlin/Alpha-Data-Cleaning-Lab
自動更新漲停板和異常報酬清洗的動作
🔑 什麼是 GH_PAT?
GH_PAT 全名為 GitHub Personal Access Token,簡單來說就是一張「GitHub 核發的數位通行證」。它取代了傳統的帳號密碼,讓你的程式(機器人)可以代表你與 GitHub 進行互動。
------------------------------------------------------------------------------------------------------
取得google driver共用資料夾的ID
以及取得共用資料夾ID,在共用資料夾的網址中有一串亂數字串複製後

然後Setting\Secrets and variables 中的Actions 建立新的New repository secret
建立GDRIVE_FOLDER_ID 變數名稱輸入共用資料夾ID,這樣程式碼才能抓到存放資料庫的資料夾

🚀 在本專案中的主要用途
在 stock-reminder-bot 或類似的自動化專案中,GH_PAT 通常扮演以下三個角色:
1. 突破 API 存取頻率限制 (Rate Limiting)
GitHub 對於未驗證的請求(匿名存取)有很嚴格的限制(通常每小時僅 60 次)。
- 情境:如果你的機器人需要頻繁檢查 GitHub 上的設定檔,或是你的專案會從 GitHub 下載最新的代碼/元件。
- 用途:使用 GH_PAT 進行身分驗證後,限制會提升到每小時 5,000 次,確保機器人在頻繁執行時不會因為「存取過度」而被 GitHub 暫時封鎖 IP。
2. 存取私有儲存庫 (Private Repo)
- 情境:如果你的機器人程式碼、技術指標設定或敏感的
.db資料庫是存放在 私有 (Private) 的 GitHub 倉庫中。 - 用途:一般的網址存取無法讀取私有內容。GH_PAT 讓部署在 Railway 或 Docker 上的程式擁有「開門」的權力,能順利拉取 (Pull) 這些不對外公開的資料。
3. 自動化更新與回寫資料
- 情境:有些進階玩法會讓機器人在跑完分析後,自動把結果 commit (提交) 回 GitHub 存檔。
- 用途:GH_PAT 提供了寫入權限,讓機器人可以自動更新專案內的檔案(例如
last_run.txt或數據快取),而不需要人工介入。
⚠️ 給讀者的安全提醒
在文章中,務必提醒讀者關於 GH_PAT 的安全性:
- 不要寫死在程式碼裡:GH_PAT 具有極高權限,如果不小心將含有 Token 的程式碼 push 到公開倉庫,別人就能控制你的 GitHub。
- 使用環境變數:應將 GH_PAT 設定在 Railway 或 GitHub Actions 的 Secrets (環境變數) 中。
- 最小權限原則:在申請 PAT 時,只需勾選
repo相關權限即可,不要開啟不必要的權限(如delete_repo或admin)。
💡 特別提醒:關於通知系統 (Resend / Telegram)
雖然專案中可以看到 RESEND_API_KEY 或 TELEGRAM_BOT_TOKEN 等變數,但這些屬於「選配」功能。
- 你可以根據需求二選一(用郵件通知或 Telegram 機器人通知)。
- 如果你不需要即時通知,甚至可以不設定。關於這部分的設定教學,可以參考我之前的文章 如下有telegram的設定教學
Resend 設定教學
⚠️ 避坑指南:如何解決惱人的 403 錯誤?

這是在設定此專案時最容易遇到的「隱藏地雷」。
現象:明明變數都設對了,GitHub Actions 執行時卻出現 403 Forbidden 錯誤。
解決方案: 在使用此程式碼進行同步前,你必須先在指定的 Google Drive 資料夾中手動建立一個空的 SQLite 資料庫文件(.db 檔案)。
- 原因:程式在執行初期會嘗試連接或初始化現有的資料庫,若資料夾空無一物,權限校驗或路徑指向可能會觸發 Google API 的安全限制,進而導致 403 錯誤。
- 做法:在本地端建立一個空的檔案(例如
stock_data.db),先上傳到雲端硬碟指定資料夾中。有了這個「佔位符」,GitHub Actions 就能順利進行後續的寫入與更新。
如下事件利空db的方法
1. Google Colab 版本 (直接下載到電腦)
這段程式碼會在你執行後自動建立六個檔案,並將它們打包成 stock_dbs.zip 自動下載到你的電腦,方便你直接拖拽上傳到 Google Drive。
import sqlite3
import os
from google.colab import files
# 定義六個國家的資料庫名稱
countries = ['US', 'TW', 'JP', 'KR', 'HK', 'EU']
db_files = [f"{country}_stock.db" for country in countries]
# 循環建立空的 .db 檔案
for db_file in db_files:
# 建立連線會自動產生檔案,close 則完成建立
conn = sqlite3.connect(db_file)
conn.close()
print(f"✅ 已建立: {db_file}")
# 打包成 ZIP 並下載
zip_filename = "stock_dbs.zip"
os.system(f"zip {zip_filename} *.db")
files.download(zip_filename)
print("🚀 正在下載 ZIP 檔,解壓縮後上傳至 Google Drive 即可!")
2. VSCode / 本地端終端機版本 (最快一行指令)
如果你在 VSCode 的終端機(Terminal)裡,不需要寫 Python 檔案,直接複製貼上這行 Shell 指令(適用於 Mac/Linux 或 Windows 的 PowerShell/Git Bash):
PowerShell (Windows 預設):
"US", "TW", "JP", "KR", "HK", "EU" | ForEach-Object { New-Item "$($_)_stock.db" -ItemType File }
Bash / Zsh (Mac/Linux/Git Bash):
touch US_stock.db TW_stock.db JP_stock.db KR_stock.db HK_stock.db EU_stock.db
如下圖將空的db檔案放在指定的google driver

結語
設定自動化流程最難的往往不是寫代碼,而是環境的配置。搞定 GDRIVE_SERVICE_ACCOUNT 和 GH_PAT,並預先準備好空的資料庫檔案,你的全球股市數據監控系統就已經成功了一大半!
目前針對 Google Sheets API 403 Forbidden 的問題,我已嘗試過以下標準流程:
- 確保 Google Sheets API 與 Google Drive API 皆已在後台啟用。
- 使用 服務帳戶 (Service Account) 並已將
client_email加為試算表的「編輯者」。 - 程式碼中的 Scopes 已包含 Drive 與 Spreadsheets 的讀寫權限。
儘管如此,有時仍會遇到權限阻擋的狀況。如果各位網友或開發前輩知道還有哪些隱藏的設定(例如 Google Workspace 組織權限或特定環境變數衝突)可能導致 403 錯誤,還望不吝告知、指點迷津! 您的建議將是我極大的幫助,非常感謝!
本專案 GitHub 倉庫:














