网易云音乐解析
// ==UserScript==
// @name 网易云解析·凉
// @namespace http://tampermonkey.net/
// @version 1.3
// @description 网易云音乐解析
// @author wangkaixuan
// @match https://music.163.com/song*
// @icon https://www.google.com/s2/favicons?sz=64&domain=163.com
// @license Apache
// @grant GM_xmlhttpRequest
// ==/UserScript==
//界面设计
var title=""
var url="";
var shape = true;
const div = document.createElement('div');
const divs = document.createElement('div');
const span = document.createElement('span');
const button = document.createElement('button');
button.textContent = "が";
span.textContent="获取中..";
const audio = document.createElement('audio');
audio.controls = true;
audio.loop = true;
const text = document.createTextNode('浏览器版本过低');
audio.appendChild(text);
divs.appendChild(span);
divs.appendChild(button);
div.appendChild(audio);
div.appendChild(divs);
document.body.appendChild(div);
//button.addEventListener('click',function(){} )
button.addEventListener('click',function(){
if(shape){
div.style.width="110px";
div.style.height="110px";
divs.style.width="110px";
audio.style.width="110px";
span.style.opacity="0";}else{
div.style.width="300px";
div.style.height="125px";
divs.style.width="300px";
audio.style.width="300px";
span.style.opacity="1";
}shape=!shape
div.style.transition="width 0.6s ease-out, height 0.4s 0.7s";
})
div.style=`
position:fixed;
border-radius:30px;
width:300px;
height:125px;
background-color:#ddd;
border:6px solid black;
top:120px;
left:10px;
`
divs.style=`
border-radius:25px;
width:300px;
height:110px;
cursor: grab;
background-color: #ddd;
padding-top: 15px;
box-sizing: border-box;
transition: width 0.6s ease-out;
`
audio.style=`position:absolute;
bottom:0;
left:0;
z-index:90;
transition: width 0.6s ease-out;
`
button.style=`
position:absolute;
top:8px;
right:8px;
height:40px;
width:40px;
border:none;
font-size:20px;
z-index:11;
background-color: #ddd;
cursor: pointer;
font-weight:bold;
`
span.style=`
font-size:20px;
position:absolute;
left:10px;
z-index:10;
transition:opacity 0.4s 0.7s;
user-select:none;
max-height:100px;
overflow:hidden;
`
//鼠标拖动功能
let startX, startY;
// 定义变量,记录div元素的初始位置
let initialX, initialY;
// 定义变量,记录是否处于拖动状态
let isDragging = false;
// 鼠标按下事件监听器
divs.addEventListener('mousedown', function(e) {
// 记录鼠标按下时的位置
startX = e.clientX;
startY = e.clientY;
// 记录div元素的初始位置
const rect = div.getBoundingClientRect();
initialX = rect.left;
initialY = rect.top;
// 将状态设置为拖动状态
isDragging = true;
});
// 鼠标移动事件监听器
document.addEventListener('mousemove', function(e) {
// 如果不处于拖动状态,则直接返回
if (!isDragging) return;
div.style.transition="";
// 计算div元素的新位置
const dx = e.clientX - startX;
const dy = e.clientY - startY;
const newX = initialX + dx;
const newY = initialY + dy;
// 将div元素移到新位置
div.style.left = newX + 'px';
div.style.top = newY + 'px';
});
// 鼠标松开事件监听器
document.addEventListener('mouseup', function() {
// 将状态设置为非拖动状态
if(isDragging){
div.style.transition="top 0.3s ease-out,left 0.3s ease-out ";//过渡动画之间的配合和设计非常巧妙
if(div.getBoundingClientRect().top<110){div.style.top="110px"}
if(div.getBoundingClientRect().top>window.innerHeight-180){div.style.top=window.innerHeight-180+"px"}
if(div.getBoundingClientRect().left>window.innerWidth-160){div.style.left=window.innerWidth-160+"px"}
if(div.getBoundingClientRect().left<0){div.style.left=0+"px"}
localStorage.setItem("boxx", div.style.left);//保存
localStorage.setItem("boxy", div.style.top);//保存
// setTimeout(function(){div.style.transition="";},400)
isDragging = false;}
});
window.addEventListener('resize', function() {
if(div.getBoundingClientRect().top>window.innerHeight-180){div.style.top=window.innerHeight-180+"px"}
if(div.getBoundingClientRect().left>window.innerWidth-160){div.style.left=window.innerWidth-160+"px"}
});
var boxx = localStorage.getItem("boxx");//读取
var boxy = localStorage.getItem("boxy");//读取
if(boxx){
div.style.left = boxx;
div.style.top = boxy;}
//数据获取
var currentUrl = window.location.href;
//console.log(currentUrl);
var id = new URL(currentUrl).searchParams.get("id");
//console.log(id);
if(id){
var apiUrl = "https://api.paugram.com/netease/?id=" + id;
GM_xmlhttpRequest({
method: "GET",
url: apiUrl,
onload: function(response) {
var json = JSON.parse(response.responseText);
title = json.title;
url = json.link;
// console.log(title,url);
if(title){
span.textContent = title;}
audio.src =url;
}
});}