当前位置: 首页 > news >正文

用 Python 下载微博嵌入的快手视频——yt-dlp 搞不定的情况

最近想下载一个微博帖子里的视频,发现用 yt-dlp 死活报错:

ERROR: [Weibo] 5253736540668500: No video formats found!

折腾了一圈才发现,这个帖子里的视频根本不是微博原生视频,而是快手视频嵌入的。yt-dlp 没有快手提取器,所以永远找不到格式。

问题根源

微博 API 返回的帖子数据里,page_info.media_info.stream_url 是一个快手合作伙伴 API 的 URL,长这样:

http://www.kuaishou.com/rest/kd/partner/weibo/linkcard/video?p=3x98xzrsbsvyxi6&a=3xyctistmincv29&f=0&kpn=KUAISHOU&...

这个 URL 会重定向到真实的 MP4 CDN 地址。yt-dlp 的微博提取器不处理这种情况,所以报错。

解决方案

用 Python 标准库,两步搞定:

第一步:调用微博 API 获取 stream_url

import http.cookiejar, urllib.request, jsoncj = http.cookiejar.MozillaCookieJar()
cj.load('cookies.txt', ignore_discard=True, ignore_expires=True)opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'),('Referer', 'https://weibo.com/'),('X-Requested-With', 'XMLHttpRequest'),
]resp = opener.open('https://weibo.com/ajax/statuses/show?id={post_id}')
data = json.loads(resp.read())
stream_url = data['page_info']['media_info']['stream_url']

第二步:跟踪重定向,拿到直链 MP4

req = urllib.request.Request(stream_url, headers={'User-Agent': 'Mozilla/5.0 ...','Referer': 'https://weibo.com/'
})
resp = urllib.request.urlopen(req)
direct_url = resp.url  # 这就是真实的 MP4 地址

第三步:下载

urllib.request.urlretrieve(direct_url, 'output.mp4')

直接用快手分享链接

如果你有快手的分享链接(URL 里包含 photoIduserIdshareTokenshareObjectId),可以直接构造合作伙伴 API,不需要微博 cookies:

api_url = (f"http://www.kuaishou.com/rest/kd/partner/weibo/linkcard/video"f"?p={photo_id}&a={user_id}&f=0&kpn=KUAISHOU"f"&subBiz=BROWSE_SLIDE_PHOTO&shareChannel=weibo&shareMethod=card"f"&shareObjectId={share_object_id}&shareResourceType=PHOTO_SELF"f"&shareToken={share_token}"
)
resp = urllib.request.urlopen(api_url)
direct_url = resp.url

注意事项

  • 下载的视频带有快手水印(CDN URL 里有 newWatermark
  • 微博 cookies 需要用 Chrome 扩展 "Get cookies.txt LOCALLY" 导出
  • 快手分享链接有时效性,过期后需要重新获取
  • 此方法仅适用于微博帖子中嵌入的快手视频,原生微博视频仍可用 yt-dlp 下载