C#使用ImitateLogin模擬登錄百度
在之前的文章中,我已經(jīng)介紹過一個社交網(wǎng)站模擬登錄的類庫:imitate-login ,這是一個通過c#的HttpWebRequest來模擬網(wǎng)站登錄的庫,之前實現(xiàn)了微博網(wǎng)頁版和微博Wap版;現(xiàn)在,模擬百度登錄的部分也已經(jīng)完成。由于個人時間的限制,加上目前有多個項目在同時進行,因此更新頻率會根據(jù)項目關注度來決定(Star & fork)。
這個類庫的使用方法非常簡單,僅對外提供一個方法:
LoginResult Login(1: string userName, 2: string password, 3: LoginSite loginSite);
這個方法位于ImitateLogin的LoginHelper類中,使用之前需要先對其進行實例化。通過傳入 用戶名、密碼以及登錄的網(wǎng)站,返回一個包含登錄結(jié)果狀態(tài)、描述信息和Cookies字典的類。它通過 Thrift 來實現(xiàn)多語言的支持。
下面將通過介紹模擬百度登錄的實現(xiàn)來介紹如何進行擴充與二次開發(fā):
首先,創(chuàng)建百度登錄類 BaiduLogin.cs 繼承 ILogin 接口;實現(xiàn)其生成的 DoLogin 方法。
#region ILogin implementation public LoginResult DoLogin(string UserName, string Password) { throw new NotImplementedException(); } public CookieContainer cookies { set; get;} #endregion
然后我們通過監(jiān)聽百度登錄過程中的網(wǎng)絡請求,梳理出修改過Cookies和最終提交登錄所需的參數(shù)的請求。
Step1: 訪問以下鏈接生成初始Cookies:
Step2: 獲取最終登錄提交所需的token:
//1. Get the token. string token_url = string.Format("https://passport.baidu.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.baidu.com/", encode: Encoding.GetEncoding("GB2312"), cookiesDomain: "passport.baidu.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位字母或數(shù)字的組合的方法。
Step3: 獲取用于加密密碼的publickey:
//2. Get public key string pubkey_url = "https://passport.baidu.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.baidu.com/", encode: Encoding.GetEncoding("GB2312"), cookiesDomain: "passport.baidu.com"); dynamic pubkeyJson = JsonConvert.DeserializeObject(pubkeyContent.Split('(')[1].Split(')')[0]); rsa_pub_baidu = pubkeyJson.pubkey; string KEY = pubkeyJson.key;
stopwatch 是一個記錄從最初執(zhí)行到最終提交之前的耗時的一個計時器,get_pwa_rsa 為加密密碼的方法。
Step4: 模擬執(zhí)行最終的登錄:
//3. Build post data string login_data = "staticpage=https%3A%2F%2Fwww.baidu.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.baidu.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.baidu.com/v2/api/?login"; HttpHelper.GetHttpContent(login_url, login_data, cookies, referer: "https://www.baidu.com/", cookiesDomain: "passport.baidu.com");
Step5:驗證最終的登錄結(jié)果:
string home_url = "https://www.baidu.com"; string result = HttpHelper.GetHttpContent(home_url, cookies: cookies, cookiesDomain: "passport.baidu.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:創(chuàng)建返回結(jié)果類:
LoginResult loginResult = new LoginResult() { Result = ResultType.Success, Msg = "Success", Cookies = HttpHelper.GetAllCookies(cookies) };
至此,模擬登錄部分的代碼就完成了,為了能夠被其它程序調(diào)用,你還需要在 LoginSite 的枚舉中新增一條來標識這個登錄方法,此處增加了一個 Baidu = 5,并設置 [Description(“Baidu”)]。
然后在 LoginHelper.cs 的 Login 方法中的 switch (loginSite) 里增加一個 case:
case LoginSite.Baidu: LoginClass = new BaiduLogin (); break;
以上內(nèi)容是腳本之家小編給大家介紹的C#使用ImitateLogin模擬登錄百度的全部敘述,希望大家喜歡。
- Winform實現(xiàn)調(diào)用asp.net數(shù)據(jù)接口實例
- C# Winform 調(diào)用系統(tǒng)接口操作 INI 配置文件的代碼
- C#實現(xiàn)百度ping推送功能的方法
- C#開發(fā)Android百度地圖手機應用程序(多地圖展示)
- 如何根據(jù)百度地圖計算出兩地之間的駕駛距離(兩種語言js和C#)
- C#實現(xiàn)百度網(wǎng)站收錄和排名查詢功能思路及實例
- C#實現(xiàn)解析百度天氣數(shù)據(jù),Rss解析百度新聞以及根據(jù)IP獲取所在城市的方法
- c#封裝百度web服務geocoding api 、百度坐標轉(zhuǎn)換示例
- asp.net c# 調(diào)用百度pai實現(xiàn)在線翻譯,英文轉(zhuǎn)中文
- WinForm調(diào)用百度地圖接口用法示例
相關文章
C#中foreach循環(huán)對比for循環(huán)的優(yōu)勢和劣勢
循環(huán)語句是編程的基本語句,在C#中除了沿用C語言的循環(huán)語句外,還提供了foreach語句來實現(xiàn)循環(huán),下面這篇文章主要給大家介紹了關于C#中foreach循環(huán)對比for循環(huán)的優(yōu)勢和劣勢,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09