我看了,vue页面,倒是不难做,不过你愿意公开你的api吗?不公开的话也能做,就是脚本估计只有你一个人能 ...
本来想要私信你的,但是权限不够,不清楚版规,不敢留联系方式。
如果你要写该脚本的话,api可以与你分享。但是个人不建议全网公开,毕竟见光容易失效。如果你写的话,也建议只自用。
api响应Content-Type: text/html; charset=UTF-8,
内容为:http://xxxxxx.mp3 JML 发表于 2022-6-23 11:58
本来想要私信你的,但是权限不够,不清楚版规,不敢留联系方式。
如果你要写该脚本的话,api可以与你分享 ...
目前测试直接点击播放没有问题(我随便替换了一个mp3进去),但在播放列表里切换的时候有点bug,等我有空搞一下。 写好了,私人脚本我就不发到脚本区了,你试下有没有问题,记得改一下代码把你的api写进去:
```js
// ==UserScript==
// @name 酷我音乐破解付费
// @description直接播放酷我音乐的付费歌曲
// @namespace cxxjackie
// @author cxxjackie
// @version 1.0
// @match http*://www.kuwo.cn/play_detail/*
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @run-at document-idle
// ==/UserScript==
(function() {
'use strict';
// 在这里填你的api,可以改post,加data、headers等属性,涉及跨域记得写@connect
function getSongUrl(rid) {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
url: `https://www.example.com/api?id=${rid}`,
method: 'get',
onload: res => res.status === 200 ? resolve(res.responseText) : reject(res.status),
onerror: () => reject('error')
});
});
}
// 修改歌曲信息
async function hackSong(songinfo) {
songinfo.isListenFee = false;
songinfo.disable = false;
songinfo.notAutoplay = false;
songinfo.url = await getSongUrl(songinfo.rid);
songinfo.ishacked = true;
}
// 主函数
function main() {
GM_addStyle('.page > .model_out{display: none !important;}');
const playControl = document.querySelector('.playControl');
const getPlayUrl = playControl.__vue__.getPlayUrl;
playControl.__vue__.getPlayUrl = async function(songinfo) {
if (!songinfo.ishacked) {
if (songinfo.isListenFee || songinfo.disable) {
await hackSong(songinfo);
playControl.__vue__.$store.commit('song/changeSong', songinfo);
} else {
return getPlayUrl.call(this, songinfo);
}
} else {
// 这里有时会暂停播放,原因不明
setTimeout(() => {
if (!playControl.__vue__.playing) {
playControl.__vue__.togglePlaying();
}
}, 500);
}
};
const mainCon = document.querySelector('.main_con');
if (mainCon.__vue__.songinfo.isListenFee || mainCon.__vue__.songinfo.disable) {
hackSong(mainCon.__vue__.songinfo);
}
}
main();
})();
``` cxxjackie 发表于 2022-6-23 13:31
写好了,私人脚本我就不发到脚本区了,你试下有没有问题,记得改一下代码把你的api写进去:
```js
谢谢大佬。播放页测试没问题。
如果你需要api,你可以私信我你的联系方式,我发给你(因为我积分还不够,无法私信你),或者等我积分够了之后私信发给你。
对于单曲,例如http://www.kuwo.cn/play_detail/223206927脚本可以点击立即播放进行替换。
因为每听完一首歌都要切换页面,请问下面功能能否一并实现?
1、“添加”按钮点击无效果,修改“添加”功能(歌单专辑单曲页面都有添加按钮),把歌曲添加到播放列表并替换播放;
2、对于歌单、或者专辑页面,能否点击“立即播放”能够加到播放列表并替换链接播放。
例如专辑:http://www.kuwo.cn/album_detail/28860991(完全付费的专辑)
歌单:http://www.kuwo.cn/playlist_detail/3359966222(包含付费歌曲的歌单)
如果歌单或者专辑页面包含付费或者会员歌曲,点击立即播放会直接跳过那些付费或会员歌曲。而如果整个专辑都是付费内容,点击立即播放是没有任何效果。 本帖最后由 cxxjackie 于 2022-6-23 23:41 编辑
在歌单处点击+号将单曲添加至播放列表;点击播放按钮添加至播放列表并播放;点击上方“立即播放”将全部添加并播放。api就不用了,我平时不用酷我的。
```js
// ==UserScript==
// @name 酷我音乐破解付费
// @description直接播放酷我音乐的付费歌曲
// @namespace cxxjackie
// @author cxxjackie
// @version 1.1
// @match http*://www.kuwo.cn/*
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @run-at document-idle
// ==/UserScript==
(function() {
'use strict';
// 在这里填你的api,可以改post,加data、headers等属性,涉及跨域记得写@connect
function getSongUrl(rid) {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
url: `https://www.example.com/api?id=${rid}`,
method: 'get',
onload: res => res.status === 200 ? resolve(res.responseText) : reject(res.status),
onerror: () => reject('error')
});
});
}
// 修改歌曲信息
async function hackSong(songinfo) {
songinfo.isListenFee = false;
songinfo.disable = false;
songinfo.notAutoplay = false;
songinfo.url = await getSongUrl(songinfo.rid);
songinfo.ishacked = true;
}
// 对每个符合selector的元素执行回调函数
function elementEach(selector, parent, callback) {
const elms = parent.querySelectorAll(selector);
elms.forEach(callback);
const mutationObserver = window.MutationObserver
|| window.WebkitMutationObserver
|| window.MozMutationObserver;
const matchesSelector = Element.prototype.matches
|| Element.prototype.matchesSelector
|| Element.prototype.webkitMatchesSelector
|| Element.prototype.msMatchesSelector
|| Element.prototype.mozMatchesSelector;
const observer = new mutationObserver(mutations => {
for (const mutation of mutations) {
for (const addedNode of mutation.addedNodes) {
if (addedNode instanceof Element) {
let elms = addedNode.querySelectorAll(selector);
if (matchesSelector.call(addedNode, selector)) {
elms = ;
}
elms.forEach(callback);
}
}
}
});
observer.observe(parent, {
childList: true,
subtree: true
});
}
// 主函数
function main() {
GM_addStyle('.page > .model_out{display: none !important;}');
const playControl = document.querySelector('.playControl');
if (!playControl) return;
const store = playControl.__vue__.$store;
const getPlayUrl = playControl.__vue__.getPlayUrl;
playControl.__vue__.getPlayUrl = function(songinfo) {
if (!songinfo.ishacked) {
if (songinfo.isListenFee || songinfo.disable) {
hackSong(songinfo).then(() => store.commit('song/changeSong', songinfo));
} else {
return getPlayUrl.call(this, songinfo);
}
} else {
// 这里有时会暂停播放,原因不明
setTimeout(() => {
if (!playControl.__vue__.playing) {
playControl.__vue__.songReady = true;
playControl.__vue__.togglePlaying();
}
}, 500);
}
};
if ('songlist/playAll' in store._mutations) {
const playAll = store._mutations['songlist/playAll'];
store._mutations['songlist/playAll'] = function() {
const task = [];
for (const songinfo of arguments.list) {
if (songinfo.isListenFee || songinfo.disable) {
task.push(hackSong(songinfo));
}
}
Promise.all(task).then(() => playAll.apply(this, arguments));
}
}
elementEach('.main_con', document, mainCon => {
if (mainCon.__vue__.songinfo && (mainCon.__vue__.songinfo.isListenFee || mainCon.__vue__.songinfo.disable)) {
hackSong(mainCon.__vue__.songinfo);
}
const div = mainCon.querySelector('.btns + div > div:nth-child(1)');
if (div && div.__vue__ && div.__vue__.list) {
elementEach('.song_item', mainCon, async songItem => {
const rid = songItem.querySelector('.song_name > a').href.split('/').pop();
const songinfo = div.__vue__.list.find(s => s.rid == rid);
if (songinfo) {
songItem.querySelector('.icon-icon_play_').addEventListener('click', async e => {
e.stopImmediatePropagation();
if (songinfo.isListenFee || songinfo.disable) {
await hackSong(songinfo);
}
store.commit('songlist/add', songinfo);
store.commit('song/changeSong', songinfo);
}, true);
songItem.querySelector('.icon-playlist_icon_add_').addEventListener('click', async e => {
e.stopImmediatePropagation();
if (songinfo.isListenFee || songinfo.disable) {
await hackSong(songinfo);
}
store.commit('songlist/add', songinfo);
}, true);
}
});
}
});
}
main();
})();
``` cxxjackie 发表于 2022-6-23 23:40
在歌单处点击+号将单曲添加至播放列表;点击播放按钮添加至播放列表并播放;点击上方“立即播放”将全 ...
谢谢大佬
页:
1
[2]