如何通过cURL登录谷歌账号?现有脚本因登录机制变更报错
谷歌账号cURL登录完整步骤(解决GALX/gxf Token解析失败问题)
嘿,我之前碰到过一模一样的情况!谷歌最近确实把登录流程改得更严格了,那些依赖抓取页面token的老脚本很容易就失效了。你遇到的Could not parse for GALX or gxf token错误,本质就是脚本没法从密码页面正确提取登录必需的验证参数。下面是适配当前谷歌登录机制的cURL完整登录步骤,你可以对照着调整你的脚本:
核心步骤
1. 初始化cURL会话,开启Cookie管理
谷歌登录全程依赖Cookie维持会话,所以第一步必须配置Cookie存储,同时伪装成主流浏览器的请求(谷歌会拦截疑似爬虫的请求):
// 临时生成Cookie文件存储路径 $cookieFile = tempnam(sys_get_temp_dir(), 'gvoice_cookie'); $ch = curl_init(); // 启用Cookie读写 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // 自动跟随跳转 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 返回响应内容而不是直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置主流浏览器UA,避免被识别为爬虫 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36');
2. 访问初始登录页,提取会话基础Token
不要直接访问密码页,得先从谷歌登录入口页获取初始会话参数,比如GALX、gxf、sessiontoken,这些是后续提交表单的必需项:
// 请求登录入口页 curl_setopt($ch, CURLOPT_URL, 'https://accounts.google.com/signin'); $html = curl_exec($ch); // 用正则提取GALX参数 preg_match('/name="GALX" value="([^"]+)"/', $html, $galxMatches); $galx = $galxMatches[1] ?? ''; // 提取gxf参数 preg_match('/name="gxf" value="([^"]+)"/', $html, $gxfMatches); $gxf = $gxfMatches[1] ?? ''; // 提取sessiontoken参数 preg_match('/name="sessiontoken" value="([^"]+)"/', $html, $sessionMatches); $sessiontoken = $sessionMatches[1] ?? '';
3. 提交用户名,进入密码验证环节
把用户名和刚才提取的Token提交到账号验证接口,这一步会更新会话Cookie,同时跳转到密码输入页:
$loginPostData = http_build_query([ 'identifier' => '你的谷歌账号邮箱', 'GALX' => $galx, 'gxf' => $gxf, 'sessiontoken' => $sessiontoken, 'continue' => 'https://voice.google.com/', // 目标跳转页,比如谷歌语音 'checkedDomains' => 'google', 'pstMsg' => 0, ]); // 提交用户名到验证接口 curl_setopt($ch, CURLOPT_URL, 'https://accounts.google.com/signin/v2/challenge/pwd'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $loginPostData); $passwordPageHtml = curl_exec($ch);
提交后,需要重新从返回的密码页HTML中提取更新后的GALX、gxf、sessiontoken(会话会刷新这些参数),方法和步骤2一致。
4. 提交密码,完成登录
用新提取的Token组装密码提交表单,完成登录:
// 重新提取密码页的Token参数 preg_match('/name="GALX" value="([^"]+)"/', $passwordPageHtml, $newGalxMatches); $newGalx = $newGalxMatches[1] ?? ''; preg_match('/name="gxf" value="([^"]+)"/', $passwordPageHtml, $newGxfMatches); $newGxf = $newGxfMatches[1] ?? ''; preg_match('/name="sessiontoken" value="([^"]+)"/', $passwordPageHtml, $newSessionMatches); $newSessiontoken = $newSessionMatches[1] ?? ''; // 组装密码提交数据 $passwordPostData = http_build_query([ 'password' => '你的谷歌账号密码', 'GALX' => $newGalx, 'gxf' => $newGxf, 'sessiontoken' => $newSessiontoken, 'continue' => 'https://voice.google.com/', 'checkedDomains' => 'google', 'pstMsg' => 0, ]); // 提交密码 curl_setopt($ch, CURLOPT_POSTFIELDS, $passwordPostData); $loginResult = curl_exec($ch);
5. 处理二次验证(若开启2FA)
如果你的账号开启了两步验证,这时候会返回验证页面,需要提取challengeId等参数,然后提交验证码(比如短信验证码、Google Authenticator验证码)到对应的验证接口,逻辑和前面的表单提交类似。
6. 验证登录状态
登录完成后,请求目标页面(比如谷歌语音),检查返回内容是否包含登录后的标识(比如用户名、语音功能入口),确认登录是否成功。
关键注意事项
- 谷歌登录流程会频繁更新,上述步骤可能随谷歌调整失效,需要定期检查页面HTML结构的变化;
- 如果账号有异常登录记录,谷歌可能触发reCAPTCHA人机验证,cURL脚本无法自动处理,需要手动验证或借助第三方工具;
- 避免频繁用脚本登录,容易触发谷歌安全机制导致账号被限制。
内容的提问来源于stack exchange,提问作者Tim Nuwin
相关产品推荐
相关产品推荐

