NCM API Rust SDK

April 7, 2026 · View on GitHub

NCM API Rust SDK

网易云音乐 API Rust 原生实现

Rust Crates.io GitHub Release License Tokio

NeteaseCloudMusicApi Enhanced 移植的 Rust 原生 SDK,无需 Node.js 运行时


项目简介

本项目是 NeteaseCloudMusicApi Enhanced 的 Rust 原生实现。通过跨站请求伪造 (CSRF) 和伪造请求头,调用网易云音乐官方 API,提供与 Node.js 版本 1:1 对应的接口。

所有 API 方法统一使用 Query 对象传参,与 Node.js 版本保持一致的调用风格,同时充分利用 Rust 的类型安全和零成本抽象特性。

特点

  • 纯 Rust 实现 - 无需 Node.js 运行时,独立编译部署
  • 完整加密支持 - 完整实现 weapi / eapi / linuxapi 三种加密方式
  • 极低内存占用 - ~5MB vs Node.js ~50-100MB
  • 异步非阻塞 - 基于 tokio + reqwest 的异步请求
  • 300+ 开箱即用的 API 接口 - 与 Node.js 版本 1:1 对应
  • 模块化设计 - 每个 API 独立文件,易于扩展和维护
  • 统一的参数模式 - 所有接口使用 Query 对象传参,用法简洁一致
  • 代理支持 - 支持 HTTP / SOCKS5 代理
  • IP 伪装 - 支持 realIP 和 randomCNIP 功能
  • HTTP 服务模式 - 内置 Axum HTTP 服务器,可直接替代 Node.js 版提供 REST API

快速开始

安装

作为 Rust 库依赖

[dependencies]
ncm-api-rs = "0.1"
tokio = { version = "1", features = ["full"] }

或从 Git 安装最新版:

[dependencies]
ncm-api-rs = { git = "https://github.com/SPlayer-Dev/ncm-api-rs.git" }
tokio = { version = "1", features = ["full"] }

安装 HTTP 服务器

通过 cargo 安装:

cargo install ncm-api-rs --features server

或从 GitHub Releases 下载预编译二进制文件,支持以下平台:

平台架构文件
Linuxx64ncm-server-vX.X.X-x86_64-unknown-linux-gnu.tar.gz
LinuxARM64ncm-server-vX.X.X-aarch64-unknown-linux-gnu.tar.gz
macOSx64ncm-server-vX.X.X-x86_64-apple-darwin.tar.gz
macOSApple Siliconncm-server-vX.X.X-aarch64-apple-darwin.tar.gz
Windowsx64ncm-server-vX.X.X-x86_64-pc-windows-msvc.zip

下载后解压即可运行:

# Linux / macOS
tar xzf ncm-server-*.tar.gz
./ncm-server

# Windows
# 解压 zip 后双击 ncm-server.exe 或在终端运行
ncm-server.exe

基础使用

use ncm_api_rs::{create_client, Query};

#[tokio::main]
async fn main() {
    // 创建客户端(不带 cookie)
    let client = create_client(None);

    // 搜索歌曲
    let query = Query::new()
        .param("keywords", "晴天 周杰伦")
        .param("type", "1")       // 1=歌曲
        .param("limit", "10");
    let result = client.cloudsearch(&query).await.unwrap();
    println!("{}", result.body);

    // 获取歌曲详情
    let query = Query::new().param("ids", "186016");
    let detail = client.song_detail(&query).await.unwrap();
    println!("{}", detail.body);

    // 获取歌词
    let query = Query::new().param("id", "186016");
    let lyric = client.lyric(&query).await.unwrap();
    println!("{}", lyric.body["lrc"]["lyric"]);

    // 获取播放链接
    let query = Query::new()
        .param("id", "186016")
        .param("level", "standard");
    let url = client.song_url_v1(&query).await.unwrap();
    println!("{}", url.body);
}
use ncm_api_rs::{create_client, Query};

#[tokio::main]
async fn main() {
    // 方式一:创建客户端时传入 cookie
    let client = create_client(Some("MUSIC_U=xxx; __csrf=xxx".to_string()));

    let query = Query::new();
    let songs = client.recommend_songs(&query).await.unwrap();

    // 方式二:在 Query 中传入 cookie(覆盖客户端 cookie)
    let query = Query::new().cookie("MUSIC_U=xxx; __csrf=xxx");
    let fm = client.personal_fm(&query).await.unwrap();
}

Query 参数说明

Query 是所有 API 的统一参数载体,支持链式调用:

let mut query = Query::new()
    // 业务参数 - 对应 Node.js 版本中 req.query 传入的参数
    .param("id", "186016")
    .param("limit", "30")
    .param("offset", "0")
    // 可选:覆盖 cookie
    .cookie("MUSIC_U=xxx");

// 可选:设置代理
query.proxy = Some("socks5://127.0.0.1:1080".to_string());
// 可选:设置真实 IP(伪装 X-Real-IP 请求头)
query.real_ip = Some("116.25.146.177".to_string());
// 可选:使用随机中国 IP
query.random_cn_ip = true;

// 读取参数
query.get("id");              // Some("186016")
query.get_or("limit", "30");  // "30"

调用前须知

本项目仅供学习使用,请尊重版权,请勿利用此项目从事商业行为或进行破坏版权行为

不要频繁调用登录接口,不然可能会被风控,登录状态还存在就不要重复调用登录接口

部分接口如登录接口不能调用太频繁,否则可能会触发 503 错误或者 IP 高频错误,若需频繁调用,需要准备 IP 代理池

由于网易限制,此项目在国外服务器或部分国内云服务上使用会受到限制,如 460 cheating异常,如需解决,可使用 real_ip 参数,传进国内 IP 解决

301 错误基本都是没登录就调用了需要登录的接口,如果登录了还是提示 301,基本都是 cookie 问题

登录接口返回的 ApiResponse 中包含 cookie 字段(Vec<String>),可以保存到本地后在后续请求中使用:

// 登录
let query = Query::new()
    .param("phone", "13xxx")
    .param("password", "xxx");
let result = client.login_cellphone(&query).await?;

// 保存 cookie
let cookies = result.cookie.join("; ");

// 后续请求使用 cookie
let query = Query::new().cookie(&cookies);
let account = client.user_account(&query).await?;

也可以直接从浏览器中获取 cookie 值,只需要其中 key 为 MUSIC_U 的数据即可:

let query = Query::new().cookie("MUSIC_U=xxxx");

realIP 参数

在国外服务器或 Vercel 等云服务上使用时,需要设置 real_ip 参数传入国内 IP:

let mut query = Query::new().param("id", "1969519579");
query.real_ip = Some("116.25.146.177".to_string());
let result = client.song_url_v1(&query).await?;

randomCNIP 参数

也可以使用随机中国 IP 功能,无需手动指定 IP:

let mut query = Query::new().param("id", "1969519579");
query.random_cn_ip = true;
let result = client.song_url_v1(&query).await?;

代理支持

在 Query 参数中设置 proxy 即可让该次请求使用代理:

let mut query = Query::new().param("id", "33894312");
query.proxy = Some("http://121.196.226.246:84".to_string());
// 也支持 socks5 代理
// query.proxy = Some("socks5://127.0.0.1:1080".to_string());
let result = client.song_url(&query).await?;

HTTP 服务模式

除了作为 Rust 库直接调用,本项目还支持以 HTTP 服务器模式运行,提供与 Node.js 版本完全兼容的 REST API 接口,前端可以无缝切换。

启动服务器

# 编译并运行(默认监听 0.0.0.0:3000)
cargo run --features server --bin ncm-server

# 或先编译再运行
cargo build --release --features server --bin ncm-server
./target/release/ncm-server

环境变量配置

变量名说明默认值
NCM_HOST监听地址0.0.0.0
NCM_PORT监听端口3000
CORS_ALLOW_ORIGINCORS 允许的 Origin,支持逗号分隔多个源*(允许所有)
# 示例:自定义端口和 CORS
NCM_HOST=127.0.0.1 NCM_PORT=8080 CORS_ALLOW_ORIGIN=http://localhost:5173 cargo run --features server --bin ncm-server

# 示例:允许多个源
CORS_ALLOW_ORIGIN=https://a.com,https://b.com cargo run --features server --bin ncm-server

前端调用示例

接口路径与 Node.js 版完全一致,方法名中的下划线 _ 转换为斜杠 /

// 搜索歌曲
const res = await axios.get('/cloudsearch', { params: { keywords: '海阔天空' } })

// 获取歌曲详情
const res = await axios.get('/song/detail', { params: { ids: '347230' } })

// POST 方式调用
const res = await axios.post('/login/cellphone', {
  phone: '138xxxx8000',
  password: 'xxx',
})

// 带 Cookie 调用需要登录的接口
const res = await axios.get('/user/playlist', {
  params: { uid: '32953014', cookie: 'MUSIC_U=xxx' },
})

路由映射规则

方法名HTTP 路由说明
song_detail/song/detail下划线转斜杠(默认规则)
login_cellphone/login/cellphone同上
daily_signin/daily_signin特殊路由,保留下划线
fm_trash/fm_trash特殊路由,保留下划线
personal_fm/personal_fm特殊路由,保留下划线
avatar_upload/avatar/uploadPOST multipart/form-data
voice_upload/voice/uploadPOST multipart/form-data

所有路由均支持 GET 和 POST 两种请求方式(上传接口仅 POST)。

作为库集成到你的项目

如果你已有 Axum 项目,可以直接集成路由:

use ncm_api_rs::{create_client, server::{build_app, build_app_with_config, ServerConfig}};

// 方式一:快速构建
let app = build_app(create_client(None));

// 方式二:自定义配置
let config = ServerConfig {
    host: "127.0.0.1".to_string(),
    port: 8080,
    cors_origin: Some("http://localhost:5173".to_string()),
};
let app = build_app_with_config(create_client(None), &config);

// 启动
let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await?;
axum::serve(listener, app).await?;

自动路由注册

新增 API 时无需手动注册路由。build.rs 会在编译期自动扫描 src/api/mod.rs 中的模块声明,生成对应的路由注册代码。只需:

  1. 创建 src/api/xxx_yyy.rs 文件,实现 ApiClient 方法
  2. src/api/mod.rs 中添加 mod xxx_yyy;

路由 /xxx/yyy 会自动注册,无需其他操作。


API 文档

完整接口文档请查看 docs/API.md,涵盖全部接口的详细参数说明和调用示例。

接口速查表

登录相关
方法名说明
login邮箱登录
login_cellphone手机号登录
login_qr_key二维码 key 生成
login_qr_create二维码生成
login_qr_check二维码扫码状态
login_refresh刷新登录
login_status登录状态
logout退出登录
register_anonimous游客登录
register_cellphone注册/修改密码
captcha_sent发送验证码
captcha_verify验证验证码
cellphone_existence_check检测手机号是否注册
activate_init_profile初始化昵称
nickname_check重复昵称检测
rebind更换绑定手机
用户相关
方法名说明
user_detail用户详情
user_detail_new用户详情(新)
user_account账号信息
user_subcount收藏计数
user_level用户等级
user_binding绑定信息
user_bindingcellphone绑定手机
user_replacephone更换手机
user_update更新用户信息
user_playlist用户歌单
user_playlist_create创建歌单列表
user_playlist_collect收藏歌单列表
user_follows关注列表
user_followeds粉丝列表
user_follow_mixed关注的用户/歌手
user_mutualfollow_get是否互相关注
user_event用户动态
user_record播放记录
user_dj用户电台
user_audio用户音频
user_comment_history历史评论
user_medal用户徽章
user_social_status用户状态
user_social_status_edit编辑状态
user_social_status_rcmd相同状态用户
user_social_status_support支持的状态
follow关注/取消关注
pl_count私信和通知数量
countries_code_list国家编码列表
setting用户设置
get_userids获取用户 ID
avatar_upload上传头像
歌曲相关
方法名说明
song_detail歌曲详情
song_url歌曲播放链接
song_url_v1歌曲播放链接(新)
song_url_v1_302302 重定向到歌曲 URL
song_url_ncmgetNCM 获取歌曲 URL
song_url_match歌曲解锁匹配
song_download_url歌曲下载链接
song_download_url_v1歌曲下载链接(新)
check_music音乐是否可用
lyric歌词
lyric_new逐字歌词
like喜欢音乐
song_like喜欢歌曲(新版)
likelist喜欢的音乐列表
song_like_check歌曲是否喜爱
scrobble听歌打卡
song_order_update调整歌曲顺序
song_chorus副歌时间
song_wiki_summary歌曲百科
song_music_detail歌曲音质详情
song_red_count红心数量
song_dynamic_cover动态封面
song_downlist会员下载记录
song_monthdownlist本月下载记录
song_singledownlist已购买单曲
song_purchased已购买歌曲
song_lyrics_mark歌词摘录信息
song_lyrics_mark_add添加歌词摘录
song_lyrics_mark_del删除歌词摘录
song_lyrics_mark_user_page我的歌词本
audio_match听歌识曲
搜索相关
方法名说明
search搜索
cloudsearch搜索(更全)
search_default默认搜索关键词
search_hot热搜列表(简略)
search_hot_detail热搜列表(详细)
search_suggest搜索建议
search_suggest_pc搜索建议(PC端)
search_multimatch搜索多重匹配
search_match搜索匹配
歌单相关
方法名说明
playlist_create新建歌单
playlist_delete删除歌单
playlist_subscribe收藏/取消收藏歌单
playlist_subscribers歌单收藏者
playlist_detail歌单详情
playlist_detail_dynamic歌单详情动态
playlist_detail_rcmd_get相关歌单推荐
playlist_track_all歌单所有歌曲
playlist_tracks添加/删除歌曲
playlist_track_add收藏视频到歌单
playlist_track_delete删除歌单视频
playlist_update更新歌单
playlist_desc_update更新歌单描述
playlist_name_update更新歌单名
playlist_tags_update更新歌单标签
playlist_cover_update歌单封面上传
playlist_order_update调整歌单顺序
playlist_update_playcount更新播放量
playlist_catlist歌单分类
playlist_hot热门歌单分类
playlist_category_list歌单分类列表
playlist_highquality_tags精品歌单标签
playlist_privacy歌单隐私设置
playlist_mylike我喜欢的歌单
playlist_video_recent最近播放视频
playlist_import_name_task_create歌单导入
playlist_import_task_status导入任务状态
related_playlist相关歌单
评论相关
方法名说明
comment_music歌曲评论
comment_album专辑评论
comment_playlist歌单评论
comment_mvMV 评论
comment_dj电台节目评论
comment_video视频评论
comment_event动态评论
comment_floor楼层评论
comment_hot热门评论
comment_like点赞评论
comment_new新版评论
comment_reply回复评论
comment_delete删除评论
comment_hug_list抱一抱列表
comment_info_list评论统计
hug_comment抱一抱评论
starpick_comments_summary精选评论摘要
歌手相关
方法名说明
artists歌手信息
artist_detail歌手详情
artist_detail_dynamic歌手详情动态
artist_songs歌手全部歌曲
artist_album歌手专辑
artist_desc歌手描述
artist_mv歌手 MV
artist_list歌手分类列表
artist_sub收藏/取消收藏歌手
artist_sublist收藏的歌手列表
artist_top_song歌手热门歌曲
artist_fans歌手粉丝
artist_follow_count歌手关注数
artist_new_mv关注歌手新 MV
artist_new_song关注歌手新歌
artist_video歌手视频
专辑相关
方法名说明
album专辑内容
album_detail专辑详情
album_detail_dynamic专辑动态信息
album_sub收藏/取消收藏专辑
album_sublist已收藏专辑列表
album_newest最新专辑
album_new新碟上架
album_list数字专辑列表
album_list_style专辑风格列表
album_privilege专辑歌曲音质
album_songsaleboard专辑销量榜
MV 相关
方法名说明
mv_all全部 MV
mv_first最新 MV
mv_exclusive_rcmd网易出品 MV
mv_detailMV 数据
mv_detail_infoMV 点赞转发评论数
mv_urlMV 地址
mv_sub收藏/取消收藏 MV
mv_sublist收藏的 MV 列表
personalized_mv推荐 MV
top_mvMV 排行
视频相关
方法名说明
video_group_list视频标签列表
video_category_list视频分类列表
video_group标签下的视频
video_timeline_all全部视频列表
video_timeline_recommend推荐视频
video_detail视频详情
video_detail_info视频点赞转发评论数
video_url视频播放地址
video_sub收藏视频
related_allvideo相关视频
mlog_urlMlog 地址
mlog_to_videoMlog 转视频
mlog_music_rcmdMlog 音乐推荐
电台相关
方法名说明
dj_banner电台 banner
dj_personalize_recommend电台个性推荐
dj_subscriber电台订阅者列表
dj_catelist电台分类列表
dj_category_excludehot非热门电台分类
dj_category_recommend电台分类推荐
dj_detail电台详情
dj_hot热门电台
dj_radio_hot电台 - 类别热门
dj_program电台节目列表
dj_program_detail电台节目详情
dj_program_toplist节目排行榜
dj_program_toplist_hours节目24小时榜
dj_recommend电台推荐
dj_recommend_type电台推荐类型
dj_sub订阅/取消订阅电台
dj_sublist订阅的电台列表
dj_toplist电台排行榜
dj_toplist_hours电台24小时榜
dj_toplist_newcomer电台新人榜
dj_toplist_pay付费电台榜
dj_toplist_popular电台热门榜
dj_difm_all_style_channelDIFM电台 - 分类
dj_difm_channel_subscribeDIFM电台 - 收藏频道
dj_difm_channel_unsubscribeDIFM电台 - 取消收藏频道
dj_difm_playing_tracks_listDIFM电台 - 播放列表
dj_difm_subscribe_channels_getDIFM电台 - 收藏列表
dj_paygift付费精品
dj_today_perfered今日优选
dj_radio_top电台排行
推荐相关
方法名说明
personalized推荐歌单
personalized_newsong推荐新音乐
personalized_djprogram推荐电台
personalized_privatecontent独家放送(入口)
personalized_privatecontent_list独家放送列表
recommend_songs每日推荐歌曲
recommend_resource每日推荐歌单
recommend_songs_dislike不喜欢推荐
history_recommend_songs历史日推
history_recommend_songs_detail历史日推详情
program_recommend推荐节目
homepage_block_page首页-发现
homepage_dragon_ball首页圆形图标入口
banner首页 Banner
daily_signin每日签到
personal_fm私人 FM
personal_fm_mode私人 FM 模式
fm_trash垃圾桶
playmode_intelligence_list心动模式/智能播放
playmode_song_vector随机播放模式
simi_song相似歌曲
simi_artist相似歌手
simi_playlist相似歌单
simi_mv相似 MV
simi_user相似用户
排行榜相关
方法名说明
toplist所有榜单
toplist_detail所有榜单摘要
toplist_detail_v2所有榜单摘要 v2
toplist_artist歌手榜
top_song新歌速递
top_album新碟上架
top_artists热门歌手
top_mvMV 排行
top_playlist歌单(网友精选碟)
top_playlist_highquality精品歌单
top_list排行榜详情
云盘相关
方法名说明
user_cloud云盘数据
user_cloud_detail云盘数据详情
user_cloud_del云盘歌曲删除
cloud云盘上传
cloud_import云盘导入
cloud_match云盘歌曲匹配纠正
cloud_lyric_get云盘歌词
cloud_upload_token上传凭证
cloud_upload_complete完成上传
私信/动态相关
方法名说明
msg_private私信列表
msg_private_history私信历史
msg_comments评论通知
msg_forwards转发通知
msg_notices通知消息
msg_recentcontact最近联系人
send_text发送文本私信
send_song发送歌曲私信
send_playlist发送歌单私信
send_album发送专辑私信
share_resource分享到动态
resource_like资源点赞
event动态列表
event_del删除动态
event_forward转发动态
VIP/会员
方法名说明
vip_infoVIP 信息
vip_info_v2VIP 信息 v2
vip_sign黑胶乐签打卡
vip_sign_info打卡信息
vip_tasksVIP 任务列表
vip_timemachine时光机
vip_growthpoint成长值基本信息
vip_growthpoint_details成长值明细
vip_growthpoint_get领取成长值奖励
云贝
方法名说明
yunbei云贝签到信息
yunbei_info云贝信息
yunbei_sign云贝签到
yunbei_today今日云贝
yunbei_expense云贝支出
yunbei_receipt云贝收入
yunbei_tasks云贝任务
yunbei_tasks_todo待完成任务
yunbei_task_finish完成任务
yunbei_rcmd_song云贝推歌
yunbei_rcmd_song_history推歌历史
听歌足迹
方法名说明
listen_data_year_report年度听歌足迹
listen_data_today_song今日收听
listen_data_total总收听时长
listen_data_realtime_report本周/本月时长
listen_data_report收听报告
recent_listen_list最近听歌列表
record_recent_song最近播放歌曲
record_recent_album最近播放专辑
record_recent_playlist最近播放歌单
record_recent_dj最近播放电台
record_recent_video最近播放视频
record_recent_voice最近播放声音
风格/曲风
方法名说明
style_list曲风列表
style_detail曲风详情
style_song曲风歌曲
style_album曲风专辑
style_artist曲风歌手
style_playlist曲风歌单
style_preference曲风偏好
数字专辑
方法名说明
digital_album_detail数字专辑详情
digital_album_ordering购买数字专辑
digital_album_purchased已购数字专辑
digital_album_sales数字专辑销量
声音/播客
方法名说明
voice_upload上传音频
voice_delete删除音频
voice_detail音频详情
voice_lyric音频歌词
voicelist_list声音列表
voicelist_detail声音列表详情
voicelist_my_created我创建的播客声音
voicelist_search搜索声音列表
voicelist_list_search搜索声音
voicelist_trans声音转换
音乐人
方法名说明
musician_sign音乐人签到
musician_tasks音乐人任务
musician_tasks_new音乐人新任务
musician_vip_tasksVIP 任务
musician_data_overview数据概览
musician_play_trend播放趋势
musician_cloudbean云豆数量
musician_cloudbean_obtain领取云豆
粉丝中心
方法名说明
fanscenter_overview_get粉丝中心概览
fanscenter_trend_list粉丝趋势
fanscenter_basicinfo_age_get年龄分布
fanscenter_basicinfo_gender_get性别分布
fanscenter_basicinfo_province_get省份分布
UGC 百科
方法名说明
ugc_song_get歌曲百科
ugc_artist_get歌手百科
ugc_album_get专辑百科
ugc_mv_getMV 百科
ugc_detail百科详情
ugc_artist_search搜索歌手百科
ugc_user_devote用户贡献
一起听
方法名说明
listentogether_room_create创建房间
listentogether_room_check检查房间
listentogether_accept接受邀请
listentogether_status房间状态
listentogether_heatbeat心跳
listentogether_play_command播放指令
listentogether_sync_list_command同步列表指令
listentogether_sync_playlist_get获取同步歌单
listentogether_end结束房间
广播电台
方法名说明
broadcast_category_region_get分类/地区信息
broadcast_channel_list全部电台
broadcast_channel_currentinfo电台信息
broadcast_channel_collect_list我的收藏
broadcast_sub收藏/取消电台
其他
方法名说明
hot_topic热门话题
topic_detail话题详情
topic_detail_event_hot话题热门动态
topic_sublist收藏的专栏
calendar音乐日历
batch批量请求
api通用 API 代理
inner_version内部版本号
weblog日志上报
eapi_decryptEAPI 解密
sign_happy_info乐签信息
signin_progress签到进度
summary_annual年度总结
threshold_detail_get达人认证门槛
creator_authinfo_get创作者认证信息
sheet_list乐谱列表
sheet_preview乐谱预览
aidj_content_rcmdAI DJ 推荐
music_first_listen_info回忆坐标
verify_get_qr验证二维码
verify_qrcodestatus二维码状态

扩展接口

src/api/ 中添加新文件即可,模式非常简单:

// src/api/your_new_api.rs
use crate::request::{ApiClient, ApiResponse, CryptoType};
use crate::error::Result;
use serde_json::json;
use super::Query;

impl ApiClient {
    pub async fn your_new_api(&self, query: &Query) -> Result<ApiResponse> {
        let data = json!({
            "id": query.get_or("id", ""),
        });
        self.request("/api/your/endpoint", data, query.to_option(CryptoType::Weapi)).await
    }
}

然后在 src/api/mod.rs 中注册:

mod your_new_api;

对应的 Node.js 接口参考 NeteaseCloudMusicApi Enhancedmodule/ 目录。

致谢

License

WTFPL - Do What The Fuck You Want To Public License