解析邻居的耳朵音乐地址(单页下载)

    偶尔听歌的时候发现了一个很小众的音乐分享网站,邻居的耳朵,有个人的电台类型,属于音乐分享+文字分享,觉得很不错。从域名来看,属于多米旗下的网站:http://ear.duomi.com/  看来多米收购了很多这样的小站,包括之前的songtaste也被多米收下了。

   

    针对这样的网站尝试着自己去发掘音乐的真实链接,然后得到一个下载小工具,有了这么个初衷就开始尝试寻找真实链接的蛛丝马迹了。首先从crifan大神那里学习到可以利用IE提供的F12功能去分析一系列的请求过程,然后可以得到下面的一个记录:

    

    然而,这条记录是如何得到的呢,从抓取包的记录里面完全没有一些记录,不像crifan在分析songtaste的时候那么复杂,这里就是比较突兀的出现了请求这个url的http的get请求。然而可以看到这个请求是flash播放器发起的,所以一个不错的方法就是将上面的flash播放器下载然后进行反编译,查看一下flash播放器大概是如何发起请求的。

    这里有一个在线反编译swf的网站:http://www.showmycode.com/ ,我把swf的播放器下载然后提交得到类似如下的代码,其实不会AS的代码,不过扫到下面的时候感觉loadsound应该就是我想要的,百度下果然,src参数应该就是需要的音乐的地址了,但是src怎么传入进来的似乎没有从这个代码中感受的到,毕竟不会as,这里不深入研究了,从网页的源代码了解一下,看能否发现一些线索。

    

    打开网页的源代码查看,会发现这行非常像想要的信息,但是soundfile似乎加密了一样。这里的加密必定是可逆的,所以尝试了一下MD5和BASE64的解码,果然BASE64可以解析出地址:

    http://stream0.kxt.fm/dj/dangnikaishitingbuqizhegeshijiedeshengyin.mp3

    算是得到了想要的音乐地址结果了。

    

    

    接下来应该是从音乐地址进行下载了,但是这里存在一个问题,自己并未解决,因为自己尝试利用解析出的地址下载的时候出现拒绝访问,目前没找到好的解决方法,如果有遇到这种情况有解决方案的人提供下思路。

    

 

    上述分析完之后就尝试利用python简单的还原一下上面的过程,然而下载的部分还没找到解决方案。

    这个问题的来源其实就是因为没有完全模拟IE9中F12捕获的请求,参考评论中方法,服务器那边应该有check Referer这个头。但是由于之前用chrome插件postman怎么仿真header都无法成功,这里吐槽一下postman这个插件,这里找了其他的chrome的http request插件,竟然成功获取了音乐数据。

    看来这个问题解决了,这里就可以下载音乐了,方法即在http请求的时候参照设定一下header的信息,最重要的信息就是Referer信息了,表明你是flash播放器的身份~,服务器才无法知道你到底是不是播放器。

    代码实现的时候是利用urllib的urlretrieve方法获取文件,网上关于urllib如何设置header信息的方法特别少,大多都会让你选择利用urllib2代替,不过找了好久还是找到了替代的方法。参考python的一个mail list;

    https://mail.python.org/pipermail/python-list/2009-August/547234.html

    给出的解决方案的代码如下: 其中addheader是继承下来的Urlopener里的方法,这里直接拿来借用,urllib的原因就没有继续深究。

import urllibclass AppURLopener(urllib.FancyURLopener):version = "App/1.7"referrer = "http://ear.duomi.com/wp-content/plugins/audio-player/assets/player.swf?ver=2.0.4.1"def __init__(self, *args):urllib.FancyURLopener.__init__(self, *args)if self.referrer:self.addheader('Referer', self.referrer)urllib._urlopener = AppURLopener()

    

    代码主要基于urllib打开网页,然后利用re模块进行正则表达式的匹配出相应的模块,组合成想要的信息。其中base64解码的时候出现了问题,这里的方法是利用=号补齐。

    其中python的正则表达式参考:                 http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

    base64遇到“incorrect padding”问题参考: http://stackoverflow.com/questions/2941995/python-ignore-incorrect-padding-error-when-base64-decoding

 

    

#coding=utf-8import urllib
import re
import base64
import time
import sysearurl = "http://ear.duomi.com/?p=296462"
class AppURLopener(urllib.FancyURLopener):version = 'App/1.7'referer = 'http://ear.duomi.com/wp-content/plugins/audio-player/assets/player.swf?ver=2.0.4.1'def __init__(self, *args):urllib.FancyURLopener.__init__(self, *args)if self.referer:self.addheader('Referer',self.referer)class EarPageAnalysis:def __init__(self):self.title = ""self.singer = ""self.starttime = ""self.article = ""self.musicurl = ""self.musicname = ""def analysis(self,responsebody):#title,singer,starttimetss = r'<p><strong>(.*)<br />(.*)<br />(.*)<br />(.*)</strong></p>'tsspattern = re.compile(tss,re.S)tsslist = re.findall(tsspattern,responsebody)self.title = tsslist[0][0]self.singer = tsslist[0][1]self.starttime = tsslist[0][2]#articlearti = r'</p>.*<p>(.*)</p>.*<p><span style="color: #808000;">'artipattern = re.compile(arti,re.S)artilist = re.findall(artipattern,responsebody)self.article = artilist[0]#musicurlmusic = r'AudioPlayer.embed\(".*",.*\{.*soundFile:"(.*)"\}\);'musicpattern = re.compile(music,re.S)musiclist = re.findall(musicpattern,responsebody)missing_padding = 4 - len(musiclist[0]) % 4if missing_padding:musiclist[0] += b'=' * missing_paddingself.musicurl = base64.b64decode(musiclist[0])tmplist = self.musicurl.split('/')self.musicname = tmplist[len(tmplist) - 1]def saveMusic(self):urllib._urlopener = AppURLopener()def reportHook(copiedBlocks, blockSize, totalFileSize):if copiedBlocks == 0:print 'Begin to download, total size = %d' % (totalFileSize)else:print 'Downloaded bytes: %d -- %d' % (copiedBlocks * blockSize,totalFileSize)urllib.urlretrieve(self.musicurl,self.musicname,reportHook)def showInfo(self):print self.titleprint self.singerprint self.starttimeprint self.articleprint self.musicurl#test a best ear url
page = urllib.urlopen(earurl)
responsebody = page.read()
pa = EarPageAnalysis()
pa.analysis(responsebody)
pa.showInfo()
pa.saveMusic()

  

  简单的解析结果如下:

    

 

    音乐也下载成功了;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么电脑不能打字_嘉兴在线丨「生活经济学」为什么笔记本电脑能在任何国家的供电标准下运作,其他大部分电器却不能?...

【生活热搜】从日本背回来的电饭煲煮饭口感总是不对&#xff0c;用几天就坏了&#xff1b;英国邮回来的吹风机怎么都插不上电源只能闲置……如果你有从国外买家用电器的经历&#xff0c;你一定会发现很多电器因为每个国家或地区的供电标准不同而无法正常使用的情况。但笔记本电…

【DotNetMLLearn】.NET Core 人工智能系列-.NET Interactive环境介绍

在进入.NET Core 的人工智能应用开始前&#xff0c;我们先把环境搭建好&#xff0c;为以后的学习提供一个便利。作为一个.NET 程序员&#xff0c;或者其他编程语言的程序员&#xff0c;相信对IDE的依赖必不可少&#xff0c;如Visual Studio/Visual StudioCode , IntelliJ , Ecl…

php curl https 443,PHP CURL支持HTTP、HTTPS 请求亲测可用

废话就不多说 直接上代码&#xff0c;亲测好用原生&#xff1a;/*** curl发送htpp请求* 可以发送https,http,get方式,post方式,post数据发送*/public function dataRequest($url,$httpstrue,$methodget,$datanull){//初始化curl$ch curl_init($url);//字符串不直接输出&#x…

2020届的毕业生怎么这么苦!

一提到毕业论文我们身上的每个细胞都在告诉自己这件事太麻烦了&#xff01;每天要思考着选题、开题报告、查资料写稿、排版、答辩、做PPT......除了8000到20000的字数要求完成一篇毕业论文&#xff0c;要依次经历确定论文选题&#xff0c;提交开题报告查阅行业文献&#xff0c;…

RMSE均方根误差学习笔记

1.均方根误差&#xff0c;它是观测值与真值偏差的平方和观测次数n比值的平方根&#xff0c;在实际测量中&#xff0c;观测次数n总是有限的&#xff0c;真值只能用最可信赖&#xff08;最佳&#xff09;值来代替.方根误差对一组测量中的特大或特小误差反映非常敏感&#xff0c;所…

java小数强制转换,Java中的强制类型转换 大数转小数

首先要明确一下转换规则&#xff1a;大数转小数&#xff0c;多出的高位部分会被截断。比如 int 占 4个byte(32 bit), byte占 1个byte(8bit), 那int 转 byte &#xff0c;int 高位多出的那24个bit会被截断。例1:int b 233; // 正整数强转System.out.println((byte)b);// 原码&a…

js 定时网页点击_反爬 JS 逆向,扣代码解密分析

挺久没发爬虫相关的教程啦&#xff0c;今天给大伙分享一下关于网站反爬对请求参数值的加密分析例子&#xff0c;主要还是看看思路。定位加密点在某网站中进行登录请求&#xff1a;简单抓下包&#xff0c;点击登录按钮之后&#xff0c;可以在浏览器的控制台中看到相关的请求&…

这个时代最重要的技能之一(数据分析)

大家好&#xff0c;我是Z哥。首先说明一下&#xff0c;今天不卖课程哈&#xff0c;就单纯聊聊我在做数据分析时的一些经验。在如今这个数据爆炸的时代&#xff0c;我们每天不管是主动还是被动&#xff0c;都会面对大量的数据扑面而来。如果有较好的数据分析能力&#xff0c;不管…

ADO.NET Entity Framework学习笔记(2)建模[转]

模型结构 [概念模型]中要有[实体键], [实体键]要与表中的 [主键] 对应,也就是说表必须要有主键. 表中的[唯一键]不会在[概念模型]中体现 在[概念模型]中默认是不允许修改[实体键]的值的 联合主健可以正常映射 如果为属性赋值超过字段长度保存时,会向数据库提交,数据库会返回错…

教你怎么一下哄好赌气的女朋友​

1 教你怎么一下哄好赌气的女朋友▼2 有钱人的隔离生活也格外丰富多彩▼3 狗&#xff1a;有一种被掏空的感觉▼4 湘西赶尸的原理找到了&#xff01;▼5 泰罗奥特曼在打奥特曼你先去找迪迦奥特曼玩▼6 看起来就很值钱的哟而且还是微波炉专用哦&#xff01;▼7 看完了有点恐…

最受欢迎中国技术博客? 我才狂写4周唉

今天察看了一下blog的访问来源&#xff0c;居然发现有很多点击来自同一个URL&#xff1a;http://blog.zdnet.com.cn/popblogger50.shtml。进去一看&#xff0c;发现是一个‘最受欢迎中国技术博客’评选活动。这让我很惊讶&#xff0c;因为这个Blog1&#xff09;放得很冷僻&…

headless 怎么处理_公司清算注销债务怎么处理

公司解散2020-09-10 14:27:00更新公司在经营的过程中会产生很多应付款的&#xff0c;最为常见的是应付货款&#xff0c;应付款是指应该支付而未支付的款项&#xff0c;是属于债务的一种&#xff0c;那么公司注销清算前应付款如何处理?下面由华律网小编为读者进行的解答&#x…

WTMPlus 低代码平台来了

点击上方蓝字关注我们WTMPlusWTM框架开源4年以来&#xff0c;凭借其良好的设计&#xff0c;超高的开发效率&#xff0c;出色的性能和广泛的适用性得到了越来越多用户的喜爱&#xff0c;WTM的Nuget包累计下载已经超过了14万次&#xff0c;平均每天都有100人次使用WTM在开发项目。…

数据结构C#版笔记--堆栈(Stack)

堆栈(Stack)最明显的特征就是“先进后出”&#xff0c;本质上讲堆栈也是一种线性结构&#xff0c;符合线性结构的基本特点&#xff1a;即每个节点有且只有一个前驱节点和一个后续节点。 相对前面学习过的顺序表、链表不同的地方在于&#xff1a;Stack把所有操作限制在"只能…

为什么女生会有体香?

全世界只有3.14 % 的人关注了爆炸吧知识本文转载自微信公众号一只学霸&#xff08;ID&#xff1a;bajie203&#xff09;今天渣哥向我诉说了一个困扰了他很久的疑问看着渣哥这一副无知的样子学霸的内心暗爽就让你伟大而又聪慧的霸霸来为你揭开女生的真面目一说到这个学霸知道你们…

手游开发者交流会议暨OGEngine新版发布

2019独角兽企业重金招聘Python工程师标准>>> 手游开发者交流会议暨OGEngine新版发布 由OGEngine举办的第二次手游开发者交流会议以圆桌会议方式在深圳高新园举行。会议不仅吸引了手游开发者&#xff0c;也有海外支付商&#xff0c;国内外的手游发行商参加。 会议环绕…

python 绘制围棋棋盘_围棋之规则基础(一)

★本期导读&#xff1a;一、围棋的下法二、气★正文&#xff1a;一、围棋的下法1、 对局双方各执一色棋子。2、 空枰开局。3、 黑先白后&#xff0c;交替着一子于棋盘的交叉点上。4、 棋子下定后&#xff0c;不再向其它点移动。5、 轮流下子是双方的权利&#xff0c;但允许任何…

php pdo 查询语句,PDO:预处理语句(参数化查询)

(PDO(PHP data object/PHP数据对象))[PDO|预处理语句|参数化查询]The database library called PHP Data Objects or PDO for short can use drivers for many different database types, and supports a very important feature known as prepared statements, sometimes also…

WiFi密码都不会破译​还想考清华?​

1 18万的飞机票也能秒空&#xff1f;&#xff1f;&#xff1f;留学生&#xff1a;这是救命钱啊▼2 WiFi密码都不会破译还想考清华&#xff1f;▼3 好羡慕有这样的妈妈▼4 猫&#xff1a;你别进来&#xff0c;我这儿不接待小孩儿&#xff01;孩子&#xff1a;我就进去看看▼…

ASP.NET网页文本编辑器的使用

ASP.NET网页文本编辑器的使用&#xff0c;效果图如下&#xff1a; 这里要用到DotNetTextBox.dll组件&#xff0c;具体内容可以在http://sites.google.com/site/zhangqs008/chang-yong-gong-ju 下载&#xff0c;使用方法如下&#xff1a; 1.将“DotNetTextBox.dll”文件添加到工…