fix: prevent drive auth browser launch
All checks were successful
CD Pipeline / deploy (push) Successful in 1m2s

This commit is contained in:
ogt
2026-06-25 15:51:37 +08:00
parent 0b30df4a65
commit 00948f5cc0
4 changed files with 19 additions and 4 deletions

View File

@@ -402,7 +402,7 @@ YOUTUBE_API_KEY = os.getenv('YOUTUBE_API_KEY', '')
# ==========================================
# 系統版本與路徑
# ==========================================
SYSTEM_VERSION = "V10.689"
SYSTEM_VERSION = "V10.690"
LOG_FILE_PATH = os.path.join(BASE_DIR, 'logs/system.log')
public_url = PUBLIC_URL # 用於模板顯示

View File

@@ -766,3 +766,4 @@ POSTGRES_HOST=momo-db
| 2026-06-25 | 價格語意不得反轉 | V10.687 起 dashboard 的 `gap_pct >= 5` 一律顯示為「PChome 價格優勢」與 win tone`gap_pct <= -5` 一律顯示為「MOMO 低價壓力」與 risk tone避免把 PChome 較便宜誤標為價格壓力。 |
| 2026-06-25 | 覆核 note 不得保留反向價格詞 | V10.688 起單位價覆核 note 不再使用「不應誤判為 PChome 價格壓力」這類否定式錯誤詞,改用「需先檢查 PChome 售價、折扣與組合」等可執行語句。 |
| 2026-06-25 | 舊覆核資料輸出層也要清洗價格語意 | V10.689 起 dashboard template 會在輸出 `unit_price_insight.summary` 時清除舊資料殘留的反向價格詞,避免快取或歷史 row 繼續把錯誤字句顯示給營運使用者。 |
| 2026-06-25 | Google Drive 背景匯入不得尋找本機瀏覽器 | V10.690 起 `GoogleDriveService.authenticate()` 預設拒絕背景 OAuth即使人工明確開啟互動授權也使用 `open_browser=False` 並輸出授權網址,不在 scheduler/app 容器內尋找 runnable browser。 |

View File

@@ -30,6 +30,7 @@ CREDENTIALS_FILE = 'config/google_credentials.json'
TOKEN_FILE = 'config/google_token.json'
_LEGACY_PICKLE_FILE = 'config/google_token.pickle'
INTERACTIVE_AUTH_ENV = 'GOOGLE_DRIVE_ALLOW_INTERACTIVE_AUTH'
INTERACTIVE_AUTH_TIMEOUT_ENV = 'GOOGLE_DRIVE_INTERACTIVE_AUTH_TIMEOUT_SECONDS'
def _interactive_auth_allowed() -> bool:
@@ -37,6 +38,13 @@ def _interactive_auth_allowed() -> bool:
return os.getenv(INTERACTIVE_AUTH_ENV, "").strip().lower() in {"1", "true", "yes", "on"}
def _interactive_auth_timeout_seconds() -> int:
try:
return max(60, int(os.getenv(INTERACTIVE_AUTH_TIMEOUT_ENV, "300")))
except (TypeError, ValueError):
return 300
class GoogleDriveService:
"""Google Drive 服務類別"""
@@ -140,8 +148,14 @@ class GoogleDriveService:
flow = InstalledAppFlow.from_client_secrets_file(
CREDENTIALS_FILE, SCOPES
)
# 對於「電腦版應用程式」類型,使用預設行為讓 Google 自動選擇埠號
self.credentials = flow.run_local_server()
# 即使是人工授權,也只印授權 URL不在伺服器/容器內自動尋找瀏覽器。
self.credentials = flow.run_local_server(
open_browser=False,
timeout_seconds=_interactive_auth_timeout_seconds(),
authorization_prompt_message=(
"請在可登入 Google 的瀏覽器開啟以下網址完成授權:{url}"
),
)
# 儲存憑證供下次使用JSON 格式,安全無 RCE 風險)
if not self._save_credentials():

View File

@@ -34,7 +34,7 @@ if not os.path.exists('config/google_credentials.json'):
print("✅ 找到憑證檔案")
print()
print("正在啟動 OAuth 2.0 認證流程...")
print("瀏覽器將自動開啟,請完成授權。")
print("終端機會顯示授權網址,請在可登入 Google 的瀏覽器開啟後完成授權。")
print()
os.environ["GOOGLE_DRIVE_ALLOW_INTERACTIVE_AUTH"] = "true"