Phần 1 : link trực tiếp
Phần 2 tôi sẽ trình bày về mã hóa link nhạc phía client với điển hình là trang nhacso.net.
Vì sao lại gọi là phía client ? vì nó được giải mã bằng javascript. Kiểu này chỉ có tác dụng lòe bịp thôi 
Cách này hướng dẫn trên quan điểm để có thể lập trình lấy tự động được. Còn lấy link ngay thì có thể dùng add-on của Firefox (tham khảo tại đây)
* Kiến thức yêu cầu : HTML, JavaScript, một ngôn ngữ lập trình bạn biết (ở đây tôi dùng C#)
* Công cụ : Trình duyệt
* Cách thức : view-source
Mục tiêu lấy link bài hát : Khám phá của The Wall
URL : http://nhacso.net/Music/Song/Rock%2DViet/2006/12/05F61E9E/
Đầu tiên bạn cũng sẽ tư duy giống như phần 1, bạn view source tìm đoạn object media trong cặp thẻ <object> hoặc <embed>. Bạn sẽ không tìm thấy đoạn đó mà chứa link nhạc, nhưng bạn sẽ tìm thấy đoạn sau :
<div id="vietkar9">
<span></span><span></span><span></span>
<script language="javascript" type="text/javascript">
document.write(showPLayerz('112`112`118`61`50`50`53`52`51`49`53`55`56`49`52`53`57`
49`52`58`51`50`80`120`118`108`102`50`85`114`102`110`89`108`104`119`50`87`114`
113`106`75`114`115`98`87`107`104`90`100`111`111`98`87`107`104`79`100`118`119`
86`100`119`120`117`103`100`124`50`78`107`100`112`98`83`107`100`98`98`98`87`
107`104`98`90`100`111`111`98`98`98`87`107`104`98`90`100`111`111`8`98`98`71`
108`107`100`121`108`113`100`98`98`98`51`58`49`122`112`100`'));
var l = self.location + ''; l = l.split('/Music/Song/'); l = l[l.length-1];
var song_url = l;
</script>
</div>
Đây chính là đoạn code hiển thị đoạn object Media player. Tiếp theo bạn tìm hàm showPLayerz xem nó thế nào ? Hàm này nằm trong file javascript đi kèm với trang, địa chỉ file : http://nhacso.net/library/nhacso.js (tôi bỏ đi đoạn không quan trọng cho đỡ dài)
function showPLayerz(link)
{
link = dd(link);
var height=60;
var addOn = '<div style="float: left; background: #000; border: 4px solid #000" align="center">';
var e = link.split('.'); e = e[e.length-1];
var top100 = '';
var selfL = ' ' + self.location;
selfL = selfL.split('/');
selfL = selfL[selfL.length-2];
if( top100.indexOf(selfL) == -1 )
....................................................
return addOn + HTML + '</div>';
}
Vậy là tham số link của hàm đã bị mã hóa và được giải mã bằng hàm : dd(link)
link = dd(link);
Hàm dd(link) :
function dd(linkz)
{
var url = linkz.split('`');
var key = findObj('vietkar9').getElementsByTagName('span'); key = key.length;
var link = '';
for(var i=0; i<=url.length - 2; i++)
{
link = link + String.fromCharCode(parseInt(parseInt(url[i])- key));
}
return link;
}
Cái hàm này có nhiệm vụ decode ra link thật, nó hoạt động như sau :
Đầu tiên nó đếm số cặp thẻ <span> trong cặp thẻ <div> có id là vietkar9, các bạn lưu ý là cái số cặp thẻ <span> được sinh ngẫu nhiên. Như ví dụ bên dưới là 3, chính là tham số key ở trên.
<div id="vietkar9">
<span></span><span></span><span></span>
Sau đó nó decode lại dãy số loằng ngoằng ở trên dựa trên tham số key và hàm parseInt:
link = link + String.fromCharCode(parseInt(parseInt(url[i])- key));
Hàm dd() này có thể viết lại trên C# như sau :
public string decode(string codeString,int key)
{
Regex theRegex = new Regex(" |` |`");
string link="";
int temp;
try
{
foreach (string subString in theRegex.Split(codeString))
{
temp = Convert.ToInt32(subString);
link = link +Convert.ToChar(temp-key);
}
}
catch
{
}
return link;
}
Và đây là hàm lấy link code kiểu "trâu bò" (có cách khác trong ngắn và văn minh hơn
, tôi sẽ nói sau) nhưng dễ hiểu cho các bạn mới bắt đầu :
public string GetSongNhacso(string URL)
{
//input : http://nhacso.net/Music/Song/Rock%2DViet/2006/12/05F61E9E/
int start,stop;
string outurl="";
StreamReader streamReader =null;
if (URL.IndexOf("Music/Song")>0)
{
//http://nhacso.net/Music/Song/Rock%2DViet/2006/12/05F61E9E/
int key=0;
string url= URL.Trim();
try
{
WebRequest myRequest = WebRequest.Create(url);
WebResponse myResponse = myRequest.GetResponse();
streamReader =new StreamReader(myResponse.GetResponseStream(),Encoding.UTF8);
string outputString;
outputString = streamReader.ReadToEnd( );
//Tim key = so cap the <span> trong div co id = vietkar9
//start =outputString.IndexOf("Music/Vietkar9");
start =outputString.IndexOf("vietkar9")+"vietkar9".Length+4;
stop =outputString.IndexOf("script",start)-3;
key =(stop-start)/13;
//tim doan "showPLayerz"
start =outputString.IndexOf("showPLayerz")+ "showPLayerz".Length+2;;
stop =outputString.IndexOf("))",start)-2;
outurl =outputString.Substring(start,stop-start);
outurl = decode(outurl,key);
return outurl;
}
catch (Exception ex)
{
streamReader.Close( );
lblError.Text="Có lỗi rồi ! Không tìm thấy kết quả!"+ex.Message;
}
}
else
{
lblError.Text="Sai URL rồi !";
}
return outurl;
}
Kết quả :
mms://210.245.126.170/Music/RockViet/TongHop_TheWall_TheLastSaturday/Kham_Pha___The_Wall___The_Wall___Dihavina___07.wma
Lấy theo link theo nghệ sĩ và album bạn có thể thao khảo bài Lấy link mms từ nhacso.net
Lập trình cũng tương tự, tôi sẽ nói rõ hơn ở phần 3.
Hy vọng với bài trên bạn đã có thể tự viết cho mình chương trình lấy link trang nhacso.net giống như 2 trang http://media.ajaxviet.com và http://nhacso.ajaxviet.com
Phần3 : Lập trình với windows media playlist.