- 论坛徽章:
- 0
|
经过分析和讯的网页信息,和讯是通过COOKIE防止非法外链,而真正影响音乐文件下载的COOLIE是由SetPlayState.js脚本生成的,原代码如下:- //设置播放状态Cookie值。
- function SetPlayState()
- {
- var cookieName = "HEXUN_COM_MEDIA_PLAYSTATE";
- var curCookie = cookieName + "=1;path=/;domain=hexun.com";
- document.cookie = curCookie;
- }
- SetPlayState();
复制代码 那么在下载音乐文件的时候,需要在HTTP请求中加入这个COOKIE。
以ID号为5692541音乐为例:
它的播放网页为:
http://fangchuanqian.music.hexun.com/M5692541.html
经分析网页代码,它的网页播放器链接为:
http://music.hexun.com/PlayMedia ... 692541&FileUrl=
再分析能发现,真正生成MP3实际下载地址的链接为:
http://homemusic.tool.hexun.com/ ... 692541&FileUrl=
向“http://homemusic.tool.hexun.com/ ... 692541&FileUrl=”发送请求,并在请求中加入COOKIE信息,即可正常下载音乐文件。
写了一个简单的按音乐的ID号下载的代码:- #!/usr/bin/perl
- use strict;
- use warnings;
- use LWP::UserAgent;
- use LWP::ConnCache;
- local $| =1;
- my @mp3_ID = ('5692541','5597643');
- my $ua = LWP::UserAgent->new;
- my $conncache = new LWP::ConnCache;
- $ua->conn_cache($conncache);
- my @head = ('Cookie'=>'HEXUN_COM_MEDIA_PLAYSTATE=1'); #将COOLIE加入GET请求头
- print "\n Download begin ...\n\n";
- foreach my $id (@mp3_ID) {
- my $res1 = $ua->get("http://homemusic.tool.hexun.com/PM.aspx?CID=1&MID=$id&FileUrl=");
- my $html = $res1->as_string;
- if ($html =~ /欢迎访问.*?和讯音乐个人门户/) {
- print "ID $id is error!\n";
- }
- else {
- my ($mp3_url) = ($html =~ /A HREF="(.*?)"/i);
- print " Downloading $id.mp3 ... ";
- my $res2 = $ua->get($mp3_url,@head);
- if ($res2->is_success) {
- open(my $fp, ">:raw", "$id.mp3");
- print $fp $res2->content;
- close $fp;
- print "OK\n";
- }
- else { print "Failed!\n"; }
- }
- }
- print "\n All downloaded!\7";
- <STDIN>;
复制代码 可以通过从和讯的网页中批量提取音乐ID,加入@mp3_ID中,以实现批量下载。 |
|