MCPcopy Create free account
hub / github.com/TheSmallHanCat/flow2api / login

Method login

src/services/protocol_login.py:192–321  ·  view source on GitHub ↗
(
        self,
        google_cookies_raw: str,
        proxy: Optional[str] = None,
        email: Optional[str] = None,
    )

Source from the content-addressed store, hash-verified

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

Callers 1

Calls 9

_parse_google_cookiesFunction · 0.85
_normalize_proxy_urlFunction · 0.85
_merge_cookiesFunction · 0.85
_build_cookie_headerFunction · 0.85
_append_login_hintFunction · 0.85
_extract_session_tokenFunction · 0.85
postMethod · 0.80
log_errorMethod · 0.80

Tested by

no test coverage detected