C#應用ImitateLogin模仿登錄百度。本站提示廣大學習愛好者:(C#應用ImitateLogin模仿登錄百度)文章只能為提供參考,不一定能成為您想要的結果。以下是C#應用ImitateLogin模仿登錄百度正文
在之前的文章中,我曾經引見過一個社交網站模仿登錄的類庫:imitate-login ,這是一個經由過程c#的HttpWebRequest來模仿網站登錄的庫,之前完成了微博網頁版和微博Wap版;如今,模仿百度登錄的部門也曾經完成。因為小我時光的限制,加上今朝有多個項目在同時停止,是以更新頻率會依據項目存眷度來決議(Star & fork)。
這個類庫的應用辦法異常簡略,僅對外供給一個辦法:
LoginResult Login(1: string userName, 2: string password, 3: LoginSite loginSite);
這個辦法位於ImitateLogin的LoginHelper類中,應用之前須要先對其停止實例化。經由過程傳入 用戶名、暗碼和登錄的網站,前往一個包括登錄成果狀況、描寫信息和Cookies字典的類。它經由過程 Thrift 來完成多說話的支撐。
上面將經由過程引見模仿百度登錄的完成來引見若何停止擴大與二次開辟:
起首,創立百度登錄類 BaiduLogin.cs 繼續 ILogin 接口;完成其生成的 DoLogin 辦法。
#region ILogin implementation public LoginResult DoLogin(string UserName, string Password) { throw new NotImplementedException(); } public CookieContainer cookies { set; get;} #endregion
然後我們經由過程監聽百度登錄進程中的收集要求,梳理出修正過Cookies和終究提交登錄所需的參數的要求。
Step1: 拜訪以下鏈接生成初始Cookies:
HttpHelper.GetHttpContent("https://passport.百度.com/passApi/html/_blank.html", cookies: cookies, cookiesDomain: "passport.百度.com");
Step2: 獲得終究登錄提交所需的token:
//1. Get the token. string token_url = string.Format("https://passport.百度.com/v2/api/?getapi&tpl=mn&apiver=v3&tt={0}&class=login&gid={1}&logintype=dialogLogin&callback=bd__cbs__{2}", TimeHelper.ConvertDateTimeInt(DateTime.Now), Guid.NewGuid().ToString().ToUpper(), build_callback()); string prepareContent = HttpHelper.GetHttpContent(token_url, null, cookies, referer: "https://www.百度.com/", encode: Encoding.GetEncoding("GB2312"), cookiesDomain: "passport.百度.com"); //string prepareJson = prepareContent.Split('(')[1].Split(')')[0]; dynamic prepareJson = JsonConvert.DeserializeObject(prepareContent.Split('(')[1].Split(')')[0]); string token = prepareJson.data.token;
個中 build_callback 為隨機生成6位字母或數字的組合的辦法。
Step3: 獲得用於加密暗碼的publickey:
//2. Get public key string pubkey_url = "https://passport.百度.com/v2/getpublickey?token={0}&tpl=mn&apiver=v3&tt={1}&gid={2}&callback=bd__cbs__{3}"; string pubkeyContent = HttpHelper.GetHttpContent(string.Format(pubkey_url, token, TimeHelper.ConvertDateTimeInt(DateTime.Now), Guid.NewGuid().ToString().ToUpper(), build_callback()), null, cookies, referer: "https://www.百度.com/", encode: Encoding.GetEncoding("GB2312"), cookiesDomain: "passport.百度.com"); dynamic pubkeyJson = JsonConvert.DeserializeObject(pubkeyContent.Split('(')[1].Split(')')[0]); rsa_pub_百度 = pubkeyJson.pubkey; string KEY = pubkeyJson.key;
stopwatch 是一個記載從最後履行到終究提交之前的耗時的一個計時器,get_pwa_rsa 為加密暗碼的辦法。
Step4: 模仿履行終究的登錄:
//3. Build post data string login_data = "staticpage=https%3A%2F%2Fwww.百度.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html&charset=UTF-8&token={0}&tpl=mn&subpro=&apiver=v3&tt={1}&codestring=&safeflg=0&u=https%3A%2F%2Fwww.百度.com%2F&isPhone=&detect=1&gid={2}&quick_user=0&logintype=dialogLogin&logLoginType=pc_loginDialog&idc=&loginmerge=true&splogin=rate&username={3}&password={4}&verifycode=&mem_pass=on&rsakey={5}&crypttype=12&ppui_logintime={6}&countrycode=&callback=parent.bd__pcbs__{7}"; login_data = string.Format(login_data, token, TimeHelper.ConvertDateTimeInt(DateTime.Now), Guid.NewGuid().ToString().ToUpper(), HttpUtility.UrlEncode(UserName), HttpUtility.UrlEncode(get_pwa_rsa(Password)), HttpUtility.UrlEncode(KEY), stopwatch.ElapsedMilliseconds, build_callback()); //4. Post the login data string login_url = "https://passport.百度.com/v2/api/?login"; HttpHelper.GetHttpContent(login_url, login_data, cookies, referer: "https://www.百度.com/", cookiesDomain: "passport.百度.com");
Step5:驗證終究的登錄成果:
string home_url = "https://www.百度.com"; string result = HttpHelper.GetHttpContent(home_url, cookies: cookies, cookiesDomain: "passport.百度.com"); //5. Verifty the login result if (string.IsNullOrWhiteSpace(result) || result.Contains("賬號存在異常") || !result.Contains("bds.comm.user=\"")) { return new LoginResult() { Result = ResultType.AccounntLimit, Msg = "Fail, Msg: Login fail! Maybe you account is disable or captcha is needed." }; }
Step6:創立前往成果類:
LoginResult loginResult = new LoginResult() { Result = ResultType.Success, Msg = "Success", Cookies = HttpHelper.GetAllCookies(cookies) };
至此,模仿登錄部門的代碼就完成了,為了可以或許被其它法式挪用,你還須要在 LoginSite 的列舉中新增一條來標識這個登錄辦法,此處增長了一個 Baidu = 5,並設置 [Description(“Baidu”)]。
然後在 LoginHelper.cs 的 Login 辦法中的 switch (loginSite) 裡增長一個 case:
case LoginSite.Baidu: LoginClass = new BaiduLogin (); break;
以上內容是小編給年夜家引見的C#應用ImitateLogin模仿登錄百度的全體論述,願望年夜家愛好。