(
self,
google_cookies_raw: str,
proxy: Optional[str] = None,
email: Optional[str] = None,
)
| 190 | """Login to labs.google/fx through NextAuth Google OAuth using Google cookies.""" |
| 191 | |
| 192 | async def login( |
| 193 | self, |
| 194 | google_cookies_raw: str, |
| 195 | proxy: Optional[str] = None, |
| 196 | email: Optional[str] = None, |
| 197 | ) -> Dict[str, Any]: |
| 198 | google_cookies = _parse_google_cookies(google_cookies_raw) |
| 199 | if not any(name in google_cookies for name in GOOGLE_COOKIE_NAMES): |
| 200 | return { |
| 201 | "success": False, |
| 202 | "error": "未找到有效的 Google cookie(需要 SID/HSID/SSID/APISID/SAPISID 中至少一个)", |
| 203 | } |
| 204 | |
| 205 | session_kwargs: Dict[str, Any] = {"impersonate": IMPERSONATE, "trust_env": False} |
| 206 | proxy_url = _normalize_proxy_url(proxy) |
| 207 | if proxy_url: |
| 208 | session_kwargs["proxy"] = proxy_url |
| 209 | |
| 210 | async with AsyncSession(**session_kwargs) as session: |
| 211 | try: |
| 212 | csrf_resp = await session.get(f"{LABS_BASE}/api/auth/csrf") |
| 213 | if csrf_resp.status_code != 200: |
| 214 | return {"success": False, "error": f"CSRF 失败: HTTP {csrf_resp.status_code}"} |
| 215 | csrf_token = (csrf_resp.json() or {}).get("csrfToken") |
| 216 | if not csrf_token: |
| 217 | return {"success": False, "error": "CSRF 响应缺少 csrfToken"} |
| 218 | |
| 219 | labs_cookies: Dict[str, str] = {} |
| 220 | _merge_cookies(labs_cookies, csrf_resp.headers) |
| 221 | |
| 222 | signin_resp = await session.post( |
| 223 | f"{LABS_BASE}/api/auth/signin/google", |
| 224 | data={ |
| 225 | "csrfToken": csrf_token, |
| 226 | "callbackUrl": LABS_BASE, |
| 227 | "json": "true", |
| 228 | }, |
| 229 | headers={ |
| 230 | "Referer": LABS_BASE, |
| 231 | "Origin": "https://labs.google", |
| 232 | "Cookie": _build_cookie_header(labs_cookies), |
| 233 | }, |
| 234 | allow_redirects=False, |
| 235 | ) |
| 236 | if signin_resp.status_code != 200: |
| 237 | return {"success": False, "error": f"Signin 失败: HTTP {signin_resp.status_code}"} |
| 238 | |
| 239 | _merge_cookies(labs_cookies, signin_resp.headers) |
| 240 | signin_data = signin_resp.json() or {} |
| 241 | redirect_url = signin_data.get("redirect") or signin_data.get("url") |
| 242 | if not redirect_url: |
| 243 | return {"success": False, "error": f"无重定向 URL: {json.dumps(signin_data)[:200]}"} |
| 244 | redirect_url = _append_login_hint(redirect_url, email) |
| 245 | |
| 246 | google_cookie_header = _build_cookie_header(google_cookies) |
| 247 | callback_url = "" |
| 248 | current_url = redirect_url |
| 249 |
no test coverage detected