如何用Python获取印尼HappyFresh移动App的Client Token?
爬取HappyFresh时获取Client Token的问题
背景
我正在爬取印尼本土移动应用HappyFresh,已通过MITM完成抓包。核心问题是找不到获取x-spree-client-token的初始请求URL,之前使用设备上的登录Token,但该Token会定期过期,导致请求返回{'error': 'Missing Client Token'}。
当前代码
!pip install httpx[http2] import httpx client = httpx.AsyncClient(http2=True) header={ 'content-type': 'application/json', 'locale': 'EN', 'x-spree-client-token': '0115f406e71219ec9ea58e2eaaa4480ef966bdc42e245ec4bf601b23f07bd48e', 'x-device-id': '6923335fdd6fc988', 'x-advertising-id': '2e0acc03-2645-46bd-b464-0d3d8350b874', 'country': 'ID', 'x-country-code': 'ID', 'x-happy-client-type': 'android', 'x-happy-client-version': '3.81.2', 'x-happy-client-build': '2398', 'x-place-token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJlbWFpbCI6ImV4YW1wbGVAdXNlci5jb20iLCJ1c2VyX25hbWUiOiJleGFtcGxlIiwiY2xpZW50X2lkIjoxLCJpYXQiOjE2NjkxMzYzOTMsImV4cCI6MTY2OTEzNjY5M30.RKz_T08SS9HpkHaHNcXc4Hb31zgk6DKm1daCpIB7TDQ', 'x-happy-cash-shield-session-id': '4be315c3e3044ad18811815dc1fc3c22', 'accept-encoding': 'gzip', 'user-agent': 'okhttp/4.9.1' } response = await client.get("https://api.happyfresh.com/api/widgets/home?lat=-6.1608563&lon=106.7927658 HTTP/2.0",headers=header)
排查与解决建议
1. 重新梳理冷启动抓包流程
- 清空应用缓存、存储后完全重启应用,从冷启动阶段开始抓包,重点关注前3-5个请求,这类请求通常用于初始化会话或获取基础令牌。
- 在抓包工具中过滤含
token、client、session关键词的请求,检查响应体/响应头是否包含x-spree-client-token。 - 留意路径中带
oauth、auth、session、init的端点,比如/api/v1/oauth/token、/api/client/init这类常见的令牌获取URL。
2. 分析无Token的初始化请求
- 查找抓包中仅携带
x-device-id、user-agent等基础设备信息,但未带x-spree-client-token的请求,这类请求大概率是生成或获取客户端令牌的接口。 - 检查
OPTIONS预检请求,部分应用会在正式请求前通过预检请求传递会话初始化信息。
3. 验证本地生成Token的可能性
如果抓包始终找不到明确的Token获取请求,可能该Token是客户端本地生成的:
- 对比不同设备ID、应用版本下的Token,尝试寻找哈希或加密规律;
- 反编译APK文件,定位生成
x-spree-client-token的代码逻辑(注意应用是否有代码混淆)。
4. 修正当前代码的URL错误
当前请求URL末尾的HTTP/2.0属于协议标识,不应包含在URL中,修正后应为:
response = await client.get("https://api.happyfresh.com/api/widgets/home?lat=-6.1608563&lon=106.7927658", headers=header)
内容的提问来源于stack exchange,提问作者Hal
相关产品推荐
相关产品推荐

