惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
NISL@THU
NISL@THU
E
Exploit-DB.com RSS Feed
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
K
Kaspersky official blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
S
Schneier on Security
G
GRAHAM CLULEY
The Hacker News
The Hacker News
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
爱范儿
爱范儿
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
S
Securelist
G
Google Developers Blog
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
美团技术团队
F
Fortinet All Blogs
小众软件
小众软件
Recorded Future
Recorded Future
V
Visual Studio Blog
B
Blog RSS Feed
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
Latest news
Latest news
Spread Privacy
Spread Privacy
H
Heimdal Security Blog

爱吃肉的猫

那就,再相逢 Butterfly的魔改教程:最新评论页 离歌不夜天 前端分享 - 滑动阻尼效果 Butterfly的魔改教程:右键菜单 音乐分享 - doi微醺氛围 Butterfly的魔改教程:动态相册页 近况记事 - 11 微信公众号:Ai大模型让回复更具智能化 近况记事 - 10 PWA:让你的网站变成桌面应用APP Healthy Love Butterfly的魔改教程:关于本站 近况记事 - 9 Butterfly的魔改教程:待办清单 TrollStore - 不掉签助手 近况记事 - 8 Twikoo评论回复邮件模版 过一个很特别的七夕 The Young Boy and the Sea Butterfly的魔改教程:文章订阅页 思考题目:混乱是阶梯 近况记事 - 7 Butterfly的魔改教程:即刻短文页 Butterfly的魔改教程:loading加载动画 差旅游记 再见,不惑之年:二十又一 近况记事 - 6 Butterfly的魔改教程:自定页数跳转 堆友AI作图:3D资源设计平台,堆出你的未来 【QD-Today】自建私有自动签到服务 Long time no see Butterfly的魔改教程:聊天记录页 Butterfly的魔改教程:个性定位信息 近况记事 - 5 Butterfly的魔改教程:好物推荐页 CDN加速 二刷《想见你》 网络言论不是法外之地 近况记事 - 4 深夜训斥 近况记事 - 3 近况记事 - 2 日常打理的那些事 Butterfly的魔改教程:随机阅读一篇文章 随笔 · 封 布柒糖FM项目进展报告 清明路雨纷纷 TA - 仲夏夜的荒原 重构记录 - 4 近况记事 Butterfly的魔改教程:评论弹窗 2021款 Model Y 近两年用车总结 重构记录 - 3 百日祭 避风的港湾 Emoji表情大全 iCat-APP 开源记录 Butterfly的调整教程:文章外挂标签美化 iOS修改 - 万铲铲的致富之路 Markdown 基础教程 从你的全世界路过 小米摄像头!避!雷! VuePress 搭建教程 Hexo跳过指定文件渲染 百度贴吧每日自动签到 重构记录 - 1 GitHub Desktop提交报错 快速批量处理重命名 Git连接仓库常用命令 Ubuntu处理deb命令 掘金自动签到并挖矿 一个简洁的橙色调个人简介 我的猫以前也是流浪猫 布柒糖FM 最新指北 幽灵404页面 PC游戏 · 植物大战僵尸 语言包 · 越狱篇 砸壳多开 · 越狱篇 HuiRan Cursors 手动关闭Win10自动更新 iPhone XR 完美越狱 成功实例 三年的跌撞 关于《小橘妈妈》 魔改前置教程:添加自定义css和js文件 Hexo 博客添加RSS插件 Butterfly的魔改教程:导航栏魔改美化
初学写个了油猴脚本
亦小封 · 2022-01-01 · via 爱吃肉的猫

突然听到了一首周董的歌,想在 5sing 上下载一首歌
然而,我好几年前的账号密码都忘得一干二净了,又不想为了下载一首歌重新注册,于是就只能通过官方的API来下载了
为了一劳永逸,我决定研究一下油猴脚本,用于实现在歌曲页面里能够绕过登录并且一键下载的功能

什么是油猴脚本?

油猴,英文Tampermonkey,又名Greasemonkey,是一款非常流行的浏览器扩展,ChromeFirefox均支持,其原理有点像Windows编程里的hook,它的可自定义性非常高,它可以运行由广大社区编写的扩展脚本,来实现各式各样的功能,常见的去广告、修改样式文件、甚至是下载视频,能给用户带来无限可能

新建一个油猴脚本,默认内容如下,无需过多配置,填写好UserScript就可以开始编写了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ==UserScript==
// @name New Userscript
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match http://*/*
// @grant none
// ==/UserScript==

(function() {
'use strict';

// Your code here...
})();

流程思维导图

第一次接触写油猴,虽然没系统学过JS,但也还有一丢丢的JS基础,得亏天下编程语言万变不离其宗,凭着“语感”一边摸索一边“借鉴”,居然也完成了

大致的流程思维图,具体看代码

获取歌曲ID及类型

ID和歌曲类型可以在歌曲页面网址上直接获得

例如:http://5sing.kugou.com/bz/88538.html
bz就是类型,表示此歌曲是伴奏歌曲,同理yc则是原唱歌曲88538就是歌曲ID

1
2
var id = window.location.href.split('/')[4].split(".")[0];
var type = window.location.href.split('/')[3].split(".")[0];

获取歌曲下载链接

向接口http://service.5sing.kugou.com/song/getsongurl?&songid=[id]&songtype=[bz]发送GET请求,其中的两个参数songid和songtype的值,上面已讲,不再赘述
成功后会返回一组Json,里边有各种音质、歌曲MD5等等信息,反序列化一下提取对应音质的下载链接即可

1
2
3
4
5
6
7
8
9
10
11
var url = 'http://service.5sing.kugou.com/song/getsongurl?&songid=' + id + '&songtype='+type;
GM_xmlhttpRequest({
method: "GET",
url: url,
onload: function (res) {
if (res.status == 200) {
var text = res.responseText;
var ret = jQuery.parseJSON(text)
}
}
}

添加下载事件

1
2
3
4
5
var oDivNode = document.getElementById("func_Down");
oDivNode.addEventListener("click",function(){
down_music(music_url,id+".mp3");
$('.new_login_bg').remove();
});

问题难点

由于我不知道的某个原因,对于视频、音频、文本等等文件直链访问并不会触发下载,而是直接在浏览器中预览,这就很烦,尝试了几个方法,貌似只能创建blob对象来下载

可能对前端大佬来说这不是什么难点,但对我这种半桶水的来说可能就难一点了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function down_music(url, name) {
let that = this
let oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
oReq.responseType = "blob";
//oReq.withCredentials = true;//如果跨域
oReq.onload = function (oEvent) {
let content = oReq.response;
let elink = document.createElement('a');
elink.download = name;
elink.style.display = 'none';
let blob = new Blob([content])
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
elink.click();
document.body.removeChild(elink);
};
oReq.send();
}

最终效果

出现跨域提醒时,点击总是允许此域名即可,以后使用时就不会弹出了

下载使用演示