部署Vercel后调用Udemy API遇403错误,本地运行正常
解决FastAPI部署到Vercel后调用Udemy API出现403 Forbidden的问题
可能的原因及解决步骤
1. 请求头标识被Udemy拦截
Udemy的API会校验请求的来源特征,Vercel服务器默认的请求头会被识别为非浏览器请求,直接触发拦截。
解决方法:手动设置与浏览器一致的请求头,示例代码:
import httpx from fastapi import FastAPI app = FastAPI() @app.get("/verify-udemy") async def verify_udemy(cookie: str): # 从前端获取用户的Udemy认证Cookie,或从请求头Cookie中提取 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", "Referer": "https://www.udemy.com/", "Cookie": cookie # 替换为用户真实的Udemy认证Cookie } async with httpx.AsyncClient() as client: resp = await client.get( "https://www.udemy.com/api-2.0/contexts/me/?header=True", headers=headers ) return {"status": resp.status_code, "data": resp.json() if resp.status_code == 200 else resp.text}
2. Vercel服务器IP被拉黑
Vercel的共享IP池可能因大量爬虫类请求被Udemy加入黑名单,导致所有从Vercel发出的请求都被拦截。
解决方法:
- 配置Vercel自定义域名,更换请求来源的域名标识
- 使用第三方代理IP转发请求,在httpx中配置代理:
async with httpx.AsyncClient(proxies="http://your-proxy-ip:port") as client: # 后续请求逻辑不变
3. 认证Cookie传递异常
本地开发时,浏览器会自动携带Udemy的会话Cookie到后端;部署到Vercel后,后端需要明确从前端请求中获取并转发Cookie,否则请求会被判定为未登录。
解决方法:
- 前端调用后端接口时,将浏览器中Udemy的Cookie(如
access_token、udemy_session等字段)传递给后端 - 后端严格按照Udemy的要求,将这些Cookie完整添加到请求头中再转发
4. 缺少必要的请求头字段
Udemy的API可能需要额外字段(如X-Requested-With)识别合法请求,本地浏览器请求会自动携带,但后端请求需手动添加。
可尝试在headers中加入:
"X-Requested-With": "XMLHttpRequest"
额外排查建议
- 在Vercel函数中打印请求的完整头信息和响应内容,对比本地请求的差异,定位缺失字段
- 通过在函数中执行
httpx.get("https://api.ipify.org").text获取Vercel服务器IP,直接用该IP访问Udemy API,测试是否能正常请求
内容的提问来源于stack exchange,提问作者Blog Khóa Học
相关产品推荐
相关产品推荐

