Greasy Fork is available in English.
网页版酷狗音乐下载,目前仅支持普通音质,可下载vip音乐
当前为
// ==UserScript==
// @name 网页版酷狗音乐下载
// @namespace http://tampermonkey.net/
// @version 1.6
// @description 网页版酷狗音乐下载,目前仅支持普通音质,可下载vip音乐
// @author Xie
// @match *://www.kugou.com/**
// @license 使用说明:请看下方描述
// @icon data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAADkhB4A5IQeWuSEHtjkhB7/5IQe/+SEHv/khB7/5IQe/+SEHv/khB7/5IQe/+SEHv/khB7/5IQe2OSEHlvkhB4A5IQeW+SEHv/khB7/5IQe/+SEHv/khB7Y5IQeh+SEHlvkhB5b5IQehuSEHtXkhB7/5IQe/+SEHv/khB7/5IQeW+SEHtXkhB7/5IQe/+SEHu/khB5c5IQeR+SEHqPkhB7R5IQe0uSEHqTkhB5H5IQeW+SEHu3khB7/5IQe/+SEHtTkhB775IQe/+SEHvTkhB455IQeqOSEHv/khB7/5IQe/+SEHv/khB7/5IQe/+SEHqzkhB445IQe8OSEHv/khB775IQe/+SEHv/khB5e5IQep+SEHv/khB7S5IQe2+SEHv/khB775IQezOSEHs/khB7/5IQeq+SEHlfkhB7/5IQe/+SEHv/khB7Y5IQeROSEHv/khB7/5IQeMeSEHjvkhB7/5IQeguSEHgDkhB6D5IQe/+SEHv/khB5G5IQe2OSEHv/khB7/5IQeiuSEHp/khB7/5IQe/+SEHknkhB4h5IQezeSEHgXkhB5I5IQe/eSEHv/khB7/5IQepOSEHorkhB7/5IQe/+SEHmLkhB7L5IQe/+SEHv/khB5j5IQeBuSEHjjkhB4V5IQe6+SEHv/khB7/5IQe/+SEHs7khB5j5IQe/+SEHv/khB5i5IQeyuSEHv/khB7/5IQefuSEHgDkhB4X5IQeHeSEHu7khB7/5IQe/+SEHv/khB7N5IQeZOSEHv/khB7/5IQejuSEHp7khB7/5IQe/+SEHpbkhB4A5IQeouSEHhbkhB4x5IQe7OSEHv/khB7/5IQep+SEHorkhB7/5IQe/+SEHtzkhB5C5IQe/+SEHv/khB6u5IQeAOSEHrTkhB7W5IQeGeSEHjDkhB7q5IQe/+SEHkfkhB7Z5IQe/+SEHv/khB7/5IQeY+SEHqXkhB7/5IQe8+SEHszkhB7t5IQe/+SEHunkhB7M5IQe5eSEHqrkhB5d5IQe/+SEHv/khB775IQe/+SEHvDkhB455IQep+SEHv/khB7/5IQe/+SEHv/khB7/5IQe/+SEHqrkhB455IQe8OSEHv/khB765IQe1OSEHv/khB7/5IQe8OSEHl/khB5H5IQeouSEHtDkhB7Q5IQeouSEHkvkhB5b5IQe7+SEHv/khB7/5IQe0+SEHlnkhB7/5IQe/+SEHv/khB7/5IQe2OSEHobkhB5e5IQeXOSEHojkhB7Y5IQe/+SEHv/khB7/5IQe/+SEHlnkhB4A5IQeWuSEHtbkhB7+5IQe/+SEHv/khB7/5IQe/+SEHv/khB7/5IQe/+SEHv/khB7+5IQe1uSEHlrkhB4AgAEAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAACAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
// @grant none
// ==/UserScript==
(function() {
'use strict';
if (!('speechSynthesis' in window)) {
throw alert("对不起,您的浏览器不支持")
}
setTimeout(function() {
var audioElement = document.getElementById('myAudio');
if (!audioElement) {
console.log('没用找到音频元素,无法下载')
return;
}
loadButton();
// 使用MutationObserver来监视src属性的变化
const observer = new MutationObserver(mutationsList => {
for(let mutation of mutationsList) {
if (mutation.type === 'attributes' && mutation.attributeName === 'src') {
// 检查是否存在 id 为 "downloadLink" 的元素,如果存在则删除
var existingDownloadLink = document.getElementById('downloadLink-parent');
if (existingDownloadLink) {
existingDownloadLink.parentNode.removeChild(existingDownloadLink);
}
setTimeout(function() {
loadButton();
}, 500);
break;
}
}
});
// 监听音频元素的src属性变化
observer.observe(audioElement, { attributes: true });
}, 1500);
function loadButton() {
var audioElement = document.getElementById('myAudio');
if (!audioElement) {
console.log('没用找到音频元素,无法下载')
return;
}
// 创建一个新的div元素
const floatingDiv = document.createElement("div");
floatingDiv.setAttribute('id', 'downloadLink-parent');
floatingDiv.innerHTML = `
<div id="downloadLink">
</div>
<style>
#downloadLink {
position: fixed;
bottom: 20px;
right: 20px;
padding: 10px 20px;
color: #fff;
text-decoration: none;
border-radius: 5px;
cursor: pointer;
z-index: 99999;
border: 1px solid #fff;
background-color: #8d332c;
}
#downloadLink:hover {
filter: brightness(1.5); /* 改变亮度以更改整个SVG的颜色 */
transition: filter 0.3s; /* 添加过渡效果 */
}
</style>
`;
document.body.appendChild(floatingDiv);
// 获得音频下载地址
var audioSource = audioElement.src;
// 获取音频文件名
var nameEle = document.querySelector('#songName');
if (nameEle == null) {
nameEle = document.querySelector('.audioName');
}
var songNameText = truncateText((nameEle != null ? nameEle.textContent : '未知') + '.mp3', 25);
const downloadLink = document.getElementById("downloadLink");
// 设置 <div> 标签的文本内容
downloadLink.textContent = "点击下载:" + songNameText;
console.log("下载地址:", audioSource)
console.log("文件名称:", songNameText)
downloadLink.addEventListener('click', function (event) {
downFile(audioSource, songNameText)
});
}
function downFile(url, name) {
// 创建一个 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
// 监听 XMLHttpRequest 的 readyState 属性的变化
xhr.onreadystatechange = function () {
// 当 readyState 变为 4 且状态码为 200 时表示请求成功
if (xhr.readyState === 4) {
if (xhr.status === 200) {
// 获取服务器响应的数据
var responseData = xhr.response;
// 创建一个新的 <a> 标签用于下载
let aEle = document.createElement('a');
aEle.href = window.URL.createObjectURL(responseData);
aEle.download = name; // 设置文件名
document.body.appendChild(aEle);
// 触发点击事件,开始下载文件
aEle.click();
// 下载完成后移除链接元素
document.body.removeChild(aEle);
}
else {
alert('下载失败,请在新打开的标签页中点击鼠标右键,然后选择“将音频另存为”\n如果没有发现新标签,请注意当前标签的地址栏是否有被阻止的情况\n如果有被阻止');
let aEle = document.createElement('a');
aEle.href = url;
aEle.target = '_blank'
aEle.download = name; // 设置文件名
document.body.appendChild(aEle);
// 触发点击事件,开始下载文件
aEle.click();
// 下载完成后移除链接元素
document.body.removeChild(aEle);
}
}
};
// 发送 HTTP GET 请求
xhr.open('GET', url, true);
xhr.responseType = 'blob'; // 设置响应类型为 blob
xhr.send();
}
function truncateText(text, maxLength) {
if (text.length <= maxLength) {
return text; // 如果文本长度小于等于最大长度,直接返回原文本
} else {
const startLength = Math.ceil((maxLength - 3) / 2); // 开头保留的字符数
const endLength = Math.floor((maxLength - 3) / 2); // 结尾保留的字符数
return text.slice(0, startLength) + '...' + text.slice(text.length - endLength); // 将开头和结尾的字符拼接在一起,中间用省略号表示
}
}
})();