Tạm thời phần 3 tôi chưa viết (chưa có hứng, và phần đó không hay lắm). Phần 1 và phần 2 bạn có thể tìm thấy ở đây :
Phần 1 : link trực tiếp
Phần 2 : mã hóa link nhạc phía client
Phần này tôi sẽ trình bày về cách sử dụng cookie và cách viết robots sử dụng cookie, demo phần này là trang web http://muzic9.com. Theo nguyện vọng của một số bạn và anh zik tôi sẽ public toàn bộ code đi kèm luôn.
Trước khi đi vào chi tiết, để có thể hiểu rõ hơn về bản chất vấn đề bạn nên tham khảo các bài viết sau :
Bài 3: Tấn công qua coookies của HYXD
Các bài basic hack trong blog của tôi (các bạn chú ý hiểu bản chất là chính)
Nếu có khả năng đọc Tiếng Anh bạn nên đọc và tìm hiểu về HTTP : HTTP là gì ? nó hoạt động thế nào ? ...
Và nếu bạn có ý định lập trình thì bạn cần phải biết một ngôn ngữ lập trình (tôi dùng C#), để cho code ngắn ngọn và linh động bạn nên sử dụng regular expression khi code.
Bắt đầu nào !!!
Công cụ : trình duyệt, nếu pro hơn một chút thì dùng 1 cái HTTP editor
Ví dụ ta cần lấy link download bài hát : Hit The Lights
URL : http://muzic9.com/index.php?c=song&songid=193117
Để ý link ta thấy nếu lấy được link 1 bài thì có thể lấy được tất cả các link khác thông qua parameter songid của URL.
Bước 1 : view source URL trên ta tìm được đoạn :
<embed width="300" height="70" volume="-300" showcontrols="1" playcount="2" autostart="1" showstatusbar="1" name="MediaPlayer1" src="http://s157487939.onlinehome.us/downloadlink.php?songid=193117&code=09a2c700a44291a85de8cec292e21627&time=1168394264" pluginspage="http://www.microsoft.com/Windows/MediaPlayer/" type="application/x-mplayer2"/>
Trong đó có 1 cái url, nếu bạn chạy cái URL cùng trình duyệt vừa mở cái link trên bạn sẽ nghe được nhạc, nếu trình duyệt là Firefox bạn có thể save file đó lại và trong đó bạn sẽ thấy URL thật hoặc nếu dùng HTTP Editor bạn sẽ rõ hơn:
mms://a1571.v85192.c8519.g.vm.akamaistream.net/7/1571/8519/1138783253/download.musicnow.com/$b401efa4f816f36408ce931bca148190/premium/075/596/076661/075596076661_1_1.wma
mms://a1571.v85192.c8519.g.vm.akamaistream.net/7/1571/8519/1138783253/
download.musicnow.com/$b401efa4f816f36408ce931bca148190/premium/075/596/076661/075596076661_1_1.wma
Bản chất như sau :
Request :
GET http://s157487939.onlinehome.us/downloadlink.php?songid=193117&code=767782bf26e5c1629b8b1f8d72e7205a&time=1168395782 HTTP/1.1Accept: */*User-Agent: Windows-Media-Player/11.00.00.4715UA-CPU: x86Accept-Encoding: gzip, deflateProxy-Connection: Keep-AliveHost: s157487939.onlinehome.us
Response :
HTTP/1.1 200 OKTransfer-Encoding: chunkedDate: Wed, 10 Jan 2007 02:06:40 GMTContent-Type: video/x-ms-wmv; charset=utf-8Cache-Control: privateServer: Apache/1.3.33 (Unix)Pragma: publicX-Powered-By: PHP/4.4.4Via: 1.1 civ-cache1 (NetCache NetApp/5.5R5) 105<ASX VERSION="3.0"><Entry><ref href="mms://a1571.v85192.c8519.g.vm.akamaistream.net/7/1571/8519/1138783253/download.musicnow.com/$b401efa4f816f36408ce931bca148190/premium/075/596/076661/075596076661_1_1.wma" temp_href="mms://a1571.v85192.c8519.g.vm.akamaistream.net/7/1571/8519/1138783253/download.musicnow.com/$b401efa4f816f36408ce931bca148190/premium/075/596/076661/075596076661_1_1.wma" /></Entry></ASX> 0
HTTP/1.1 200 OKTransfer-Encoding: chunkedDate: Wed, 10 Jan 2007 02:06:40 GMTContent-Type: video/x-ms-wmv; charset=utf-8Cache-Control: privateServer: Apache/1.3.33 (Unix)Pragma: publicX-Powered-By: PHP/4.4.4Via: 1.1 civ-cache1 (NetCache NetApp/5.5R5)
105<ASX VERSION="3.0"><Entry><ref href="mms://a1571.v85192.c8519.g.vm.akamaistream.net/7/1571/8519/1138783253/
download.musicnow.com/$b401efa4f816f36408ce931bca148190/premium/075/596/076661/075596076661_1_1.wma" temp_href="mms://a1571.v85192.c8519.g.vm.akamaistream.net/7/1571/8519/1138783253/
download.musicnow.com/$b401efa4f816f36408ce931bca148190/premium/075/596/076661/075596076661_1_1.wma" /></Entry></ASX>
0
Cũng URL trên nhưng khi request lần khác :
GET http://s157487939.onlinehome.us/downloadlink.php?songid=193117&code=767782bf26e5c1629b8b1f8d72e7205a&time=1168395782 HTTP/1.1Accept: */*Accept-Language: vi-VN,en-us;q=0.5UA-CPU: x86Accept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)Host: s157487939.onlinehome.usProxy-Connection: Keep-Alive
HTTP/1.1 200 OKTransfer-Encoding: chunkedDate: Wed, 10 Jan 2007 02:13:56 GMTContent-Type: video/x-ms-wmv; charset=utf-8Cache-Control: privateServer: Apache/1.3.33 (Unix)Pragma: publicX-Powered-By: PHP/4.4.4Via: 1.1 civ-cache1 (NetCache NetApp/5.5R5) bf <ASX VERSION="3.0"><Entry><ref href="http://wma.muzic9.com/musicfile.cfm?mid=193117&code=767782bf26e5c1629b8b1f8d72e7205a&now=1168395782" /></Entry></ASX> 0
HTTP/1.1 200 OKTransfer-Encoding: chunkedDate: Wed, 10 Jan 2007 02:13:56 GMTContent-Type: video/x-ms-wmv; charset=utf-8Cache-Control: privateServer: Apache/1.3.33 (Unix)Pragma: publicX-Powered-By: PHP/4.4.4Via: 1.1 civ-cache1 (NetCache NetApp/5.5R5)
bf <ASX VERSION="3.0"><Entry><ref href="http://wma.muzic9.com/musicfile.cfm?mid=193117&code=767782bf26e5c1629b8b1f8d72e7205a&now=1168395782" /></Entry></ASX>
Vậy là ở lần sau không được, nguyên nhân : secssion trên server bị time out, chính là ở tham số time.
Cũng qua phần trên tôi nhận thấy, musiz9 không cần request lại header mà vẫn lấy được link. (lần trước thì không phải thế, ko nhớ rõ lắm, hôm nay post bài mới thấy là không cần, tôi sẽ demo cái request lại cookie ở site khác vậy).
Vậy như trên đã phân tích thì ta cần code như thế nào ? Trong đoạn code sau đây tôi vẫn Request cả cookie mà trang trả về cho nó tổng quát, vì nó áp dụng được cho rất nhiều trang khác.
private string GetLinkMuzic9New(String URL){ //http://muzic9.com/index.php?c=song&songid=193164 String link=""; String header=""; try { header = GetHtmlHeader(URL); string regCode ="(?<=Set-Cookie:\\s+).*(?=\\"; Regex theRegex = new Regex(regCode,RegexOptions.IgnoreCase); MatchCollection MatchResult = theRegex.Matches(header); foreach (Match match in MatchResult) { header ="Cookie: "+match.Value; break; } } catch { header ="Có lỗi xảy ra hoặc địa chỉ không đúng."; return header; } try { link = kikicoco.GetHtmlContent3(URL,header); string regCode ="(?<=play_wma\\(').*(?=\\'\\))"; Regex theRegex = new Regex(regCode,RegexOptions.IgnoreCase); MatchCollection MatchResult = theRegex.Matches(link); foreach (Match match in MatchResult) { link =match.Value; break; } } catch { link ="Có lỗi xảy ra hoặc địa chỉ không đúng."; return link; } try { link = kikicoco.GetHtmlContent3(link,header); string regCode ="(?<=href\\=\\\").*(?=\\\")"; Regex theRegex = new Regex(regCode,RegexOptions.IgnoreCase); MatchCollection MatchResult = theRegex.Matches(link); foreach (Match match in MatchResult) { link =match.Value; break; } } catch { link ="Có lỗi xảy ra hoặc địa chỉ không đúng."; return link; } if (link!="") link = "<b>Download link : </b><a href="+link+" target=blank>"+link+"</a><br>"; else link="Có lỗi xảy ra hoặc địa chỉ không đúng định dạng, bạn nên tham khảo ở phía dưới."; return link;}
public String GetHtmlHeader(string inputUrl){ string outputString=""; try { WebRequest myRequest = WebRequest.Create(inputUrl); WebResponse myResponse = myRequest.GetResponse(); outputString = myResponse.Headers.ToString(); } catch { outputString="Có lỗi xảy ra!"; } return outputString;}public String GetHtmlContent(string inputUrl){ StreamReader streamReader=null; string outputString=""; try { WebRequest myRequest = WebRequest.Create(inputUrl); WebResponse myResponse = myRequest.GetResponse(); streamReader =new StreamReader(myResponse.GetResponseStream(),Encoding.UTF8); outputString = streamReader.ReadToEnd( ); streamReader.Close( ); } catch { outputString=""; } //Response.Write(outputString); return outputString;}
public static string GetHtmlContent3(string url, string headers){ HttpWebRequest req =null; try { req = (HttpWebRequest) HttpWebRequest.Create(url); } catch (Exception err) { } if (headers.Length > 0) { string[] lines = headers.Split('\n'); foreach (string line in lines) { int pos = line.IndexOf(':'); if (pos != -1) { string header = line.Substring(0, pos).Trim(); string headerValue = line.Substring(pos + 1).Trim(); try { req.Headers.Add(header, headerValue); } catch (ArgumentException) { } } } } HttpWebResponse resp = null; try { resp = (HttpWebResponse) req.GetResponse(); } catch (WebException err) { } catch (Exception err) { } Stream rcvStream = resp.GetResponseStream(); string respContent=""; byte[] respBytes = new byte[10240]; int byteCount; do { byteCount = rcvStream.Read(respBytes, 0, 10240); respContent += Encoding.ASCII.GetString(respBytes, 0, byteCount); } while (byteCount > 0); resp.Close(); rcvStream.Close(); return respContent;}}
Các đoạn code này vẫn hoạt động bình thường, nếu site có thay đổi tôi hy vọng bạn đã hiểu vấn đề và có thể sửa lại hoặc là có thể qua bài viết này bạn có thể viết các chương trình download các site khác giống như site : http://www.guru.net.vn/media.aspx . Tôi cũng có ý định viết các chương trình offline nhưng hiện tại mới viết được một số site, sau khi viết xong sẽ public toàn bộ để các bạn sử dụng và phát triển. Bài này vẫn chưa thể hiện hết cách khai thác cookie, tôi sẽ viết tiếp demo ở bài sau.
Mong các bạn góp ý thêm!