之所以寫這個,是因為本來想寫一個Youtube刷評論的工具,把登錄做出來了,後面就沒繼續做下去。 涉及到基本的HttpWatch的應用以及Fiddler的應用(Fd主要用來排查問題,通過對比 瀏覽器和vs代碼 找出問題所在!以瀏覽器為標準)。 通過HttpWatch抓包分析,我把登錄Youtube一 ...
之所以寫這個,是因為本來想寫一個Youtube刷評論的工具,把登錄做出來了,後面就沒繼續做下去。
涉及到基本的HttpWatch的應用以及Fiddler的應用(Fd主要用來排查問題,通過對比 瀏覽器和vs代碼 找出問題所在!以瀏覽器為標準)。
通過HttpWatch抓包分析,我把登錄Youtube一共分為三個階段:
1. 請求 打開錄入郵箱地址 頁面
2. 請求 回發本郵箱地址,載入郵箱賬號 頭像
3. 請求 回發本郵箱地址和密碼, 登錄Youtube
有很多的Cookie和PostData的話是 伺服器不做校驗的,也就是說重要的 Cookie和Post/Get數據並不是全部你所看到的,這個你可以後期 模擬登陸成功之後,逐個刪掉測試看是否還能登陸成功 來判斷 該參數是否必須!
上面的原理其實在做其他 網站的模擬 登錄 中也是一樣的。
大家直接看代碼吧,沒啥好講的也。
1 private void button1_Click(object sender, EventArgs e) 2 { 3 var cookieJar = new CookieContainer(); 4 CookieAwareWebClient webClient = new CookieAwareWebClient(cookieJar); 5 6 string GAPS = string.Empty; 7 string GALX = string.Empty; 8 string GoogleAccountsLocale_session = string.Empty; 9 10 string NID = string.Empty; 11 string ProfileInformation = string.Empty; 12 13 //1.第一部分init 14 string url1 = "https://accounts.google.com/ServiceLogin?sacu=1&continue=https%3A%2F%2F" 15 +"www.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26feature%3Dsign_in_button%26next%3D%252Fwatch%253Fv%253DpMUv7qmKQik%26hl%3Dzh-CN&hl=zh-CN&service=youtube";//地址 16 17 18 string srcString1 = webClient.DownloadString(url1);//解碼 19 20 //receive cookie 21 GAPS = GetCookie("GAPS", cookieJar); 22 GALX = GetCookie("GALX", cookieJar); 23 GoogleAccountsLocale_session = GetCookie("GoogleAccountsLocale_session", cookieJar); 24 25 26 //2.第二部分input email 27 webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");//採取POST方式必須加的header,如果改為GET方式的話就去掉這句話即可 28 string postString2 = "_utf8=☃" + "&bgresponse=" 29 + "&checkConnection=youtube:724:0" + "&checkedDomains=youtube" + "&continue=https://www.youtube.com/signin?action_handle_signin=true&app=desktop&feature=sign_in_button&next=%2Fwatch%3Fv%3DpMUv7qmKQik&hl=zh-CN" 30 + "&dnConn=" + "&Email=【此處填寫自己的Gmail郵箱】" + "&GALX=" + GALX + "&gxf=AFoagUVXYmSP1FoIo4SFJlAauKdrDab_0A:1465396649942" 31 + "&hl=zh-CN" + "&Page=PasswordSeparationSignIn" + "&ProfileInformation=" + "&pstMsg=1" + "&sacu=1" 32 + "&service=youtube" + "&signIn=下一步"; 33 34 35 byte[] postData2 = Encoding.UTF8.GetBytes(postString2);//編碼,尤其是漢字,事先要看下抓取網頁的編碼方式 36 string url2 = "https://accounts.google.com/AccountLoginInfo";//地址 37 38 webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");//採取POST方式必須加的header,如果改為GET方式的話就去掉這句話即可 39 byte[] responseData2 = webClient.UploadData(url2, "POST", postData2);//得到返回字元流 40 string srcString2 = Encoding.UTF8.GetString(responseData2);//解碼 41 42 GAPS = GetCookie("GAPS", cookieJar); 43 44 //本文地址:http://www.cnblogs.com/x-poior/p/5585506.html 轉載請註明,謝謝! 45 46 //3.第三部分input pw 47 // webClient.Headers.Add("Referer", "https://accounts.google.com/AccountLoginInfo"); 48 // ProfileInformation = QuMiddle(srcString2, @"name=""ProfileInformation"" type=""hidden"" value=""", @""">"); 後面排除法得出結論,該參數不是必需的, 49 50 string postString3 = "_utf8=☃" + "&bgresponse=" 51 + "&checkConnection=youtube:724:0" + "&checkConnection=youtube:398:0" 52 + "&checkedDomains=youtube" + "&checkedDomains=youtube" 53 + "&continue=https://www.youtube.com/signin?action_handle_signin=true&app=desktop&feature=sign_in_button&next=%2Fwatch%3Fv%3DpMUv7qmKQik&hl=zh-CN" 54 + "&dnConn=" + "&Email=【此處填寫自己的Gmail郵箱】" + "&GALX=" + GALX + "&gxf=AFoagUVXYmSP1FoIo4SFJlAauKdrDab_0A:1465396649942" 55 + "&hl=zh-CN" + "&Page=PasswordSeparationSignIn" + "&Passwd=【此處填寫自己的Gmail密碼】" 56 + "&PersistentCookie=yes" + "&ProfileInformation=" + "&pstMsg=1" + "&pstMsg=1" 57 + "&rmShown=1" + "&sacu=1" 58 + "&service=youtube" + "&signIn=登錄"; 59 60 61 byte[] postData3 = Encoding.UTF8.GetBytes(postString3);//編碼,尤其是漢字,事先要看下抓取網頁的編碼方式 62 string url3 = "https://accounts.google.com/ServiceLoginAuth";//地址 63 64 webClient.Method = "POST"; 65 string srcString3 = webClient.UploadString(url3, postString3); 66 67 68 //第四部分,校驗Cookie數目判斷是否成功! 69 var lastCookie = cookieJar;//註意,如果第三部分,返回的Response的Cookie的數量有>20 個的話,說明登陸成功了!Google 返回給你很多憑證,可以登錄Google大部分的產品、 70 var s2s4 = srcString3; 71 72 73 var agereg = webClient.DownloadString("https://www.youtube.com/watch?v=VYwkmp97-B4");//左邊是受年齡限制的視頻,不登陸驗證是沒法觀看下載的!!返回Html-String里含有“ytplayer.config”說明可以觀看下載! 74 75 76 }
其他的幾個幫助方法,幫助類。
/// <summary> /// 獲取Cookie的值 /// </summary> /// <param name="cookieName">Cookie名稱</param> /// <param name="cc">Cookie集合對象</param> /// <returns>返回Cookie名稱對應值</returns> public static string GetCookie(string cookieName, CookieContainer cc) { List<Cookie> lstCookies = new List<Cookie>(); Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, cc, new object[] { }); foreach (object pathList in table.Values) { SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, pathList, new object[] { }); foreach (CookieCollection colCookies in lstCookieCol.Values) foreach (Cookie c1 in colCookies) lstCookies.Add(c1); } var model = lstCookies.Find(p => p.Name == cookieName); if (model != null) { return model.Value; } return string.Empty; }
//本文地址:http://www.cnblogs.com/x-poior/p/5585506.html 轉載請註明,謝謝!
/// <summary> /// 取字元串中間 /// </summary> /// <param name="str">總字元串</param> /// <param name="str1">左邊字元串</param> /// <param name="str2">右邊字元串</param> /// <returns>中間字元串</returns> public static string QuMiddle(string str, string str1, string str2) { int leftlocation;//左邊位置 int rightlocation;//右邊位置 int strmidlength; ;//中間字元串長度 string strmid;//中間字元串 leftlocation = str.IndexOf(str1); if (leftlocation == -1) { return ""; } leftlocation = leftlocation + str1.Length;//獲取左邊字元串尾所在位置 rightlocation = str.IndexOf(str2, leftlocation);//獲取右邊字元串頭所在位置 if (rightlocation == -1 || leftlocation > rightlocation)//判斷右邊字元串是否存在於總字元串中,左邊字元串位置是否在右邊字元串前 { return ""; } strmidlength = rightlocation - leftlocation;//計算中間字元串長度 strmid = str.Substring(leftlocation, strmidlength);//取出中間字元串 return strmid;//返回中間字元串 }
CookieAwareWebClient .cs
1 public class CookieAwareWebClient : WebClient 2 { 3 public string Method; 4 public CookieContainer CookieContainer { get; set; } 5 public Uri Uri { get; set; } 6 7 public CookieAwareWebClient() 8 : this(new CookieContainer()) 9 { 10 } 11 12 public CookieAwareWebClient(CookieContainer cookies) 13 { 14 this.CookieContainer = cookies; 15 this.Encoding = Encoding.UTF8; 16 } 17 18 protected override WebRequest GetWebRequest(Uri address) 19 { 20 WebRequest request = base.GetWebRequest(address); 21 if (request is HttpWebRequest) 22 { 23 (request as HttpWebRequest).CookieContainer = this.CookieContainer; 24 (request as HttpWebRequest).ServicePoint.Expect100Continue = false; 25 (request as HttpWebRequest).UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.5 Safari/537.36"; 26 (request as HttpWebRequest).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; 27 (request as HttpWebRequest).Headers.Add(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.8,en;q=0.6,nl;q=0.4,zh-TW;q=0.2"); 28 (request as HttpWebRequest).Referer = ""; 29 (request as HttpWebRequest).KeepAlive = true; 30 (request as HttpWebRequest).AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; 31 if (Method == "POST") 32 { 33 (request as HttpWebRequest).ContentType = "application/x-www-form-urlencoded"; 34 } 35 } 36 HttpWebRequest httpRequest = (HttpWebRequest)request; 37 httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 38 return httpRequest; 39 } 40 41 protected override WebResponse GetWebResponse(WebRequest request) 42 { 43 WebResponse response = base.GetWebResponse(request); 44 String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie]; 45 46 if (setCookieHeader != null) 47 { 48 //do something if needed to parse out the cookie. 49 try 50 { 51 if (setCookieHeader != null) 52 { 53 Cookie cookie = new Cookie(); 54 cookie.Domain = request.RequestUri.Host; 55 this.CookieContainer.Add(cookie); 56 } 57 } 58 catch (Exception) 59 { 60 61 } 62 } 63 return response; 64 } 65 }
本文地址:http://www.cnblogs.com/x-poior/p/5585506.html 轉載請註明,謝謝!