快手AI音乐推荐必须由服务端调用,PHP需用cURL或file_get_contents代理请求,传入结构化video_info(含duration、tags、cover_url等),并动态生成含app_secret的SHA256签名,access_token须缓存刷新。

快手AI音乐推荐接口需要服务端调用,PHP不能直接前端调用
快手开放平台的 music/recommend 接口是 HTTP POST 接口,必须带合法 access_token 和签名,且只允许服务端 IP 白名单调用。浏览器或 JS 直接发请求会因跨域、缺少签名、无 token 而失败——这不是 PHP 写法问题,是调用位置错了。
- 必须用 PHP 的
curl_init()或file_get_contents()(配合stream_context_create())从后端发起请求 - 前端只能传视频元数据(如时长、标签、封面 URL)给 PHP 接口,由 PHP 代理调用快手 API
- 快手要求回调地址(
callback_url)必须是 HTTPS 且已备案域名,本地localhost或127.0.0.1直接被拒
PHP 请求快手 /music/recommend 必须带完整鉴权参数
快手不接受仅靠 access_token 的简单请求,每次调用需动态生成 sign(SHA256 签名),并带上 timestamp、nonce、app_id。漏掉任意一项都会返回 {"code":4001,"msg":"invalid sign"}。
-
sign计算方式:对所有非空请求参数(含app_id、timestamp、nonce、video_info等)按字典序拼接成key1=value1&key2=value2字符串,末尾拼上app_secret,再做hash_hmac('sha256', $str, $app_secret) -
video_info是 JSON 字符串,不是数组;需json_encode($arr, JSON_UNESCAPED_UNICODE)后再参与签名和传输 - 注意:
access_token本身有时效(2 小时),需缓存并自动刷新,不能写死在代码里
视频内容特征必须结构化传入,不能只扔个 URL
快手 AI 音乐推荐依赖结构化特征,不是“下载视频→抽帧→分析”,而是你提前提供语义信息。如果只传 video_url,接口会返回 {"code":4003,"msg":"video_info format error"}。
- 必需字段:
duration(秒,整数)、tags(字符串数组,如["恋爱","轻快","夏日"])、cover_url(可访问的 HTTPS 封面图) - 推荐补充:
scene("tiktok" / "short_video")、language("zh" / "en")、mood("happy" / "sad" / "energetic") - 别传原始视频二进制或 base64——接口不接收,也不处理音视频文件解析
返回的音乐列表需过滤可用项,快手不保证全部可播
调用成功返回的 music_list 数组里,每首歌带 play_url、duration、copyright_status。但部分 play_url 可能返回 403 或已过期,尤其测试环境未开通版权的曲目。
- 务必检查
copyright_status === 1(1=可商用,0=不可用),否则上线后用户播放失败 - 用
get_headers($url, 1)或 HEAD 请求预检play_url是否返回 200,避免前端白屏 - 快手返回的
duration是音频时长,可能和视频不匹配,建议用 PHP 的ffmpeg库二次裁剪对齐
实际调用链路很薄,但每个环节都卡得具体:签名错一个字符、video_info 多个空格、cover_url 重定向一次,都会让整个推荐流程静默失败。最常被忽略的是 app_secret 拼在签名串末尾这一步——文档写得隐晦,但缺了它,永远 invalid sign。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











