Nodejs爬取网易云音乐登录信息
第一步 分析请求头

它采用的是post的方式,虽然知道了请求地址,但是不能直接请求以为它还带的一堆数据,直接请求服务器不认识不会给相应。
先抄网易的加密模块
这里需要导入一个 querystring 模块
const querystring = require('querystring')
let postData = querystring.stringify({
'params': 'don2zoOC9jXzIm5ptQ+21/kAS7glvMhoqNuIaCbThY7lfSeQM3WlVYgwht3mYFga',
'encSecKey': '30e75b595d231b9419c700d6e180428b7aa7ef52daa7378654185e0ef35e6c6062df1418ab5203e320136e139080fcf39078a6dafd35141d2115ffd6e7e056ab4f75d3003b9ee9eb4e65851afe2343579c5f2a276fbd8e98c7dfdd6a5b31e98d6cb63fe242eb46f5bb850c5b7bb5baa1f6737b75ebb325c0493c4c09a9458aa3'
})
下来我们把请求头抄下来
代码如下:
let option = {
hostname: 'music.163.com',
post: 80,
path: '/weapi/music-vip-membership/front/vip/info?csrf_token=',
method: 'POST',
headers: {
'Accept': 'application/json, text/javascript',
'Accept-Encoding': '',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Content-Length': postData.length,
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': '_iuqxldmzr_=32; _ntes_nnid=1b93ec76f560e23893c808a56766072e,1581065205239; _ntes_nuid=1b93ec76f560e23893c808a56766072e; WM_TID=EwpwD%2BsUqtJAEQVAFAd6REa5syU8n9kN; ntes_kaola_ad=1; JSESSIONID-WYYY=uA%2B48QX8qPZag0QIoZKPH9gr5oPrjo0B7qU7Dhv6B%2BK1Xz78xKkNsuH3rflkmO0e%2FaNj1pr8E4N6OWBwBEEWIXN7un2FhMvzi7uWtSYkV%2FoTmX8uJm1urrBiYXTGsR78bgi%2BySodEFYvxs73e2Q6Ye1v7e00nRy3Ra2RQnH0q8st3rHW%3A1581156444668; WM_NI=q6kAFM55iQT7noi%2BEC6NOsVxxL4mWpH69Oc96eEUFkPW%2Bd1oc9tYPSMSl5wUgty21ernidH3wZg7FDd2T93T2hxXZDb58c124PTU658%2B9M%2BSxMnQOt6YCG2x6djQDguoQ2Q%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eed9f64a95a7b8a3f361b1ef8bb2c14b938b8ebab64b86a8b9b8dc46a1ecfa8ef92af0fea7c3b92ab3eaa5a2c547f7eba7b2d73daeb1a7ccc849f6928194d574bc94fc8ed67c8ceaf7b0e233f6bb8bb6c5619489e585b465a1e7bcbad3598f8da4d6f65fa5acb7d3b46fb2b2a785cb39b586a9d8c550a8ee9cdab260f2b8b8b9d950a2ebf884b43af8909cb6b53ffcf5f7aeaa59bc93a2b2ce80f6878da8b174f6bca6b2c76db7b19fd3d437e2a3; playerid=82662581',
'Host': 'music.163.com',
'Origin': 'http://music.163.com',
'Pragma': 'no-cache',
'Referer': 'https://music.163.com/discover',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
}
post默认填80
Content-Length的值就是密钥的长度所以直接 postData.length 就完事了
第二步 用HTTP模块测试是否成功
const http = require('http');
(main = () => {
let reqData
let req = http.request(option, res => {
res.setEncoding('utf-8')
res.on("data", data => {
reqData = data
})
res.on("end", () => {
console.log('测试完毕,数据为:', reqData)
})
})
req.write(postData)
req.end()
})()
运行完毕后输出
测试完毕,数据为: {"message":"用户未登录","code":301}
则成功
第三步 网易云音乐账号数据加密
想看是如何加密的请看这篇文章
我只搬过来用这不做详细解读
加密模块代码如下:
const CryptoJS = require('crypto-js')
b = (a, b) => {
let c = CryptoJS.enc.Utf8.parse(b),
d = CryptoJS.enc.Utf8.parse("0102030405060708"),
e = CryptoJS.enc.Utf8.parse(a),
f = CryptoJS.AES.encrypt(e, c, {
iv: d,
mode: CryptoJS.mode.CBC
});
return f.toString()
}
第四步 找到登录的网址

把Cookie改一下
和密钥也改一下
let postData = querystring.stringify({
'params': '7sJq/2KHKIfyINZBSJh/he8W6TFs1JLpKtDibkJYUOhflVd4JS2wRp7JBRF4zLGMLMFkzIC2iYJqvxcfKE3h6PkCmTZ34rM6Gyt6+N8/gLg+IpsUsVrSzrUCC0/uqz+EgHkNA98egAp1rrl5e0HTguY7M2Dv1WYrUePP2RYDCDQ8wLj3dJa+vpGD/znNYLDhb3X2tZL/9akAeoHW16u1MJYTd5TJo05arvxWpZ5VmOzx8mkLOFhhtDn+RKsFZ2xVUcg142596oT2MsK0BLXyJf/xx/dmCfEU+wHPbnyt0zxqBe4I5VSokc8pV0EUA9Iy',
'encSecKey': '40bd4da7a1f77a12420dfef1fc9d887ad5ad8a848e284a3e5a8c95e54d614f9dababda70c705a8e2ba5be6d1ee3da5a523411970d685f571297976c7fd3d499310f69aca4f49348b797cd1a11ae4a771a9e75a64af059fe4ccfd5503ee4efde364197e3146d63ef0c3631cfabc0421a3f6e571570de7713156ccf5715288d5fc'
})
let option = {
hostname: 'music.163.com',
post: 80,
path: '/weapi/batch?csrf_token=',
method: 'POST',
headers: {
'Accept': 'application/json, text/javascript',
'Accept-Encoding': '',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Content-Length': postData.length,
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': '_iuqxldmzr_=32; _ntes_nnid=1b93ec76f560e23893c808a56766072e,1581065205239; _ntes_nuid=1b93ec76f560e23893c808a56766072e; WM_TID=EwpwD%2BsUqtJAEQVAFAd6REa5syU8n9kN; ntes_kaola_ad=1; WM_NI=q6kAFM55iQT7noi%2BEC6NOsVxxL4mWpH69Oc96eEUFkPW%2Bd1oc9tYPSMSl5wUgty21ernidH3wZg7FDd2T93T2hxXZDb58c124PTU658%2B9M%2BSxMnQOt6YCG2x6djQDguoQ2Q%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eed9f64a95a7b8a3f361b1ef8bb2c14b938b8ebab64b86a8b9b8dc46a1ecfa8ef92af0fea7c3b92ab3eaa5a2c547f7eba7b2d73daeb1a7ccc849f6928194d574bc94fc8ed67c8ceaf7b0e233f6bb8bb6c5619489e585b465a1e7bcbad3598f8da4d6f65fa5acb7d3b46fb2b2a785cb39b586a9d8c550a8ee9cdab260f2b8b8b9d950a2ebf884b43af8909cb6b53ffcf5f7aeaa59bc93a2b2ce80f6878da8b174f6bca6b2c76db7b19fd3d437e2a3; playerid=82662581; JSESSIONID-WYYY=UI4Wm%5CcTZKFPa7v3fIxC6xe73zEYNGVrvuT2YTxloXn2mh7e8PiroqqeEjaxeq69zZrh%5Cj%2BTwhpuSXuODohD4ESEts6UqI9CIAo5OACcWq0UOO2PC0RM5v92FVVMbq8fDl5kHOPIcq4aX2y5cx1u7Y4VB%5CY4e0GOdlqEc%2FYAbvWAzegF%3A1581168626860; __remember_me=true; MUSIC_U=550dbca8bd71da0a71d2c6cee301d5a412521143296491e32ae91705f4fcaccac611a308532e6d6c65196b186f749e4941049cea1c6bb9b6; __csrf=11ea2c6b05d5b6dcc39f0d344bb5b190',
'Host': 'music.163.com',
'Origin': 'http://music.163.com',
'Pragma': 'no-cache',
'Referer': 'https://music.163.com/discover',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
}
第五步 登录
不BB直接代码
(main = () => {
let User, Pwd
option.path = '/weapi/batch?csrf_token=' + b(User, Pwd)
let reqData
let req = http.request(option, res => {
res.setEncoding('utf-8')
res.on("data", data => {
reqData = data
})
res.on("end", () => {
console.log('测试完毕,数据为:', reqData)
})
})
req.write(postData)
req.end()
})()
b为加密方法
最后代码为:
const querystring = require('querystring')
const http = require('http')
const CryptoJS = require('crypto-js')
let postData = querystring.stringify({
'params': '7sJq/2KHKIfyINZBSJh/he8W6TFs1JLpKtDibkJYUOhflVd4JS2wRp7JBRF4zLGMLMFkzIC2iYJqvxcfKE3h6PkCmTZ34rM6Gyt6+N8/gLg+IpsUsVrSzrUCC0/uqz+EgHkNA98egAp1rrl5e0HTguY7M2Dv1WYrUePP2RYDCDQ8wLj3dJa+vpGD/znNYLDhb3X2tZL/9akAeoHW16u1MJYTd5TJo05arvxWpZ5VmOzx8mkLOFhhtDn+RKsFZ2xVUcg142596oT2MsK0BLXyJf/xx/dmCfEU+wHPbnyt0zxqBe4I5VSokc8pV0EUA9Iy',
'encSecKey': '40bd4da7a1f77a12420dfef1fc9d887ad5ad8a848e284a3e5a8c95e54d614f9dababda70c705a8e2ba5be6d1ee3da5a523411970d685f571297976c7fd3d499310f69aca4f49348b797cd1a11ae4a771a9e75a64af059fe4ccfd5503ee4efde364197e3146d63ef0c3631cfabc0421a3f6e571570de7713156ccf5715288d5fc'
})
let option = {
hostname: 'music.163.com',
post: 80,
path: '/weapi/batch?csrf_token=',
method: 'POST',
headers: {
'Accept': 'application/json, text/javascript',
'Accept-Encoding': '',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Content-Length': postData.length,
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': '_iuqxldmzr_=32; _ntes_nnid=1b93ec76f560e23893c808a56766072e,1581065205239; _ntes_nuid=1b93ec76f560e23893c808a56766072e; WM_TID=EwpwD%2BsUqtJAEQVAFAd6REa5syU8n9kN; ntes_kaola_ad=1; WM_NI=q6kAFM55iQT7noi%2BEC6NOsVxxL4mWpH69Oc96eEUFkPW%2Bd1oc9tYPSMSl5wUgty21ernidH3wZg7FDd2T93T2hxXZDb58c124PTU658%2B9M%2BSxMnQOt6YCG2x6djQDguoQ2Q%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eed9f64a95a7b8a3f361b1ef8bb2c14b938b8ebab64b86a8b9b8dc46a1ecfa8ef92af0fea7c3b92ab3eaa5a2c547f7eba7b2d73daeb1a7ccc849f6928194d574bc94fc8ed67c8ceaf7b0e233f6bb8bb6c5619489e585b465a1e7bcbad3598f8da4d6f65fa5acb7d3b46fb2b2a785cb39b586a9d8c550a8ee9cdab260f2b8b8b9d950a2ebf884b43af8909cb6b53ffcf5f7aeaa59bc93a2b2ce80f6878da8b174f6bca6b2c76db7b19fd3d437e2a3; playerid=82662581; JSESSIONID-WYYY=UI4Wm%5CcTZKFPa7v3fIxC6xe73zEYNGVrvuT2YTxloXn2mh7e8PiroqqeEjaxeq69zZrh%5Cj%2BTwhpuSXuODohD4ESEts6UqI9CIAo5OACcWq0UOO2PC0RM5v92FVVMbq8fDl5kHOPIcq4aX2y5cx1u7Y4VB%5CY4e0GOdlqEc%2FYAbvWAzegF%3A1581168626860; __remember_me=true; MUSIC_U=550dbca8bd71da0a71d2c6cee301d5a412521143296491e32ae91705f4fcaccac611a308532e6d6c65196b186f749e4941049cea1c6bb9b6; __csrf=11ea2c6b05d5b6dcc39f0d344bb5b190',
'Host': 'music.163.com',
'Origin': 'http://music.163.com',
'Pragma': 'no-cache',
'Referer': 'https://music.163.com/discover',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
}
b = (a, b) => {
let c = CryptoJS.enc.Utf8.parse(b),
d = CryptoJS.enc.Utf8.parse("0102030405060708"),
e = CryptoJS.enc.Utf8.parse(a),
f = CryptoJS.AES.encrypt(e, c, {
iv: d,
mode: CryptoJS.mode.CBC
});
return f.toString()
};
(main = () => {
let User, Pwd
option.path = '/weapi/batch?csrf_token=' + b(User, Pwd)
let reqData
let req = http.request(option, res => {
res.setEncoding('utf-8')
res.on("data", data => {
reqData = data
})
res.on("end", () => {
console.log('测试完毕,数据为:', reqData)
})
})
req.write(postData)
req.end()
})()
最后,文章仅供学习。
来源:CSDN
作者:weixin_42431637
链接:https://blog.csdn.net/weixin_42431637/article/details/104226207