You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

2023年使用Curl登录Gmail的Bash脚本报错排查请求

Gmail登录Bash脚本排查与修复

问题描述

用户提供的Bash脚本尝试模拟登录Gmail,但无论凭据正确与否,始终返回Unknown error,脚本和user-agents.txt内容如下:

登录脚本

#!/bin/bash

email="email@gmail.com"
password="pass"
user_agent_file="/home/kali/Desktop/New Folder/user-agents.txt"
login_url="https://accounts.google.com/signin/v2/identifier"

# Choose a random user agent from the user-agents.txt file
user_agent=$(shuf -n 1 "$user_agent_file")

# Send initial login request to get GALX and gxf cookies
init_response=$(curl -s -c cookies.txt -A "$user_agent" "$login_url")

# Extract GALX and gxf cookies from response
galx=$(grep -o 'GALX........' cookies.txt | sed 's/GALX=//')
gxf=$(grep -o 'gxf........' cookies.txt | sed 's/gxf=//')

# Extract the value of the "challenge" input field from the login page
challenge=$(echo "$init_response" | grep -o 'name="challenge" value="[^"]*' | sed 's/name="challenge" value="//')

# Send login request with email and password
login_response=$(curl -s -b cookies.txt -c cookies.txt -A "$user_agent" -d "challenge=$challenge&GALX=$galx&gxf=$gxf&continue=https%3A%2F%2Fwww.google.com%2F&service=mail&rm=false&flowName=GlifWebSignIn&flowEntry=ServiceLogin&TL=AM3QAYbJwlY_Lc9sTyvA1fNYFtC51RtWpkKjgOYd3qT1YvUM8TLMWfneF24-kdC_" -d "Email=$email" -d "Passwd=$password" "$login_url")

# Check if login was successful
if echo "$login_response" | grep -q "redirecting"; then
  echo "Login successful!"
elif echo "$login_response" | grep -q "Enter the second factor"; then
  echo "Two-factor authentication required."
elif echo "$login_response" | grep -q "Wrong password"; then
  echo "Invalid credentials."
elif echo "$login_response" | grep -q "unusual activity"; then
  echo "IP temporarily blocked."
else
  echo "Unknown error."
fi

user-agents.txt内容

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko

核心问题分析

  1. Google登录机制已大幅更新:signin/v2/identifier接口已被淘汰,当前登录流程依赖大量JS生成的动态参数(如tk、recaptcha_token),纯curl无法执行JS,无法获取这些关键参数。
  2. 参数提取逻辑失效:
    • GALX、gxf参数的提取用固定长度匹配,实际参数长度可能变化,导致提取空值或错误值;
    • challenge字段可能已从当前登录页结构中移除,提取结果为空。
  3. 请求参数不合法:
    • 固定的TL参数是动态生成的一次性值,复用会直接触发验证失败;
    • 缺少Accept、Accept-Language、Referer等必要请求头,Google会判定为非合法浏览器请求。
  4. 响应判断关键词过时:Google当前的登录响应不再使用"redirecting"、"Wrong password"这类直白关键词,错误提示或成功状态的页面文本已更新。

修复建议

长期解决方案(推荐)

放弃模拟表单提交的方式,使用Google官方的OAuth2 API实现Gmail登录,这是唯一合法、稳定且受支持的方法,避免被Google的反爬机制拦截。

临时调试与修改(仅用于测试)

如果一定要继续用curl尝试,可做以下调整:

  1. 关闭静默模式查看真实响应:
    把curl的-s参数去掉,打印完整的响应内容,根据实际返回的页面文本调整判断逻辑。
  2. 修正参数提取逻辑:
    # 提取GALX和gxf的正确方式
    galx=$(grep -o 'GALX=[^;]*' cookies.txt | cut -d'=' -f2)
    gxf=$(grep -o 'gxf=[^;]*' cookies.txt | cut -d'=' -f2)
    
  3. 添加必要请求头:
    在登录请求的curl命令中增加以下头信息:
    -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \
    -H "Accept-Language: en-US,en;q=0.5" \
    -H "Referer: $login_url"
    
  4. 动态提取TL参数:
    从初始请求的响应中提取TL参数,不要固定写死:
    tl=$(echo "$init_response" | grep -o 'name="TL" value="[^"]*' | sed 's/name="TL" value="//')
    
    然后在登录请求的-d参数中替换为TL=$tl。

内容的提问来源于stack exchange,提问作者Aviral Srivastava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:10:33