使用Python Requests爬取App Store Connect财务报告遇CSRF错误
解决App Store Connect爬取时的CSRF Token错误
你当前的代码直接POST登录请求,跳过了获取登录页面CSRF Token的步骤,导致登录验证失败,后续请求无法获取到X-CSRF-Token Cookie,触发KeyError。以下是具体解决思路和修正后的代码:
错误原因
App Store Connect的登录页面会在返回的HTML中嵌入CSRF Token,同时设置必要的会话Cookie,直接提交账号密码会因为缺少这些验证信息被拒绝,会话无法正常建立,自然拿不到后续API需要的X-CSRF-Token。
解决步骤
- 先发送GET请求到登录页面,获取页面中的CSRF Token和会话Cookie
- 将CSRF Token加入登录表单数据中,再发送POST请求完成登录
- 登录后确认会话状态,请求API时携带正确的Cookie和必要请求头
修正后的代码
import requests from bs4 import BeautifulSoup username = "my_username" password = "my_password" app_id = "my_app_id" login_url = "https://appstoreconnect.apple.com/login" report_url = f"https://analytics.itunes.apple.com/analytics/api/v1/data/app/{app_id}/metrics/downloads?measure=UNITS&group=DAY&start_date=2023-01-01&end_date=2023-04-27" session = requests.Session() # 1. 获取登录页面的CSRF Token和Cookie login_page = session.get(login_url) soup = BeautifulSoup(login_page.content, "html.parser") csrf_token = soup.find("meta", attrs={"name": "csrf-token"})["content"] # 2. 构造登录数据并完成登录 login_data = { "accountName": username, "password": password, "csrf": csrf_token } login_response = session.post(login_url, data=login_data, allow_redirects=True) # 验证登录状态(可选) if login_response.status_code != 200: print(f"登录失败,状态码:{login_response.status_code}") exit() # 3. 请求报表API,添加必要请求头 headers = { "X-Requested-With": "XMLHttpRequest", "X-CSRF-Token": session.cookies.get("X-CSRF-Token") } report_response = session.get(report_url, headers=headers) if report_response.status_code == 200: # API返回JSON格式数据,直接解析 report_data = report_response.json() print(report_data) else: print(f"请求报表失败,状态码:{report_response.status_code}") print("响应内容:", report_response.text)
额外提示
- 如果账号开启了双重认证,需要额外处理验证码逻辑,上述代码仅适用于未开启双认证的账号
- App Store Connect有反爬机制,若遇到403错误,可添加
User-Agent头模拟真实浏览器请求 - 长期使用建议优先考虑官方提供的App Store Connect API(基于JWT认证),比爬虫更稳定可靠
内容的提问来源于stack exchange,提问作者Havoud
相关产品推荐
相关产品推荐

