把小红书分享链接解析成无水印的图片集或视频地址,核心只有一件事:拿到页面里内嵌的那段 JSON。以下按 PHP 示例梳理过程。
第一步:提取笔记 id
入口有两种:从 www.xiaohongshu.com 直接复制的链接里提 id;xhslink.com 短链则要先解析 header 或跟随重定向拿到真实地址再提。拿到 id 后拼出笔记页地址:https://www.xiaohongshu.com/discovery/item/{小红书id},后面提取 JSON 时这个 id 还要再用一次。
第二步:请求页面并截出 JSON
请求头里要带 cookie 和 Accept,两个值都从小红书登录后的网页版里复制。响应正文里 window.INITIAL_STATE= 后面跟着的就是要的 JSON,用正则把它截出来再反序列化:
preg_match('/window.__INITIAL_STATE__.+redmojiMap":{}}}}/',$html,$arr);
$arr = str_replace('window.__INITIAL_STATE__=' , "", $arr[0]);
$json = json_decode(str_replace('undefined' ,'null', $arr),true);
正则表达式为 /window.__INITIAL_STATE__.+redmojiMap":{}}}/。
第三步:图集地址
图片列表在 JSON 的 $json['note']['noteDetailMap'][$id]['note']['imageList'] 路径下,默认解析到的就是无水印地址,for 循环收进数组即可。
#示例代码
$images_num=count($json['note']['noteDetailMap'][$id]['note']['imageList']);
for($i = 0; $i < $images_num; $i++){
$ch[$i] = $json['note']['noteDetailMap'][$id]['note']['imageList'][$i]['infoList'][1]['url'];
}
关键点:请求头的 Accept 必须包含 image/webp; 参数,缺了它拿到的图就带水印,建议直接照抄网页端的 Accept。
第四步:视频地址
视频不需要下载再处理,用 originVideoKey 直接拼原始地址。该字段位于 $json['note']['noteDetailMap'][$id]['note']['video']['consumer']['originVideoKey'],拼接规则:'https://sns-video-bd.xhscdn.com/' . {originVideoKey}。返回结构示例:
#示例代码
$arr = array(
'code' => 200,
'msg' => '解析成功',
'data' => [
'author' => $json['note']['noteDetailMap'][$id]['note']['user']['nickname'],
'uid' => $json['note']['noteDetailMap'][$id]['note']['user']['userId'],
'avatar'=>$json['note']['noteDetailMap'][$id]['note']['user']['avatar'],
'cover' => $ch[0],
'like' => $json['note']['noteDetailMap'][$id]['note']['interactInfo']['likedCount'],
'title' => $json['note']['noteDetailMap'][$id]['note']['desc'],
'url' => 'https://sns-video-bd.xhscdn.com/' . $json['note']['noteDetailMap'][$id]['note']['video']['consumer']['originVideoKey'],
]
);
注意事项
cookie 有时效,过期后请求会失败,需要定期更换;这套解析依赖页面结构,上游一改 window.INITIAL_STATE 的组织方式,正则和 JSON 路径都要跟着修,别当成稳定接口用。















暂无评论内容