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
核心问题分析
- Google登录机制已大幅更新:
signin/v2/identifier接口已被淘汰,当前登录流程依赖大量JS生成的动态参数(如tk、recaptcha_token),纯curl无法执行JS,无法获取这些关键参数。 - 参数提取逻辑失效:
- GALX、gxf参数的提取用固定长度匹配,实际参数长度可能变化,导致提取空值或错误值;
challenge字段可能已从当前登录页结构中移除,提取结果为空。
- 请求参数不合法:
- 固定的
TL参数是动态生成的一次性值,复用会直接触发验证失败; - 缺少
Accept、Accept-Language、Referer等必要请求头,Google会判定为非合法浏览器请求。
- 固定的
- 响应判断关键词过时:Google当前的登录响应不再使用"redirecting"、"Wrong password"这类直白关键词,错误提示或成功状态的页面文本已更新。
修复建议
长期解决方案(推荐)
放弃模拟表单提交的方式,使用Google官方的OAuth2 API实现Gmail登录,这是唯一合法、稳定且受支持的方法,避免被Google的反爬机制拦截。
临时调试与修改(仅用于测试)
如果一定要继续用curl尝试,可做以下调整:
- 关闭静默模式查看真实响应:
把curl的-s参数去掉,打印完整的响应内容,根据实际返回的页面文本调整判断逻辑。 - 修正参数提取逻辑:
# 提取GALX和gxf的正确方式 galx=$(grep -o 'GALX=[^;]*' cookies.txt | cut -d'=' -f2) gxf=$(grep -o 'gxf=[^;]*' cookies.txt | cut -d'=' -f2) - 添加必要请求头:
在登录请求的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" - 动态提取TL参数:
从初始请求的响应中提取TL参数,不要固定写死:
然后在登录请求的tl=$(echo "$init_response" | grep -o 'name="TL" value="[^"]*' | sed 's/name="TL" value="//')-d参数中替换为TL=$tl。
内容的提问来源于stack exchange,提问作者Aviral Srivastava
相关产品推荐
相关产品推荐

