+ -
当前位置:首页 → 问答吧 → AJAX获取百度MP3下载的例子(百度比较变态的加密方法)

AJAX获取百度MP3下载的例子(百度比较变态的加密方法)

时间:2009-11-19

来源:互联网

最近看到百度MP3提供链接下载,但又是比较变态的加密方法,弄了一段小程序还是来获取他
演示页:http://yuepin.com/Explore/song.php
以下是源码
[php]
<?php
($_GET['key'] == "") ? $key = "love" : $key = $_GET['key'];
$url = "http://mp3.baidu.com/m?f=ms&rf=idx&tn=baidump3&ct=134217728&lf=&rn=&word=".$key."&lm=2";

if($_GET['action'] == "getxml"){
        $matchs = getContent($url);
        $d = format($matchs);
        $d = formatXML($d);
        outXML($d);
}elseif($_GET['action'] == "geturl"){
        $d = geturl($_GET['url']);
        outXML("<data><![CDATA[".$d."]]></data>");
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>获取百度歌曲</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link rel="stylesheet" type="text/css" href="images/style.css" />
<style type="text/css">
#outdata{ width:300px; float:left; }
#outurl{ width:500px; float:right; }
li {list-style-type:decimal;}
</style>
<script type="text/javascript">
var xmlHttp = createXmlHttpRequestObject();
var ServerPage = "<?php echo $_SERVER['PHP_SELF']; ?>";
function createXmlHttpRequestObject(){ //创建 XML Http Request 对象
                 try{
                        xmlHttp = new XMLHttpRequest();
                          if(xmlHttp.overrideMimeType)
                                          xmlHttp.overrideMimeType("text/xml");
                 }
                 catch(e){
                         var xmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
                                                                                          "MSXML2.XMLHTTP.5.0",
                                                                                          "MSXML2.XMLHTTP.4.0",
                                                                                          "MSXML2.XMLHTTP.3.0",
                                                                                          "MSXML2.XMLHTTP",
                                                                                          "Microsoft.XMLHTTP");
                         for(var i=0;i<xmlHttpVersions.length && !xmlHttp; i++){
                                 try{
                                         xmlHttp = new ActiveXObject(xmlHttpVersions);
                                 }
                                 catch (e) {}
                         }
                 }

        if(!xmlHttp)  alert("错误! 创造 XML Http 请求对象失败!");
                else  return xmlHttp;
}
function geturl(){  //使用 XML Http Request 对象创建异步HTTP请求
var key = getID('key').value;
var QueryStr = "?key="+key+"&action=getxml&rnd="+Math.random();
loading("正在载入数据请稍候...");
datas = "";
if(key != "" && typeof(key) !="undefined"){
        if(xmlHttp.readyState == 4 || xmlHttp.readyState == 0){
                var url = ServerPage + QueryStr;
                xmlHttp.open("GET",url,true);
        //        xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                xmlHttp.setRequestHeader("Content-Type","text/xml;charset=gb2312;");
                xmlHttp.onreadystatechange = outurl;
                xmlHttp.send(null);
        }
        else{
                setTimeout('geturl()',1000);
        }
  }
}
function outurl(){ //获取服务器返回的消息
var outmsg = "";
  if(xmlHttp.readyState == 4){
         if (xmlHttp.status == 200){
                  var response = xmlHttp.responseText;
                  if(response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 || response.length == 0)
                    throw(response.length == 0 ?"Void serer response.":response);
                  var responseXml = xmlHttp.responseXML;
                  var res = responseXml.documentElement;
                try{
                var music = res.getElementsByTagName("music");
                var datas = "";
                var url = "";
                var sname = "";
                datas += "<ul>\n";

        for(var i=0;i<music.length;i++){
                url = getTag(res,i,"urls");
                sname = getTag(res,i,"names");
                datas +=  '<li><a href="#" onClick="javascript:getSongUrl(\'' +url+ '\',\'' +sname+ '\')" >' +sname+ "</a></li>\n";
          }
                datas += "</ul>\n";
                 getID("outdata").innerHTML = datas;
         }catch(e){
                 getID("showmsg").innerHTML = "你所请求的数据不存在";
         }
        }
        else{
                  outmsg = "返回HTTP请求失败!";
          }
                   getID("showmsg").innerHTML = "";
  }
}
function getSongUrl(url,a){  //使用 XML Http Request 对象创建异步HTTP请求
loading("正在载入数据请稍候...");
if(url != "" && typeof(url) !="undefined"){
        if(xmlHttp.readyState == 4 || xmlHttp.readyState == 0){
                var url = ServerPage + "?action=geturl&url="+encodeURIComponent(url)+"&rnd="+Math.random();
                xmlHttp.open("GET",url,true);
        //        xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        //        xmlHttp.setRequestHeader("Content-Type","text/xml;charset=gb2312");
                xmlHttp.onreadystatechange = outSongUrl;
                xmlHttp.send(null);
                getID('songname').innerHTML = a;

        }
        else{
                setTimeout('getSongUrl()',1000);
        }
  }
}
function outSongUrl(){ //获取服务器返回的消息
var outmsg = "";
  if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
                  var response = xmlHttp.responseText;
                  if(response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 || response.length == 0)
                    throw(response.length == 0 ?"Void serer response.":response);
                    var responseXml = xmlHttp.responseXML;
                        var res = responseXml.documentElement;
                    var sondata = getTag(res,0,"data");
                    eval(sondata);
        }else{
                  outmsg = "返回HTTP请求失败!";
                    getID("showmsg").innerHTML = "";
  }
}
function getTag(response,i,objTagName){
        try{
                if(typeof(response.getElementsByTagName(objTagName).firstChild.data) != "undefined")
                var nodeValue = response.getElementsByTagName(objTagName).firstChild.data;
        }catch(e){
                try{
                        if(typeof(response.getElementsByTagName(objTagName).firstChild.nodeValue) != "undefined")
                        var nodeValue = response.getElementsByTagName(objTagName).firstChild.nodeValue;
                }
                catch(e){
                        var        Value = "错误!XML标签["+ objTagName +"]不存在";
                                getID("showmsg").innerHTML = Value;
                        }
        }
        return nodeValue;
}
function loading(a){
        var msg = "<img src='../images/loading.gif'>" +a;
        if(typeof(a) != "undefined" && a != "") a = msg;
        else a = "";
                getID("showmsg").innerHTML = a;
}
function getID(a){
        return window.document.getElementById(a);
}
</script>
</head>
<body>
<form id="form1" name="form1" action="" method="post">
        请输入歌名或歌手名:<input type="text" id="key" name="key" value="" />
        <input type="button" name="button1" value="获取" onClick="javascript:geturl();" />
</form>
<div id="showmsg" style="z-index:100;position:absolute;top:2px;right:2px;"></div>
<div id="outdata"></div>
<div id="outurl">
<a id="urln" href="" onmousedown="sd(event,-1);" target="_blank"></a>
<a id="urla" href="" onmousedown="sd(event,0)" target="_blank"><span id="songname"></span></a>
<div id="more"></div><div id="mu"></div><div id="adv"></div>
</div>
</body>
</html>
<?php
/////////////         function  /////////////////////////////
function geturl($url){
  if($url != ""){
        $url = str_replace(" ","+",$url);
        $fp = file_get_contents($url);
        //$fp = iconv("gb2312","utf-8",$fp);
        $tag = "/<script>(.*)<\/script>/isU";
        preg_match($tag,$fp,$m);
        return $m[1];
  }
}
function getContent($url){
        $r = file_get_contents($url);
        //$r = iconv("gb2312","utf-8",$r);
        $tag = "/<a href=\"(.*)\" title=\"(.*)\" onclick=\"return ow.*\"+>(.*)<+\/a>/iSU";
        preg_match_all($tag,$r,$matchs,PREG_PATTERN_ORDER);
        return $matchs;
}
function format($array){
        $d = false;
        if(is_array($array)){
                $url = $array[1];
                $title = $array[2];
                $name = $array[3];
                $rows = count($url);
                for($i=0;$i<$rows;$i++){
                        $d[] = array($url[$i],$title[$i],strip_tags($name[$i]));
                }
        }
        return $d;
}
function formatXML($array){
        $d = "";
        if(is_array($array)){
                foreach($array as $v){
                        $d .= "<music>\n";
                        $d .= "<urls><![CDATA[".trim($v[0])."]]></urls>\n";
                        $d .= "<names><![CDATA[".trim($v[2])."]]></names>\n";
                        $d .= "</music>\n";
                }
        }
        return $d;
}
function outxml($data,$language = "gb2312"){
        header("content-type:text/xml");
        header("Expires: Wed,23 Dec 1980 00:30 GMT");
        header("Last-Modified: ".gmdate("D, d M Y H:i:s")."GMT");
        header("Cathe-Control: no-cache,must-revalidate");
        header("Pragma: no-cache");
        $output = '<?xml version="1.0" encoding="'.$language.'"?>'."\n";
        $output .= '<root>'."\n";
        $output .= $data;
        $output .= '</root>';
  echo  $output;
  exit;
}
?>
[/php]

作者: E网逍遥   发布时间: 2009-11-19

效果很好。
不过建议采集者尽量不要碰百度及GG

作者: spser   发布时间: 2009-11-19

有办法绕开百度和GG的。。。。

看分词算法怎么写

作者: guxiaochuan   发布时间: 2009-11-19

好 学习了 支持

作者: szrq   发布时间: 2009-11-20