SPlayer-Dev/ncm-api-rs

Netease Cloud Music API - Rust native implementation - 网易云音乐 API Rust 原生实现

57

stars

11

commits

Rust

primary language

Apr 7, 2026

updated

crates.io/crates/ncm-api-rs
api
async
axum
ncm
netease-cloud-music
neteasecloudmusicapi
rust
sdk
tokio

README

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

Contributors

imsyy

11 commits

SPlayer-Dev/ncm-api-rs

Netease Cloud Music API - Rust native implementation - 网易云音乐 API Rust 原生实现

57

stars

11

commits

Rust

primary language

Apr 7, 2026

updated

crates.io/crates/ncm-api-rs
api
async
axum
ncm
netease-cloud-music
neteasecloudmusicapi
rust
sdk
tokio

README

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

Contributors

imsyy

11 commits

Languages

Rust

100.0%