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

    偶尔听歌的时候发现了一个很小众的音乐分享网站,邻居的耳朵,有个人的电台类型,属于音乐分享+文字分享,觉得很不错。从域名来看,属于多米旗下的网站: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 urllib

class 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-8

import urllib
import re
import base64
import time
import sys

earurl = "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,starttime
        tss = 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]

        #article
        arti = r'</p>.*<p>(.*)</p>.*<p><span style="color: #808000;">'
        artipattern = re.compile(arti,re.S)
        artilist = re.findall(artipattern,responsebody)
        self.article = artilist[0]

        #musicurl
        music = r'AudioPlayer.embed\(".*",.*\{.*soundFile:"(.*)"\}\);'
        musicpattern = re.compile(music,re.S)
        musiclist = re.findall(musicpattern,responsebody)
        missing_padding = 4 - len(musiclist[0]) % 4
        if missing_padding:
            musiclist[0] += b'=' * missing_padding
        self.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.title
        print self.singer
        print self.starttime
        print self.article
        print self.musicurl


#test a best ear url
page = urllib.urlopen(earurl)
responsebody = page.read()
pa = EarPageAnalysis()
pa.analysis(responsebody)
pa.showInfo()
pa.saveMusic()

  

  简单的解析结果如下:

    

 

    音乐也下载成功了;

转载于:https://www.cnblogs.com/weixliu/p/4041530.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 仿iOS单页下载页面源码是指根据iOS系统中的下载页面布局和功能设计,实现一个类似的单页下载页面。以下是一个简单的仿iOS单页下载页面源码的示例: HTML部分: ``` <!DOCTYPE html> <html> <head> <title>iOS下载页面</title> <style> body { background-color: #F0F0F0; font-family: Arial, sans-serif; } .container { width: 320px; margin: 0 auto; padding: 20px; background-color: #FFFFFF; border-radius: 10px; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2); } h1 { text-align: center; font-size: 24px; margin-bottom: 20px; } .button { background-color: #007AFF; color: #FFFFFF; border: none; padding: 10px 20px; font-size: 16px; border-radius: 8px; cursor: pointer; } .button:hover { background-color: #0056b3; } </style> </head> <body> <div class="container"> <h1>下载APP</h1> <p>点击以下按钮下载最新版本:</p> <a href="app_download_link" class="button">立即下载</a> </div> </body> </html> ``` 以上源码中的HTML部分定义了一个简单的下载页面布局,包含一个标题、一段文字描述以及一个下载按钮链接。CSS部分设置了页面的样式,包括背景颜色、字体和按钮样式。 在实际使用中,你需要将"app_download_link"替换为你的APP下载链接。此外,你还可以根据个人需求进行样式的调整,例如更改背景颜色、按钮颜色等。 注意,这只是一个简单的示例,实际实现iOS单页下载页面可能还需要其他功能和交互,可以根据具体要求进行开发和完善。 ### 回答2: 仿iOS单页下载页源码是指模仿苹果iOS系统的下载页面,并编写相应的源代码。单页下载页是指在一个页面上实现全部的下载功能,即用户在该页面上可以完成文件的下载操作。 首先,要实现一个仿iOS的界面,可以使用前端框架如Bootstrap或者Vue.js等,这些框架提供了丰富的UI组件,可以很容易地实现iOS的风格。 其次,要实现下载功能,可以使用JavaScript编写相关的代码。在用户点击下载按钮时,触发JavaScript函数,实现文件的下载逻辑。可以使用XMLHttpRequest对象发送请求,并设置responseType为"blob",以获取文件的二进制数据。获取到数据后,可以创建一个链接,将数据绑定到链接上,并设置链接的属性为download属性,以实现文件的自动下载。 另外,为了提高用户体验,还可以在界面上显示下载进度。可以通过监听XMLHttpRequest的onprogress事件,获取下载进度的相关信息,并更新到界面上。 除了基本的下载功能外,还可以在页面中添加其他交互元素。例如,可以添加一个进度条来表示文件的下载进度,用户可以通过拖动进度条来控制下载进度;或者添加一个暂停按钮,用户可以点击暂停按钮来暂停当前的下载操作,并在需要时恢复下载。 总之,仿iOS单页下载页源码的编写需要结合前端技术来实现,并考虑到用户体验和功能的完整性。希望以上回答对您有所帮助。 ### 回答3: 仿IOS单页下载页源码的实现可以参考以下步骤: 1. 设计页面布局:仿IOS的下载页通常有一个应用图标、应用名称、应用描述、下载按钮以及评分等元素。可以使用HTML和CSS来设计页面布局,确保页面风格与IOS风格一致。 2. 获取应用信息:通过后端API或者静态数据,获取要展示的应用的相关信息,如应用图标、名称、描述和评分等。 3. 展示应用信息:在页面上展示获取到的应用信息,将应用图标、名称、描述和评分等信息分别放置在相应的位置。 4. 实现下载功能:在页面上添加下载按钮,通过JavaScript来实现下载功能。可以使用原生JavaScript或者框架(如jQuery)来进行相关操作。当用户点击下载按钮时,触发下载事件。 5. 响应用户操作:根据用户下载行为,可以添加一些响应事件。例如,可以在下载按钮被点击后显示下载进度条或者提示用户下载成功。 6. 页面样式优化:为了更好地模仿IOS风格,可以对页面样式进行进一步优化,如文字字号、颜色、排列方式等设定。 7. 调试和测试:在实现以上功能后,进行调试和测试确保页面的功能正常运行,能够正确展示应用信息并实现下载功能。 总结: 通过HTML、CSS和JavaScript的组合,可以实现一个仿IOS单页下载页的源码。关键是设计页面布局、获取应用信息、展示应用信息、实现下载功能、响应用户操作、页面样式优化以及调试和测试等环节。实现后的页面可以在浏览器中运行并展示IOS风格的下载页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值