JML 发表于 2022-6-23 11:58:25

cxxjackie 发表于 2022-6-23 11:21
我看了,vue页面,倒是不难做,不过你愿意公开你的api吗?不公开的话也能做,就是脚本估计只有你一个人能 ...

本来想要私信你的,但是权限不够,不清楚版规,不敢留联系方式。
如果你要写该脚本的话,api可以与你分享。但是个人不建议全网公开,毕竟见光容易失效。如果你写的话,也建议只自用。
api响应Content-Type: text/html; charset=UTF-8,
内容为:http://xxxxxx.mp3

cxxjackie 发表于 2022-6-23 12:50:20

JML 发表于 2022-6-23 11:58
本来想要私信你的,但是权限不够,不清楚版规,不敢留联系方式。
如果你要写该脚本的话,api可以与你分享 ...

目前测试直接点击播放没有问题(我随便替换了一个mp3进去),但在播放列表里切换的时候有点bug,等我有空搞一下。

cxxjackie 发表于 2022-6-23 13:31:08

写好了,私人脚本我就不发到脚本区了,你试下有没有问题,记得改一下代码把你的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();
})();
```

JML 发表于 2022-6-23 14:06:11

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:40:52

本帖最后由 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();
})();
```

JML 发表于 2022-6-24 10:47:34

cxxjackie 发表于 2022-6-23 23:40
在歌单处点击+号将单曲添加至播放列表;点击播放按钮添加至播放列表并播放;点击上方“立即播放”将全 ...

谢谢大佬
页: 1 [2]
查看完整版本: 求一个禁止弹窗,正常请求脚本