DHT抓取程序開源地址:https://github.com/h31h31/H31DHTDEMO
數據處理程序開源地址:https://github.com/h31h31/H31DHTMgr
.
--------------------------------------------------------------------------------------------------------------------
在DHT網絡獲取的網絡數據后,需要進行播放功能,目前只有迅雷雲播放功能比較強大,其它各類小網站都是從迅雷網站進行數據的抓取分析功能,
接下來我們就主要介紹如果從迅雷網站簡單的抓取視頻播放地址來進行播放功能.
1.先看軟件功能實現界面:
在獲取網址后我們可以用播放器來進行播放,百度影音和VLC播放器可以查看,也可以進行拖放,比起網上很多網站都不支持拖放功能好了很多,
測試了迅雷看看不行,QQ影音也不行,其它的播放器沒有測試.
可以進行拖動播放.
VLC media player播放界面:
2.介紹如何進行迅雷網站登錄抓取視頻流程:
1)主要先通過抓包來分析登錄流程,第一包主要分析是否有驗證碼的問題http://login.xunlei.com/check?u=
通過分析返回的Header數據,如果里面有check_result=1說明需要進行驗證碼的處理工作.

/// <summary> /// 輸入用戶名后就需要檢測是否輸入驗證碼 /// </summary> private void txtName_Leave(object sender, EventArgs e) { string url = "http://login.xunlei.com/check?u=" + txtName.Text + "&t=" + Convert.ToString(DateTime.Now.ToUniversalTime()); string hash1 = Http.GetHtmlHeader(url, cookie); int temp1 = hash1.IndexOf("check_result="); string logintype = hash1.Substring(temp1 + 13, 1); if (logintype == "1") { labelVery.Visible = true; vefycodTxt.Visible = true; vefycodpicbox.Visible = true; vefycodTxt.Text = ""; string codeimageurl = string.Format("http://verify2.xunlei.com/image?cachetime={0}", Convert.ToString(UNIX_TIMESTAMP(DateTime.Now))); Stream getStream = Http.GetStream(codeimageurl, cookie); vefycodpicbox.Image = Image.FromStream(getStream); } else { vefycodTxt.Text = GetBetween(hash1, "check_result=0:", ";"); labelVery.Visible = false; vefycodTxt.Visible = false; vefycodpicbox.Visible = false; } }
2)如果有驗證碼,處理

string codeimageurl = string.Format("http://verify2.xunlei.com/image?cachetime={0}", Convert.ToString(UNIX_TIMESTAMP(DateTime.Now))); Stream getStream = Http.GetStream(codeimageurl, cookie); vefycodpicbox.Image = Image.FromStream(getStream);
3)進行密碼加密

//生成密碼字串 string password = getMd5Hash2(getMd5Hash2(getMd5Hash2(txtPass.Text)) + vefycodTxt.Text.ToUpper()); /// <summary> /// md5加密 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string getMd5Hash2(string input) { byte[] buffer = MD5.Create().ComputeHash(Encoding.Default.GetBytes(input)); StringBuilder builder = new StringBuilder(); for (int i = 0; i < buffer.Length; i++) { builder.Append(buffer[i].ToString("x2")); } return builder.ToString(); }
4)進行登錄驗證

string postData = "u=" + txtName.Text + "&p=" + password + "&verifycode=" + vefycodTxt.Text + "&login_enable=1&login_hour=720"; string res1 = Http.GetHtmlPostHeader("http://login.xunlei.com/sec2login/", postData, cookie); m_userid = GetBetween(res1, "userid=", ";"); m_sessionid = GetBetween(res1, "sessionid=", ";"); m_isvip = GetBetween(res1, "isvip=", ";"); string blog = GetBetween(res1, "blogresult=", ";"); if (m_userid.Length > 0) { this.Text = "H31DHT迅雷視頻地址搜索軟件UserID:" + m_userid + " VIP:" + m_isvip; button1.Text = "退出"; txtName.Enabled = false; txtPass.Enabled = false; labelVery.Visible = false; vefycodTxt.Visible = false; vefycodpicbox.Visible = false; SaveSetting(); }

#region 公用函數 /// <summary> /// md5加密 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string getMd5Hash2(string input) { byte[] buffer = MD5.Create().ComputeHash(Encoding.Default.GetBytes(input)); StringBuilder builder = new StringBuilder(); for (int i = 0; i < buffer.Length; i++) { builder.Append(buffer[i].ToString("x2")); } return builder.ToString(); } /// <summary> /// 獲取字符串 /// </summary> public static string GetBetween(string s, string s1, string s2) { int n1, n2; n1 = s.IndexOf(s1, 0); if (n1 == -1) return ""; n1=n1+s1.Length; //開始位置 n2 = s.IndexOf(s2, n1); //結束位置 if (n2 == -1) return ""; return s.Substring(n1, n2 - n1); //取搜索的條數,用結束的位置-開始的位置,並返回 } /// <summary> /// 時間轉成Unix時間戳 /// </summary> /// <param name="dateTime"></param> /// <returns></returns> public static long UNIX_TIMESTAMP(DateTime dateTime) { return (dateTime.Ticks - DateTime.Parse("1970-01-01 00:00:00").Ticks) / 10000000; } #endregion
如果登錄成功會有一些userid,sessionid等信息返回需要使用.
5)去查詢一個磁連接復制回來進行分析視頻地址:
主要針對http://i.vod.xunlei.com/req_try_vod?url={0}&cache={1}&userid={2}&sessionid={3}&vip={4}&platform=0&from=vlist&jsonp=XL_CLOUD_FX_INSTANCEqueryBack
來構造數據分析;

/// <summary> /// 獲取磁連接播放地址 /// </summary> private void buttonGetResult_Click(object sender, EventArgs e) { string sha = txtUrl.Text; string url4 = string.Format("http://i.vod.xunlei.com/req_try_vod?url={0}&cache={1}&userid={2}&sessionid={3}&vip={4}&platform=0&from=vlist&jsonp=XL_CLOUD_FX_INSTANCEqueryBack", sha, UNIX_TIMESTAMP(DateTime.Now), m_userid, m_sessionid, m_isvip); string res5 = Http.GetHtmlPostMsg(url4, cookie); res5 = res5.Replace("dt=16", "dt=17"); txtRusult.Text = res5; string pattern = string.Format("vod_url\": \"(.*?)\","); MatchCollection usermatch = Regex.Matches(res5, pattern, RegexOptions.IgnoreCase); if (usermatch.Count >= 2 && usermatch[0].Groups[0].Value.Length >= 1) { txtVideo1.Text = usermatch[0].Groups[1].Value; txtVideo2.Text = usermatch[1].Groups[1].Value; } }
6)整個流程代碼主要通過HttpWebRequest來完成,相關類的代碼如下:

public static Stream GetStream(string URL, CookieContainer cookieContainer) { HttpWebRequest httpWebRequest; HttpWebResponse webResponse; Stream getStream; httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(URL); httpWebRequest.CookieContainer = cookieContainer; httpWebRequest.Accept = "*/*"; //httpWebRequest.ContentType = "application/x-www-form-urlencoded"; httpWebRequest.UserAgent = "User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2"; httpWebRequest.Method = "GET"; webResponse = (HttpWebResponse)httpWebRequest.GetResponse(); string header = webResponse.Headers.ToString(); getStream = webResponse.GetResponseStream(); return getStream; } public static string GetHtmlHeader(string URL, CookieContainer cookieContainer) { HttpWebRequest httpWebRequest; HttpWebResponse webResponse; Stream getStream; StreamReader streamReader; string getString = ""; httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(URL); httpWebRequest.CookieContainer = cookieContainer; httpWebRequest.Accept = "*/*"; httpWebRequest.ContentType = "application/x-www-form-urlencoded"; httpWebRequest.UserAgent = "User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2"; httpWebRequest.Method = "GET"; webResponse = (HttpWebResponse)httpWebRequest.GetResponse(); string header = webResponse.Headers.ToString(); getStream = webResponse.GetResponseStream(); streamReader = new StreamReader(getStream, Encoding.UTF8); getString = streamReader.ReadToEnd(); streamReader.Close(); getStream.Close(); httpWebRequest.Abort(); webResponse.Close(); return header; } public static string GetHtmlPostHeader(string URL, string postData, CookieContainer cookieContainer) { HttpWebRequest httpWebRequest; HttpWebResponse webResponse; Stream getStream; StreamReader streamReader; string getString = ""; httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(URL); httpWebRequest.CookieContainer = cookieContainer; httpWebRequest.Accept = "*/*"; httpWebRequest.ContentType = "application/x-www-form-urlencoded"; httpWebRequest.Referer = "http://i.xunlei.com/login.html"; httpWebRequest.UserAgent = "User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2"; httpWebRequest.Method = "Post"; byte[] byteRequest = Encoding.Default.GetBytes(postData); httpWebRequest.ContentLength = byteRequest.Length; Stream stream; stream = httpWebRequest.GetRequestStream(); stream.Write(byteRequest, 0, byteRequest.Length); stream.Close(); webResponse = (HttpWebResponse)httpWebRequest.GetResponse(); string header = webResponse.Headers.ToString(); getStream = webResponse.GetResponseStream(); streamReader = new StreamReader(getStream, Encoding.UTF8); getString = streamReader.ReadToEnd(); streamReader.Close(); getStream.Close(); httpWebRequest.Abort(); webResponse.Close(); return header; } public static string GetHtmlPostMsg(string URL, CookieContainer cookieContainer) { HttpWebRequest httpWebRequest; HttpWebResponse webResponse; Stream getStream; StreamReader streamReader; string getString = ""; httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(URL); httpWebRequest.CookieContainer = cookieContainer; httpWebRequest.Accept = "*/*"; httpWebRequest.ContentType = "application/x-www-form-urlencoded"; //httpWebRequest.Referer = "http://vod.xunlei.com/iplay.html?uvs=26792633_4_166BF1D2FD43C79F8605A78BFE0E65CD8FE775E494F79F64FB63CA6C692D71156FB80795D39CB79BC4DA348AFE399ECE96856BEAFAB89C9D7598D1AFBEAAFD5E&from=vlist&url=bt%3A%2F%2F0C8F6F3292F7049E4E76716C242A4BA0944D1466%2F2&list=all"; httpWebRequest.Referer = "http://vod.xunlei.com/iplay.html"; httpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17"; httpWebRequest.Method = "Get"; webResponse = (HttpWebResponse)httpWebRequest.GetResponse(); string header = webResponse.Headers.ToString(); getStream = webResponse.GetResponseStream(); streamReader = new StreamReader(getStream, Encoding.UTF8); getString = streamReader.ReadToEnd(); streamReader.Close(); getStream.Close(); httpWebRequest.Abort(); webResponse.Close(); return getString; }
3.使用過程中的發現問題:
1)查詢出來的播放地址,如果在播放幾次后,那個地址會失效,還需要進一步分析如何避免的問題;
2)有的播放器測試進行播放不成功,然后這個地址也會失效;
3)有些參數不明白,有些不對的地方,希望大家指教下;
希望有興趣朋友一起討論分析迅雷雲播放視頻地址的獲取問題,現提供第一版本程序下載,希望大家多多提意見!
下載程序:H31Thunder.rar
希望大家多多推薦哦...大家的推薦才是下一篇介紹的動力...