网易云Cookie获取全攻略:从浏览器抓取到Python模拟登录

📅 发布时间:2026/9/19 16:02:50
网易云Cookie获取全攻略:从浏览器抓取到Python模拟登录
1. 先别急着复制粘贴你到底要哪种网易云 Cookie先说一个我在各个技术群里最常见的场景有人在群文件里丢了个 MusicFree 的安装包然后紧接着问一句MusicFree 接入网易云时让填 Cookie这个 Cookie 怎么获取说白了大家找的是同一个东西——把个人网易云账号的登录凭证提取出来交给第三方工具去调用接口。这个需求背后通常有三种情况。第一种是用 MusicFree 这类开源播放器想把自己喜欢的歌单和每日推荐那一套拉进一个聚合播放器里第二种是写脚本比如签到、导出歌词、同步歌单到其他平台第三种是做自建服务比如把自己的网易云收藏接入家庭音乐服务器。不管哪种本质上都是同一件事让一个不是网易云官方出品的程序替你向服务器证明我就是这个账号的本人。这里我建议你先停下来想清楚一个问题你要的是完整 Cookie还是只要那个能代表登录身份的字段。很多教程会让你复制整串 Cookie这确实是最省事、也最不容易出错的方式但整串 Cookie 里有大量专用字段有的字段和登录完全无关有的字段有效期极短复制一长串反而容易在粘贴时漏掉某个分号。我自己实践下来在绝大多数第三方工具里真正被用到的核心字段就那么三四个明白了这一点后面就算 Cookie 失效了你也知道该怎么排查。另外还有一层很多人忽略的风险Cookie 是账号的临时身份证它的敏感程度不亚于账号密码。你把它贴进任何第三方网站、发给任何人几乎等同于把自己账号的钥匙交了出去。我见过有人为了图方便把 Cookie 直接明文写在 GitHub 仓库里然后第二天收到异地登录提醒。所以这篇内容的后半部分我会专门讲一下安全红线这部分比怎么抓更重要。2. Cookie 为什么能自动登录网易云登录态是怎么工作的2.1 Cookie 的本质就是一张临时通行证用生活里的话讲Cookie 就是服务员给你手背盖的那个荧光章。你第一次输入账号密码相当于在前台登记了身份服务员确认完之后往你手背上盖了个章之后你再去自助餐台取餐不用反复掏出身份证只需要把手伸出来让服务员照一下就行。这个章由服务器签发保存在浏览器本地每次请求接口时浏览器会自动把它带上。网易云的服务器看到这个章就知道这个请求来自之前登录过的用户于是就不再要求重新输入密码。在浏览器里章的实体就是一段字符串长得像下面这样MUSIC_Uxxxxxxxxxxxxxxxx; __csrfyyyyyyyy; NMTIDzzzzzzzz关键是这段字符串最终是以键值的形式一条条存下来的中间用分号和空格隔开。不同字段对应不同用途有的管身份有的管校验有的只是埋点参数。2.2 网易云 Cookie 里的关键字段谁管身份、谁管校验我平时抓包时看得比较多的字段有下面几个字段名作用是否登录关键MUSIC_U用户登录凭证登录成功后由服务器下发是最核心__csrf跨站请求伪造校验令牌写操作接口要带部分工具需要MUSIC_A匿名用户临时标识否但常同时出现NMTID设备/游客追踪标识否os/osver客户端操作系统信息否deviceId设备标识某些场景需要MUSIC_U是所有字段里的大哥。你登录之后服务器下发的一串加密字符串就存在这里它就是登录身份本身。__csrf是防止跨站请求伪造用的简单说如果你往第三方工具里填 Cookie这个工具要在网易云接口里发评论、建歌单这类写操作往往需要带着__csrf一起提交否则接口会拦你。至于MUSIC_A很多第一次抓 Cookie 的人会被它误导以为这也是身份凭证。实际上它更像游客时代的匿名会员卡和登录身份关系不大。这也是为什么我后面会强调你要学会在开发者工具里定位真正的登录请求而不是随便从某个接口上把 Cookie 整串复制下来。2.3 为什么从浏览器里手动复制一长串 Cookie 经常失败我见过太多人问明明我按教程把一整串 Cookie 粘进去了为什么工具还是提示登录失效原因通常出在三个方面。第一你复制的端口不对。浏览器里有无数个请求每个请求上都带着 Cookie但不同请求的 Cookie 集合可能不完全相同。如果你复制的是某个图片资源或埋点请求的 Cookie可能恰好缺了MUSIC_U这种关键值自然无效。第二复制的时候漏了后半截。Cookie 字符串很长从 DevTools 里全选复制时如果只复制到可见区域开头的部分后面被折叠的内容就丢了。很多第三方工具对 Cookie 格式又很敏感少一个字段都能直接判定未登录。第三过期了。Cookie 里的大部分字段都有有效期。网易云网页端的登录态通常能维持一段时间但如果你用的是某些渠道包的 Cookie可能会在几小时内失效。这在后面专门讲失效问题的段落里再展开。2.4 HttpOnly 标记为什么有些 Cookie 在控制台里调不出来在继续讲抓取方法之前还有一个概念我建议你先了解一下HttpOnly。这是一个浏览器安全标记被标记为 HttpOnly 的 Cookie 无法通过 JavaScript 读取只能由浏览器在 HTTP 请求中自动携带。对普通用户来说这意味着你在浏览器控制台里执行document.cookie大概率是看不到完整的 Cookie 的像MUSIC_U这种敏感凭证服务器在写 Set-Cookie 响应头时通常都会带上 HttpOnly 标记。所以很多人试了在控制台输入代码复制 Cookie这个方法后会奇怪为什么拿到的总是不完整。这也是我为什么坚持推荐用开发者工具的 Network 面板或者专用的 Cookie 管理插件来抓。因为这两种方式是在浏览器层直接读取 Cookie 存储不受 HttpOnly 限制。3. 方案 A用浏览器开发者工具手工抓取完整 Cookie这个方案是我最推荐的因为不需要装任何插件每个浏览器自带原理也最透明。整个过程大概十分钟。3.1 准备干净的登录环境避免抓到旧登录态第一步不是打开工具而是先打开一个无痕窗口Chrome 里叫隐身模式Edge 里叫InPrivate。这么做有两个原因一是无痕窗口里没有旧 Cookie能保证你抓到的登录态是刚生成的有效性最长二是可以避免同时存在多账号登录态导致字段混乱。我见过有朋友在已经登录自己大号、小号开着多个标签页的浏览器里直接打开开发者工具抓到的 Cookie 一会儿是小号的一会儿是旧会话缓存的最后排查到头大。与其这样不如从零开始。打开无痕窗口后先去网易云音乐网页版首页确认当前是未登录状态。如果你是老用户浏览器会提示你是否要恢复上一次的会话这里务必选不恢复。3.2 在 Network 面板里找到签发 Cookie 的那个请求接下来是最关键的一步按F12打开开发者工具切换到Network网络面板。为了不让无关请求刷屏建议先把面板底部的过滤栏切到Fetch/XHR也可以直接在过滤框里输入关键字login或csrf。现在你在网易云网页上正常登录。可以选择扫码登录也可以账号密码登录。登录成功跳转首页的那一刻Network 面板里会出现一个或几个名字里带login或者csrf的请求这些是登录接口的往返过程。我需要你找到的是登录成功之后那个响应里包含Set-Cookie信息的请求。不同时期的网页版接口路径可能不一样前几年常见的是/weapi/login/cellphone现在可能会有新的路径但判断逻辑不变在列表里点开请求看下Headers Response Headers里有没有Set-Cookie。有就说明在这条请求上服务器下发了 Cookie。这一步容易踩坑的点是登录的请求可能不止一个有的先请求csrf获取公钥再请求login提交密码。你要看的是最后一个真正返回登录结果的那个它身上的Set-Cookie才是完整登录态。3.3 提取并组合 Cookie 的完整流程找到位置之后提取就很简单了。在 Headers 面板里往下翻到Request Headers找到Cookie:那一行把后面的值完整复制出来。这里有个小经验如果你看不到完整的 Cookie 行可以右键这条请求选择Copy Copy request headers然后粘贴到记事本里再手动挑出 Cookie 那一段。也可以直接在 Console 里用一条简单的 fetch 重新触发登录接口但我不建议在没搞清楚并发问题前去操作容易多出很多干扰请求。复制出来的字符串大概是这个样式NMTIDxxx; MUSIC_Uyyy; __csrfzzz; ospc; osverwindows-10; ...把这一整段粘到 MusicFree 这类工具的 Cookie 设置框里一般就能正常识别了。粘贴时注意前后不要有多余空格不要换行不要带引号。3.4 验证 Cookie 是否真的有效两个最直接的检测点把 Cookie 填进工具之后别急着关页面。我通常会用两个办法验证它是不是真的有效。第一个办法很朴素在第三方工具里刷新一下歌单或每日推荐如果正常加载说明登录态可用。第二个办法更严谨打开网易云网页版的个人主页如果页面右上角显示的是你自己的头像而不是登录按钮那说明浏览器里的登录态没问题。然后你再开一个无痕窗口用工具里填的 Cookie 手动拼接一个接口请求测试比如访问https://music.163.com/api/v1/user/detail/你的用户ID看返回的是 JSON 用户信息还是 401/302 错误码。这个操作偏技术流但对排查特别有效。4. 方案 B用 Cookie 管理插件抓取比手写更省心如果你不想在 Network 面板里翻来翻去或者浏览器版本比较新、界面改得你不习惯可以用 Cookie 管理插件比如 Chrome 上的EditThisCookie和Cookie-Editor。这类插件的思路是直接读取浏览器当前站点的所有 Cookie以表格形式展示你可以一键复制成不同格式。4.1 为什么我不推荐直接看 Application 面板很多新手会先打开 DevTools 的 Application应用面板在 Storage Cookies 里看 Cookie。这样做的问题是这个面板默认展示的是 Cookie 的关键值确实能看但字段多的时候要手动一个个勾选复制而且它显示的是百分号编码后的字符串直接复制容易把格式搞乱。手动在几十个字段里找MUSIC_U远不如插件一键导出方便。4.2 插件方案抓 HttpOnly Cookie 的正确姿势我用Cookie-Editor比较多。登录网易云之后在这个插件里应该能直接看到当前标签页的所有 Cookie包括 HttpOnly 的MUSIC_U因为插件走的是浏览器扩展 API比页面里的 JavaScript 权限更高。使用步骤安装插件后在网易云音乐网页版页面上点击插件图标插件会列出当前域名的 Cookie 列表点击右上角的导出按钮通常会提供 JSON / Netscape / Header 字符串等导出格式对大多数第三方播放器我推荐选Header String格式就是k1v1; k2v2那种导出后粘贴到目标工具的 Cookie 输入框即可。4.3 插件方案不容易漏字段但有一个注意点相比手写复制插件的优势是它把 HttpOnly 字段也包含了而且导出格式统一不容易漏分号。但请特别留意导出的域名范围。如果你是在music.163.com页面导出的Cookie 适用于这个主站如果你在某个子域比如music.163.com/api不是独立域名但可能会有 path 上的特殊限制导出的字段可能偏多或偏少。另外插件的导出功能属于浏览器扩展的强权限操作建议只在可靠来源的浏览器商店安装不要下载来路不明的修复版插件。5. 方案 C用 Python 脚本模拟登录生成 Cookie手工抓包适合偶尔用一次的情况但如果你是写自动化脚本比如每天定时签到、批量导出歌词、同步歌单到本地 NAS那每次手动打开浏览器复制 Cookie 就很蠢了。更合理的方式是用脚本模拟登录让程序自己在拿到密码后换取新的 Cookie。5.1 模拟登录的难点密码加密与验证码这里我必须先给一个现实提醒网易云网页版的登录接口不是裸奔的。你按下登录按钮后浏览器会用一套经过多次更新的加密流程去处理密码和参数。近年来的版本里密码先做 MD5再走一套名叫weapi的加密通道。这套加密里有 AES 和 RSA 两个阶段密钥与公钥来自服务器下发的csrf请求。更要命的是当你的网络环境异常、频繁登录、或者账号触发安全风控时接口会要求你填写验证码这类验证码还经常是滑块或者点选式的程序很难绕过。所以对大多数个人开发者来说我的建议是脚本模拟登录可以做但别指望它一劳永逸。我自己的做法是写一个半自动脚本脚本里实现参数生成和登录请求但把验证码环节留给本地人工处理或者干脆让脚本定期读取一个从浏览器导出的 Cookie 文件接近过期时提醒我重新抓一次。5.2 一个最小可用的 Python 登录脚本框架这里我提供一个能跑通基本流程的 Python 思路框架但要注意网易云的接口加密随时可能变动下面的代码只用来展示整个流程长什么样不能保证永远有效。你需要根据接口实际返回自行调整。import hashlib import time import random import requests import base64 from Crypto.Cipher import AES from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 # 网易云 weapi 参数加密的固定值 modulus 00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7 nonce 0CoJUm6Qyw8W8jud pubKey 010001 def aes_cbc_encrypt(text, key): pad 16 - len(text) % 16 text text chr(pad) * pad iv b0102030405060708 cipher AES.new(key.encode(), AES.MODE_CBC, iv) return base64.b64encode(cipher.encrypt(text.encode())).decode() def rsa_encrypt(text): key RSA.import_key(bytes.fromhex(modulus)) cipher PKCS1_v1_5.new(key) return base64.b64encode(cipher.encrypt(text[:128].encode())).decode() def create_weapi_params(params): # 生成一个 16 位随机字符串作为第二层密钥 random_key random.sample(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789, 16) random_key .join(random_key) # 第一层 AES 加密 first aes_cbc_encrypt(params, nonce) # 第二层 AES 加密key 为随机密钥 second aes_cbc_encrypt(first, random_key) # RSA 加密随机密钥 enc_key rsa_encrypt(random_key) return {params: second, encSecKey: enc_key} def login(username, password): md5pwd hashlib.md5(password.encode()).hexdigest() payload { username: username, password: md5pwd, rememberLogin: true, csrf_token: , clientToken: str(int(time.time() * 1000)), countryCode: 86 } # json.dumps 时注意不要带多余空格 import json params json.dumps(payload, separators(,, :)) data create_weapi_params(params) headers { User-Agent: Mozilla/5.0 ..., Referer: https://music.163.com/, } r requests.post(https://music.163.com/weapi/login/cellphone, datadata, headersheaders) return r.cookies, r.json() cookies, resp login(你的手机号, 你的密码) print(cookies.get_dict())你把这个脚本跑起来的最终产物就是requests的 CookieJar。把cookies.get_dict()里的MUSIC_U、__csrf这些关键字段提取出来手动拼一行 Cookie 字符串和前面手工抓包的结果是一模一样的。5.3 从自动化脚本迁移到第三方工具Cookie 端口区别这一步值得单独说。脚本生成的 Cookie 和浏览器抓到的 Cookie在字段上未必完全相同。浏览器会带上一堆额外的会话字段脚本里则可能只有服务器下发的加密凭证。你把脚本生成的 Cookie 粘进 MusicFree 时如果发现接口报错可以先对比缺少了哪个字段。多数情况下MUSIC_U和__csrf都齐了就能用。5.4 已有 Cookie 过期之后自动重登的思路我自己的项目里有这样一个逻辑脚本在启动时先检测目标工具用的 Cookie 是否有效请求一个/api/v1/user/detail之类的轻量接口如果返回 302 或错误码则自动执行一次登录流程生成新 Cookie再写入本地配置文件。这样只要密码没变、没有触发验证码风控我基本能做到连续几周无人值守。但如前面提到的如果账号触发了验证码自动登录就会卡住。这种场景我建议退回到手工抓一次 Cookie同时也反思一下是不是同一时间登录地点跳动太频繁——脚本每五分钟重登一次账号的话服务器很容易判定为异常。6. 我踩过的坑Cookie 失效、互踢和安全底线6.1 Cookie 为什么总是动不动就失效这是被问得最多的问题之一。我总结下来常见原因有四个最直接的过期时间。服务器返回Set-Cookie时每个字段带Max-Age或ExpiresMUSIC_U通常有效期较长但有些辅助字段可能只活几十分钟。第三方工具如果死守旧字段就会表现成一会儿能刷出来一会儿又要重新登录。刷新页面导致登录态更新。你在网页上主动退出登录时服务器会设置一个删除 Cookie 的响应。如果你在这个状态下复制 Cookie等于复制了一个被注销的身份。多端互踢同一账号在手机端、PC 端、网页端同时登录太多次可能导致旧会话被服务器判定为异常而强制下线。账号安全风控网易云对异地登录、频繁切换设备有风控一旦冻结或下线之前的 Cookie 自然全失效。6.2 不同设备会互踢登录态吗我实测下来网易云网页端、PC 客户端、手机客户端之间的关系没有想象中那么互踢。网页端和手机端的登录态通常可以共存但如果你在网页端反复退出再登录之前的网页端 Token 会被替换。做完 Cookie 抓取后尽量保持网页端的登录状态不要去点退出登录。还有一点二维码登录比账号密码登录生成的 Cookie 在某些历史版本里更容易被识别为网页扫码场景有效期和使用范围会有细微差别。日常自用问题不大但如果你想把 Cookie 用于服务器上的长期任务二维码登录后抓到的 Cookie 在某些接口上反而更容易碰壁。6.3 第三方工具里填 Cookie 的三个安全底线Cookie 约等于账号的半把钥匙。我给自己定了几条规矩你可以直接拿去用。第一只把 Cookie 填进你信得过的开源工具。不要因为某个闭源播放器界面好看就无脑把 Cookie 贴进去。理论上对方完全可以把 Cookie 上传到自己的服务器接着用你的身份去发评论、删歌单。建议先看项目源码、看 issue 区有没有人反映泄露问题。第二不在任何公开网络环境明文保存 Cookie。如果你要把 Cookie 写进配置文件并同步到 GitHub务必先做脱敏或者用环境变量、密钥管理工具。最保险的做法是配置文件里只存MUSIC_U和__csrf这两个关键字段其余字段不落地。第三定期更换。Cookie 不是你设的密码服务器随时能作废它。每逢手机验证登录、密码修改、风控验证之后旧 Cookie 就作废了。我的习惯是一个月主动重新抓一次而不是一直用一个用到天荒地老。6.4 失效后快速排查是哪个字段的问题如果某天第三方工具突然提示登录失效不要急着满世界找教程重新抓按下面顺序排查打开浏览器进网易云网页版看自己是不是还能正常登录。如果网页端也要求重新登录说明是账号会话整体失效重抓就好。如果网页端正常工具失效检查是不是 Cookie 字符串里某个字段过期了。可以直接看MUSIC_U之后的字符串有没有变化或者把新抓的 Cookie 和旧 Cookie 放到对比工具里 diff 一下。如果是自己写的脚本失效优先看接口返回的错误码。301通常提示未登录400大概率是参数格式问题403可能是风控。不同错误码对应的处理方式完全不同别一上来就重登重登再重登。7. 最后一点个人的使用习惯做这一套流程折腾了小半年之后我最终留了一个非常朴素的方案平时主力用官方网页版听歌只在需要同步歌单或者跑脚本的时候才打开无痕浏览器抓一次 Cookie抓完立即放进本地配置目录文件权限设为当前用户只读在脚本里加一个定时检查接口失效前一天用系统通知提醒我该续命了。这么做的原因很简单Cookie 的获取原理并不难难的是别让它变成你账号的一个永久漏洞。每次抓取都是一次授权抓的人是你用的人也只能是你。把这一层想清楚后面不管是接 MusicFree 还是自建服务都只是一个工具问题。如果你也是因为 MusicFree 或者歌词导出工具看到这篇文章按第一部分的方法抓一次就能解决如果你是写脚本玩建议把第五部分的模拟登录吃透同时做好验证码预案。别在一个失效的 Cookie 上死磕到凌晨重抓一次往往只要三分钟。