curl请求解析
curl 'https://www.kuaishou.com/graphql' \-H 'Accept-Language: en,zh-CN;q=0.9,zh;q=0.8' \-H 'Cache-Control: no-cache' \-H 'Connection: keep-alive' \-H 'Cookie: weblogger_did=web_140476153E50FC40; kpf=PC_WEB; clientid=3; did=web_6c1bfef1bff5f0e063c16c6381ffc8d0; userId=1926344872; kuaishou.server.webday7_st=ChprdWFpc2hvdS5zZXJ2ZXIud2ViZGF5xxxxAU-QhpLs58EqWw14KtRN3ktXeVV4IUBH-whoUB9UX3l00ZEd9B3n92xxx03QtoxlPf1OuMPcCZg_WwoR6sy5p6VyZobi7CqqXtr-8XLF7slXPq8_PhjMjB5BRkekJPuKCZCSYTPMFYUWTr1AJEzk2Zt-eTtZox9VWK6XPjUUhVxxxxxpwjTvo01wN_qChrZHEG-4f5yJd10AXaDXiGhJglXWxx8RvW8kJJMTzKPTd1I8iIGnzLs4NhZxxxxAmlC8W8L-ZzYA0UByzvqOerFQahKAUwAQ; kuaishou.server.webday7_ph=1b4a3594exxxxxd82c6013531408cb; kpn=KUAISHOU_VISION' \-H 'Origin: https://www.kuaishou.com' \-H 'Pragma: no-cache' \-H 'Referer: https://www.kuaishou.com/search/video?searchKey=22' \-H 'Sec-Fetch-Dest: empty' \-H 'Sec-Fetch-Mode: cors' \-H 'Sec-Fetch-Site: same-origin' \-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' \-H 'accept: */*' \-H 'content-type: application/json' \-H 'sec-ch-ua: "Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"' \-H 'sec-ch-ua-mobile: ?0' \-H 'sec-ch-ua-platform: "Windows"' \--data-raw '{"operationName":"visionSearchPhoto","variables":{"keyword":"22","pcursor":"","page":"search"},"query":"fragment photoContent on PhotoEntity {\n __typename\n id\n duration\n caption\n originCaption\n likeCount\n viewCount\n commentCount\n realLikeCount\n coverUrl\n photoUrl\n photoH265Url\n manifest\n manifestH265\n videoResource\n coverUrls {\n url\n __typename\n }\n timestamp\n expTag\n animatedCoverUrl\n distance\n videoRatio\n liked\n stereoType\n profileUserTopPhoto\n musicBlocked\n riskTagContent\n riskTagUrl\n}\n\nfragment recoPhotoFragment on recoPhotoEntity {\n __typename\n id\n duration\n caption\n originCaption\n likeCount\n viewCount\n commentCount\n realLikeCount\n coverUrl\n photoUrl\n photoH265Url\n manifest\n manifestH265\n videoResource\n coverUrls {\n url\n __typename\n }\n timestamp\n expTag\n animatedCoverUrl\n distance\n videoRatio\n liked\n stereoType\n profileUserTopPhoto\n musicBlocked\n riskTagContent\n riskTagUrl\n}\n\nfragment feedContent on Feed {\n type\n author {\n id\n name\n headerUrl\n following\n headerUrls {\n url\n __typename\n }\n __typename\n }\n photo {\n ...photoContent\n ...recoPhotoFragment\n __typename\n }\n canAddComment\n llsid\n status\n currentPcursor\n tags {\n type\n name\n __typename\n }\n __typename\n}\n\nquery visionSearchPhoto($keyword: String, $pcursor: String, $searchSessionId: String, $page: String, $webPageArea: String) {\n visionSearchPhoto(keyword: $keyword, pcursor: $pcursor, searchSessionId: $searchSessionId, page: $page, webPageArea: $webPageArea) {\n result\n llsid\n webPageArea\n feeds {\n ...feedContent\n __typename\n }\n searchSessionId\n pcursor\n aladdinBanner {\n imgUrl\n link\n __typename\n }\n __typename\n }\n}\n"}'
以下是 curl
命令中每个参数及其对应请求头/数据的详细用途说明:
1. 基础请求参数
curl 'https://www.kuaishou.com/graphql'
curl
:命令行工具,用于发起网络请求。- URL:目标接口地址(GraphQL 端点)。
2. 请求头参数(-H
或 --header
)
通用请求头
参数 | 用途 |
---|
-H 'Accept-Language: en,zh-CN;q=0.9,zh;q=0.8' | 告知服务器客户端支持的语言及优先级(q 为权重,值越高优先级越高)。此处表示优先中文(简体),其次英文。 |
-H 'Cache-Control: no-cache' | 禁用缓存,要求服务器返回最新资源(等价于 Pragma: no-cache ,但更符合 HTTP/1.1 规范)。 |
-H 'Connection: keep-alive' | 要求服务器保持 TCP 连接,以便后续请求复用(减少连接建立开销)。 |
-H 'Cookie: ...' | 携带客户端存储的 Cookie,用于身份验证、会话保持(如用户登录状态、设备标识)。此处包含用户 ID、设备信息、会话令牌等。 |
-H 'Origin: https://www.kuaishou.com' | 声明请求来源域名(跨域请求时必填),用于服务器验证是否允许跨域访问(CORS)。 |
-H 'Pragma: no-cache' | 兼容 HTTP/1.0 的禁用缓存指令(与 Cache-Control 功能重复,现代浏览器优先使用 Cache-Control )。 |
-H 'Referer: https://www.kuaishou.com/search/video?searchKey=22' | 告知服务器请求的来源页面(即从哪个页面跳转而来),用于统计分析或防盗链。 |
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' | 标识客户端身份(浏览器类型、版本、操作系统等),服务器可据此返回适配内容(如桌面版/移动版页面)。 |
浏览器特有的跨域请求头(Sec-Fetch 系列)
参数 | 用途 |
---|
-H 'Sec-Fetch-Dest: empty' | 指示请求的目标用途(empty 表示无需接收响应体,仅获取状态码等元数据,但实际请求体存在,可能为浏览器默认值)。 |
-H 'Sec-Fetch-Mode: cors' | 声明请求模式为跨域(CORS),允许与不同源的服务器通信(需服务器配置 Access-Control-Allow-Origin )。 |
-H 'Sec-Fetch-Site: same-origin' | 声明请求来源与目标是否同源(same-origin 表示同源,此处实际为跨域,可能为浏览器兼容逻辑)。 |
客户端 UA 扩展信息(sec-ch-ua 系列)
参数 | 用途 |
---|
-H 'sec-ch-ua: "Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"' | 提供浏览器指纹信息(品牌、版本),用于客户端特性检测(如 UA Client Hints 标准)。 |
-H 'sec-ch-ua-mobile: ?0' | 声明是否为移动设备(?0 表示非移动设备,?1 表示移动设备)。 |
-H 'sec-ch-ua-platform: "Windows"' | 声明操作系统平台(此处为 Windows)。 |
其他关键头
参数 | 用途 |
---|
-H 'accept: */*' | 允许接收任意类型的响应内容(实际服务器会返回 application/json ,因请求体为 JSON)。 |
-H 'content-type: application/json' | 声明请求体格式为 JSON,服务器需按此解析(如解析 GraphQL 查询参数)。 |
3. 请求体参数(--data-raw
或 -d
)
--data-raw '{"operationName":"visionSearchPhoto","variables":{"keyword":"22","pcursor":"","page":"search"},"query":"..."}'
- 用途:发送 POST 请求的正文数据(原始字符串,不进行 URL 编码)。
- 内容:
operationName
:GraphQL 操作名称(visionSearchPhoto
表示搜索视频)。variables
:查询变量(keyword
为搜索关键词 22
,pcursor
为空表示获取第一页,page
为页面类型 search
)。query
:GraphQL 查询语句,包含多个 fragment
(字段片段),用于指定需要返回的具体数据字段(如视频 ID、播放量、封面链接等)。
4. 隐含的请求参数
- 请求方法:通过
--data-raw
自动推断为 POST(若使用 -GET
则为 GET 请求)。 - 编码方式:
content-type: application/json
表明请求体需按 JSON 解析,而非表单编码(如 application/x-www-form-urlencoded
)。
总结:整个 curl 命令的作用
该命令模拟浏览器向快手的 GraphQL 接口发起 跨域 POST 请求,携带:
- 身份信息(Cookie、User-Agent)以验证用户状态;
- 跨域相关头(Origin、Sec-Fetch-*)以通过服务器 CORS 校验;
- 搜索参数(关键词
22
、查询字段)以获取视频搜索结果。
最终目的是获取符合条件的视频数据(如 ID、播放量、作者信息等),用于页面渲染或数据采集。