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
Bản chất như sau :
Request :
GET http://s157487939.onlinehome.us/downloadlink.php?songid=193117&code=767782bf26e5c1629b8b1f8d72e7205a&time=1168395782 HTTP/1.1
Accept: */*
User-Agent: Windows-Media-Player/11.00.00.4715
UA-CPU: x86
Accept-Encoding: gzip, deflate
Proxy-Connection: Keep-Alive
Host: s157487939.onlinehome.us
Response :
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Wed, 10 Jan 2007 02:06:40 GMT
Content-Type: video/x-ms-wmv; charset=utf-8
Cache-Control: private
Server: Apache/1.3.33 (Unix)
Pragma: public
X-Powered-By: PHP/4.4.4
Via: 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 :
Request :
GET http://s157487939.onlinehome.us/downloadlink.php?songid=193117&code=767782bf26e5c1629b8b1f8d72e7205a&time=1168395782 HTTP/1.1
Accept: */*
Accept-Language: vi-VN,en-us;q=0.5
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-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.us
Proxy-Connection: Keep-Alive
Response :
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Wed, 10 Jan 2007 02:13:56 GMT
Content-Type: video/x-ms-wmv; charset=utf-8
Cache-Control: private
Server: Apache/1.3.33 (Unix)
Pragma: public
X-Powered-By: PHP/4.4.4
Via: 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
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!