附件页面源代码
Posted 囚生CY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了附件页面源代码相关的知识,希望对你有一定的参考价值。
本博客是https://blog.csdn.net/CY19980216/article/details/104028709的附件,具体使用方法如下:
- 新建一个txt文本文档;
- 将以下代码复制进去并保存;
- 修改该txt文件的后缀为".html";
- 用浏览器打开该.html文件即可看到内容;
原谅我出此下策
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<link href="https://csdnimg.cn/public/favicon.ico" rel="SHORTCUT ICON">
<title>【日常】论如何在91flac上优雅地白嫖_python,爬虫_囚生CYのParadise-CSDN博客</title>
<meta name="description" content="刚回家,放下沙雕的模型和跑不通的代码,准备先做些有趣的事情。事情是这样的,去年我为了找一首河图《白马">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/detail-e2af80a482.min.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/themes/skin-yellow/skin-yellow-db01cea9f7.min.css">
<!-- 自定义皮肤样式-->
<link rel="stylesheet" href="https://csdnimg.cn/public/sandalstrap/1.4/css/sandalstrap.min.css">
<style>
.MathJax, .MathJax_Message, .MathJax_Preview
display: none
</style>
</head>
<body class="nodata " >
<link rel="stylesheet" href="https://csdnimg.cn/public/common/toolbar/content_toolbar_css/content_toolbar.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/blog_code-c3a0c33d5c.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/vendor/pagination/paging-e040f0c7c8.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/chart-3456820cac.css" />
<div class="main_father clearfix d-flex justify-content-center" style="height:100%;">
<div class="container clearfix" id="mainBox">
<div class='space_container'></div>
<main>
<div class="blog-content-box">
<div class="article-header-box">
<div class="article-header">
<div class="article-title-box">
<h1 class="title-article">【日常】论如何在91flac上优雅地白嫖</h1>
</div>
<div class="article-info-box">
<div class="article-bar-top">
<!--文章类型-->
<span class="article-type type-1 float-left">原创</span> <span class="c-purple">私密</span>
<a class="follow-nickName" href="https://me.csdn.net/CY19980216" target="_blank" rel="noopener">囚生CY</a>
<span class="time">最后发布于2020-01-18 18:00:04 </span>
<span class="read-count">阅读数 8</span>
<a id='blog_detail_zk_collection' data-report-click='"mod":"popu_823"'>
<svg class="icon">
<use xlink:href="#icon-csdnc-Collection-G" ></use>
</svg>
收藏
</a>
</div>
<div class="up-time">发布于2020-01-18 01:51:45</div>
<div class="slide-content-box">
<div class="tags-box artic-tag-box">
<span class="label">分类专栏:</span>
<a class="tag-link" target="_blank" rel="noopener"
href="https://blog.csdn.net/cy19980216/category_8079847.html">
日常 </a>
<a class="tag-link" target="_blank" rel="noopener"
href="https://blog.csdn.net/cy19980216/category_8079848.html">
小确幸 </a>
</div>
<div class="tags-box artic-tag-box">
<span class="label">文章标签:</span>
<a data-report-click='"mod":"popu_626","strategy":"python"' data-report-view='"mod":"popu_626","strategy":"python"' class="tag-link" href="https://so.csdn.net/so/search/s.do?q=python&t=blog" target="_blank" rel="noopener">python <a data-report-click='"mod":"popu_626","strategy":"爬虫"' data-report-view='"mod":"popu_626","strategy":"爬虫"' class="tag-link" href="https://so.csdn.net/so/search/s.do?q=爬虫&t=blog" target="_blank" rel="noopener">爬虫 </a>
</div>
<div class="article-copyright">
<span class="creativecommons">
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"></a>
<span>
版权声明:本文为博主原创文章,遵循<a href="http://creativecommons.org/licenses/by-sa/4.0/" target="_blank" rel="noopener"> CC 4.0 BY-SA </a>版权协议,转载请附上原文出处链接和本声明。 </span>
<div class="article-source-link2222">
本文链接:<a href="https://caoyang.blog.csdn.net/article/details/104026184">https://caoyang.blog.csdn.net/article/details/104026184</a>
</div>
</span>
</div>
</div>
<div class="operating">
<a class="href-article-edit" href="https://mp.csdn.net/postedit/104026184">编辑</a>
<a class="href-article-edit slide-toggle">展开</a>
</div>
</div>
</div>
</div>
<article class="baidu_pl">
<!--python安装手册开始-->
<!--python安装手册结束-->
<!--####专栏广告位图文切换开始-->
<!--####专栏广告位图文切换结束-->
<div id="article_content" class="article_content clearfix">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-833878f763.css" />
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-833878f763.css" />
<div class="htmledit_views" id="content_views">
<p>刚回家,放下沙雕的模型和跑不通的代码,准备先做些有趣的事情。</p>
<p>事情是这样的,去年我为了找一首河图《白马入芦花》的资源,上求度娘,下翻磁链,皆无所得。然后发现了91flac这个神奇的网站,不仅歌曲收录的数量相当全面,不管是古风一类的小众歌曲,还是周董这种在所有平台都需要付费的大牌歌手的作品,都有资源,并且可以<strong>免费下载绝大多数歌曲的流畅音质版本</strong>(至少我想找的付费歌曲都能下载,而且我这种老年人的耳朵也听不太出无损跟流畅的区别)。</p>
<p>好事并没有持续太久,去年音乐领域基本彻底进入“大版权时代”,想要白嫖歌曲谈何容易唉,91flac很快也“沦陷”,目前的情况是这样的(截至20200118凌晨12点30分):</p>
<p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118002940479.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p>
<p><strong>图1 《金榜外·纸上尘埃》歌曲页面截图(上半部分)👆</strong></p>
<p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118003018201.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p>
<p><strong>图2 《金榜外·纸上尘埃》歌曲页面截图(下半部分)👆</strong></p>
<p>因为有用截图部分太长,所以我截了两张图(<strong>图1图2</strong>),注意到第二张图的流畅音质部分<strong>曾经是不需要会员</strong>的,直接有<strong>下载按钮</strong>。往事不堪回首啊。。。</p>
<p>可能有些朋友对91flac并不是很熟悉,首页URL为<a href="https://www.91flac.com/" rel="nofollow">https://www.91flac.com/</a>,用户注册非常简单(<strong>为什么要注册用户?因为不注册你就看不到上面这两张截图,尤其是第二章截图中播放器的部分在不登录的情况下是不会出现的,这个播放器是我接下来要写怎么白嫖的关键所在</strong>),只需要提供邮箱和密码即可,不需要绑定手机,不需要实名认证,不需要填写任何个人信息,某种意义上可以说是很良心的了。</p>
<p>恰好这学期深深地陷入河图的两首歌曲《金榜外·纸上尘埃》和《金榜外·杯酒洗诗》,内心产生了强烈地共鸣,在我眼中可以算得上是盖世的两首神作,可惜各大音乐平台(网易云、酷狗、酷我)都没有,只有腾讯爸爸的QQ音乐有,然后就是我使用的华为手机自带的“华为音乐”里也可以搜到,但显然都肯定是需要付费才能下载的,而我的习惯是遇到好歌一定要把它下载到本地存起来,毕竟吃到嘴里的肉才算得上是自己的。</p>
<p>面对上面两张截图,一筹莫展。但是这个播放器是可以用来试听整首音乐的,我想或许是可以有操作的。</p>
<p>废话不多时,点击F12打开监听器,刷新页面看看上面这两张截图的页面刷新后都有什么东西呗:</p>
<p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/2020011800492551.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p>
<p><strong>图3 《金榜外·纸上尘埃》歌曲页面刷新后监听抓包截图(下半部分)👆</strong></p>
<p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118005418429.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p>
<p><strong>图4 《金榜外·纸上尘埃》歌曲页面刷新后唯一POST请求响应结果(下半部分)👆</strong></p>
<p>如<strong>图3</strong>所示,26个请求 ,就这么1个POST(红线划出),那么肯定得去看看。<strong>图4</strong>中我们看到它的响应是各种不同音质版本歌曲的信息,size显然是歌曲大小的byte值,对照<strong>图1</strong>与<strong>图2</strong>可以发现,什么flac,ape之类的都可以对得上大小和名称,就是最后一个96aac最特殊,它有一段超长的link,而且对不上<strong>图1</strong>与<strong>图2</strong>中的音质版本。</p>
<p>怎么可能对不上呢?仔细看看<strong>图2</strong>,播放器右上角的96aac是摆设么?我忽然发现可能直接去访问96aac这个link就完事了。</p>
<p>我先试试在浏览器上访问会怎么样👇</p>
<p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118010405595.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p>
<p><strong>图5 失败的尝试👆</strong></p>
<p>不死心再用requests试试👇</p>
<pre class="has">
<code># -*- coding: UTF-8 -*-
# Author: 囚生
# 时间:20200118
# 创作不易, 仅供分享, 勿传播
import os
import time
from requests import Session
from bs4 import BeautifulSoup
class Flac():
def __init__(self,
email="<您的注册邮箱>",
password="<您的登陆密码>",
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",
):
""" 类构造参数 """
self.email = email
self.password = password
self.user_agent = user_agent
""" 类常用参数 """
self.workspace = os.getcwd()
self.date = time.strftime("%Y%m%d")
self.mainURL = "https://www.91flac.com"
self.loginURL = self.mainURL + "/login"
self.musicURL = self.mainURL + "/song/"
self.linkURL = self.mainURL + "/song//link"
self.session = Session()
""" 类初始化 """
self.session.headers = "User-Agent":self.user_agent
print("正在访问首页...")
self.session.get(self.mainURL) # 访问首页
r = self.session.get("https://www.91flac.com/song_file?token=eyJpdiI6IlVHWDZQNkxsQ1NyNFV5bGViZjl2S2c9PSIsInZhbHVlIjoiQmZnZXZXMzB5cjRFbFYrZWUzMXhYaXAzUStTNngxV2tnSDhiUUZtQ1orVjlYSklHZ1ZwYnNkdmZ2ZnVIWGU4XC82ekNaeFpFU3FJS0ZyTXRkZ0tDOGhPMGJOanRoc094M2dBdVRmRjVNMDNJPSIsIm1hYyI6IjFiZDFkYWE1MjUwYTMxNWMxYTBlMTM0M2U0OGYzYTE0YTIyMTI5ODdmZTY3NWM1NTkwMDVkZWEzN2Y4ZGU4YWMifQ%3D%3D")
print(r.text)
if __name__ == "__main__":
f = Flac()
</code></pre>
<p>我就不展示到底print(r.text)是什么了,跟浏览器有所区别,返回的结果是仍是首页的html,可能是因为代码里先访问了首页的缘故,总之显然是不行的。</p>
<p>在此之后我就决定试试看爬虫模拟登录后是否可能有所区别,于是先做了一下模拟登录👇</p>
<p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118011449331.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p>
<p><strong>图6 模拟登录测试抓包结果👆</strong></p>
<p>以test@163.com与123456为提交字段测试抓包,看到还好提交字段没有被加密,但是多了一个_token,初步猜测是CSRF验证,因为它的位置处于表单数据中的第一个,以我这种前端小白的直觉,应该是这样的。然后右键打开页面源代码,如下<strong>图7</strong>所示,红线部分恰好为_token,验证了猜想。</p>
<p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118011602703.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p>
<p><strong>图7 登录页面源代码👆</strong></p>
<p>于是模拟登录就很简单了,代码自取👇</p>
<pre class="has">
<code># -*- coding: UTF-8 -*-
# Author: 囚生
# 时间:20200118
# 创作不易, 仅供分享, 勿传播
import os
import time
from requests import Session
from bs4 import BeautifulSoup
class Flac():
def __init__(self,
email="<您的注册邮箱>",
password="<您的登录密码>",
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",
):
""" 类构造参数 """
self.email = email
self.password = password
self.user_agent = user_agent
""" 类常用参数 """
self.workspace = os.getcwd()
self.date = time.strftime("%Y%m%d")
self.mainURL = "https://www.91flac.com"
self.loginURL = self.mainURL + "/login"
self.musicURL = self.mainURL + "/song/"
self.linkURL = self.mainURL + "/song//link"
self.session = Session()
""" 类初始化 """
self.session.headers = "User-Agent":self.user_agent
print("正在访问首页...")
self.session.get(self.mainURL) # 访问首页
def login(self):
print("正在访问登录页面...")
html = self.session.get(self.loginURL).text # GET访问登录页面
soup = BeautifulSoup(html,"lxml")
csrf_token = soup.find("meta",attrs="name":"csrf-token").attrs["content"]
print("csrf-token为: ".format(csrf_token))
formdata = # 建议不要改字段顺序, 就我WEB开发的经验来看, csrf-token总是是作为第一个参数, 所以后端一般会选择过滤掉第一个字段
"_token": csrf_token,
"email": self.email,
"password": self.password,
r = self.session.post(self.loginURL,data=formdata) # POST提交登录字段
""" 判断登录是否成功: 目前简单根据title字段来判断 """
html = r.text
soup = BeautifulSoup(html,"lxml")
title = str(soup.find("title").string)
if "登录" in title: return False # 20200117登录失败的title为: <title>登录_91flac.com无损音乐网</title>
else: return True # 20200117登录成功的title为: <title>我的资料_13856244865_91flac.com无损音乐网</title>
if __name__ == "__main__":
f = Flac()
flag = f.login()
if flag: print("登陆成功")
else: print("登陆失败")
</code></pre>
<p>事实上即便使用登陆后的session仍然无法得到我想要的东西,事情又变得坏起来了。</p>
<p>睡前准备再试试,于是试着监听点击<strong>图2</strong>中的播放器的播放按钮,听一段音乐,看看会有什么好事发生呗。</p>
<p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/2020011801215846.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p>
<p><strong>图8 《金榜外·纸上尘埃》歌曲页面点击播放按钮后监听抓包情况👆</strong></p>
<p>天晴了,雨停了,图大唱起来了,我觉得自己又行了。看到这两个包,第一个是重定向302,显然不靠谱(<strong>仔细看看第一个其实就是图5中访问的URL,只是查询字符串中的token换了而已</strong>), 那我们看看第二个的响应是什么呗</p>
<p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118012646203.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p>
<p> <strong>图9 《金榜外·纸上尘埃》歌曲页面点击播放按钮后监听抓包:第二个包的响应结果👆</strong></p>
<p>这一串莫名其妙的串让我想到了之前模拟登录B站时抓取canvas画布上的验证图片抓包时同样看到了类似的东西,我想可能八九不离十了。但是我很难找到这个请求的URL是从哪里截取得到的(可能有点蠢,找不到),所以我就直接复制了请求URL做了测试👇</p>
<pre class="has">
<code> urls = [
"http://mobileoc.music.tc.qq.com/C400001dyoiE0eCdgK.m4a?guid=FA&vkey=E7EF3A574783636B3E9F4A75C819810AB7F230CF819A76C044746BBB16A07A9169242B5EF3960A1DBEFE1FB47F27B490577AFB8B2ECD3989&uin=0&fromtag=8",
"http://mobileoc.music.tc.qq.com/C400004D66CL3XaKNU.m4a?guid=FA&vkey=3DD5852551E8778622E753569E02ACA04E6B11FDCCD1231A7DE2FE1F54A675740C91472E7318D5305E71A4611354139396B816CDD738D2C1&uin=0&fromtag=8",
"http://mobileoc.music.tc.qq.com/C400002u6wBM0LSG0Q.m4a?guid=FA&vkey=B9EA91CCCB41BC9E158DFA518E16CF78EE556AD2567C2CECB787E6FB1442DAC0106BF2BAE27D5809FEB9F1EEBBA76326B1E088DAE132D782&uin=0&fromtag=8",
"http://mobileoc.music.tc.qq.com/C400000NXIup1NeWNq.m4a?guid=FA&vkey=4B8094605617C0A65DB19F664466B5555967F4259C6835A474A69C51C99F1A36C961C2806F8916A65DAC8BDF4BB945CC50155D972E246182&uin=0&fromtag=8",
]
# 这些URL在不同时间段复制都是不一样的(即"?"后面的查询字符串都是有差异的),但是我试下来这些URL并非阅后即焚,是可以重复使用的,至于多久失效,我没有做测试,总之能用就行了。</code></pre>
<p>这里分别是我手动复制的4首歌请求URL(即<strong>图9</strong>中抓包的请求URL),从上到下分别是《金榜外·纸上尘埃》《金榜外·杯酒洗诗》《金榜外·纸上尘埃(伴奏)》《金榜外·杯酒洗诗(伴奏)》。</p>
<p>这些URL在不同时间段复制都是不一样的(即"?"后面的查询字符串都是有差异的),但是我试下来这些URL并非阅后即焚,是可以重复使用的,至于多久失效,我没有做测试,总之能用就行了。</p>
<p>下载代码如下所示</p>
<pre class="has">
<code># -*- coding: UTF-8 -*-
# Author: 囚生
# 时间:20200118
# 创作不易, 仅供分享, 勿传播
import os
import time
from requests import Session
from bs4 import BeautifulSoup
class Flac():
def __init__(self,
email="1299868821@qq.com",
password="123456",
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",
):
""" 类构造参数 """
self.email = email
self.password = password
self.user_agent = user_agent
""" 类常用参数 """
self.workspace = os.getcwd()
self.date = time.strftime("%Y%m%d")
self.mainURL = "https://www.91flac.com"
self.loginURL = self.mainURL + "/login"
self.musicURL = self.mainURL + "/song/"
self.linkURL = self.mainURL + "/song//link"
self.session = Session()
""" 类初始化 """
self.session.headers = "User-Agent":self.user_agent
print("正在访问首页...")
self.session.get(self.mainURL) # 访问首页
def login(self):
print("正在访问登录页面...")
html = self.session.get(self.loginURL).text # GET访问登录页面
soup = BeautifulSoup(html,"lxml")
csrf_token = soup.find("meta",attrs="name":"csrf-token").attrs["content"]
print("csrf-token为: ".format(csrf_token))
formdata = # 建议不要改字段顺序, 就我WEB开发的经验来看, csrf-token总是是作为第一个参数, 所以后端一般会选择过滤掉第一个字段
"_token": csrf_token,
"email": self.email,
"password": self.password,
r = self.session.post(self.loginURL,data=formdata) # POST提交登录字段
""" 判断登录是否成功: 目前简单根据title字段来判断 """
html = r.text
soup = BeautifulSoup(html,"lxml")
title = str(soup.find("title").string)
if "登录" in title: return False # 20200117登录失败的title为: <title>登录_91flac.com无损音乐网</title>
else: return True # 20200117登录成功的title为: <title>我的资料_13856244865_91flac.com无损音乐网</title>
def download(self):
flag = self.login()
if flag: print("登录成功!")
else:
return False
print("登陆失败!")
urls = [
"http://mobileoc.music.tc.qq.com/C400001dyoiE0eCdgK.m4a?guid=FA&vkey=E7EF3A574783636B3E9F4A75C819810AB7F230CF819A76C044746BBB16A07A9169242B5EF3960A1DBEFE1FB47F27B490577AFB8B2ECD3989&uin=0&fromtag=8",
"http://mobileoc.music.tc.qq.com/C400004D66CL3XaKNU.m4a?guid=FA&vkey=3DD5852551E8778622E753569E02ACA04E6B11FDCCD1231A7DE2FE1F54A675740C91472E7318D5305E71A4611354139396B816CDD738D2C1&uin=0&fromtag=8",
"http://mobileoc.music.tc.qq.com/C400002u6wBM0LSG0Q.m4a?guid=FA&vkey=B9EA91CCCB41BC9E158DFA518E16CF78EE556AD2567C2CECB787E6FB1442DAC0106BF2BAE27D5809FEB9F1EEBBA76326B1E088DAE132D782&uin=0&fromtag=8",
"http://mobileoc.music.tc.qq.com/C400000NXIup1NeWNq.m4a?guid=FA&vkey=4B8094605617C0A65DB19F664466B5555967F4259C6835A474A69C51C99F1A36C961C2806F8916A65DAC8BDF4BB945CC50155D972E246182&uin=0&fromtag=8",
]
for i in range(len(urls)):
r = self.session.get(urls[i])
with open("test.mp3".format(i),"wb") as f:
f.write(r.content)
if __name__ == "__main__":
f = Flac()
f.download()
</code></pre>
<p>我在download()函数中的urls变量里放入我要下载的歌曲的URL(自己到浏览器抓包页面手动复制),然后get请求后以"wb"模式将响应的content写入mp3文件(我这里是test0.mp3,test1.mp3,test2.mp3,test2.mp3)</p>
<p>运行结果如<strong>图10</strong>所示👇</p>
<p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118014001495.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p>
<p><strong>图10 运行后工作目录下的文件结果👆 </strong></p>
<p>看这些文件的大小,与<strong>图4</strong>中的抓包响应结果大致匹配,我确信已经成功了,打开test0.mp3👇</p>
<p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118014216522.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p>
<p>请不要吐槽我用浏览器打开mp3,因为我不希望我的电脑上有乱七八糟的APP,能不装的APP我都尽量是不装,所以只能用浏览器打开。显然是打开失败了,我猜想这个文件不是mp3格式的(后发现是m4a格式的),于是用WIN10自带的Windows Media打开👇</p>
<p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118014545997.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p>
<p>不多说了总之我很满足,也很困了。</p>
<p>希望91flac动作慢点,我还有几首图大的歌没下呢,希望明早不会看到已经不能用这种方法偷鸡了。</p>
<p> </p>
<p>睡前PS:</p>
<p>经过测试直接把代码中urls中的4个URL直接复制到浏览器中也可以打开该音乐并保存,但是获取到这些URL仍需登录才行,并且我觉得要批量下载的话还是写个爬虫可能还是快些。</p>
<p>另外这个又牵扯到另一个问题,比如在手机APP上(如网易云)听完歌曲,一般即使不缓存,一段时间以内是可以离线播放的,这个显然是得有音乐文件保存在本地的,如何找到它们也是一个有意思的问题(其实今晚在做这事情之前我还先试了试这个问题,但没有得到结果)。</p>
</div>
<div class="more-toolbox">
<div class="left-toolbox">
<ul class="toolbox-list">
<li class="tool-item tool-active is-like tool-clicked"><a href="javascript:;"><svg class="icon" aria-hidden="true">
<use xlink:href="#csdnc-thumbsup"></use>
</svg><span class="name">点赞</span>
<span class="count">1</span>
</a></li>
<li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click='"mod":"popu_824"'><svg class="icon" aria-hidden="true">
<use xlink:href="#icon-csdnc-Collection-G" ></use>
</svg><span class="name">收藏</span></a></li>
<li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
<use xlink:href="#icon-csdnc-fenxiang"></use>
</svg>分享</a></li>
<!--打赏开始-->
<!--打赏结束-->
</ul>
</div>
</div>
<div class="person-messagebox">
<div class="left-message"><a href="https://caoyang.blog.csdn.net">
<img src="https://profile.csdnimg.cn/1/E/6/3_cy19980216" class="avatar_pic" username='CY19980216'>
<img src="https://g.csdnimg.cn/static/user-reg-year/1x/2.png" class="user-years">
</a></div>
<div class="middle-message">
<div class="title"><span class="tit"><a href="https://caoyang.blog.csdn.net" data-report-click='"mod":"popu_379"' target="_blank">囚生CY</a></span>
</div>
<div class="text"><span>发布了41 篇原创文章</span> · <span>获赞 135</span> · <span>访问量 44万+</span></div>
</div>
</div>
</div>
</article>
以上是关于附件页面源代码的主要内容,如果未能解决你的问题,请参考以下文章
jquery-from.js上传附件,回调返回的结果是前端页面或者是下载文件!!!