亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#使用ImitateLogin模擬登錄百度

 更新時(shí)間:2015年12月04日 10:57:42   作者:Carey Tzou  
這篇文章主要介紹了C#使用ImitateLogin模擬登錄百度 的相關(guān)資料,需要的朋友可以參考下

在之前的文章中,我已經(jīng)介紹過(guò)一個(gè)社交網(wǎng)站模擬登錄的類(lèi)庫(kù):imitate-login ,這是一個(gè)通過(guò)c#的HttpWebRequest來(lái)模擬網(wǎng)站登錄的庫(kù),之前實(shí)現(xiàn)了微博網(wǎng)頁(yè)版和微博Wap版;現(xiàn)在,模擬百度登錄的部分也已經(jīng)完成。由于個(gè)人時(shí)間的限制,加上目前有多個(gè)項(xiàng)目在同時(shí)進(jìn)行,因此更新頻率會(huì)根據(jù)項(xiàng)目關(guān)注度來(lái)決定(Star & fork)。

這個(gè)類(lèi)庫(kù)的使用方法非常簡(jiǎn)單,僅對(duì)外提供一個(gè)方法:

LoginResult Login(1: string userName, 2: string password, 3: LoginSite loginSite); 

這個(gè)方法位于ImitateLogin的LoginHelper類(lèi)中,使用之前需要先對(duì)其進(jìn)行實(shí)例化。通過(guò)傳入 用戶(hù)名、密碼以及登錄的網(wǎng)站,返回一個(gè)包含登錄結(jié)果狀態(tài)、描述信息和Cookies字典的類(lèi)。它通過(guò) Thrift 來(lái)實(shí)現(xiàn)多語(yǔ)言的支持。

下面將通過(guò)介紹模擬百度登錄的實(shí)現(xiàn)來(lái)介紹如何進(jìn)行擴(kuò)充與二次開(kāi)發(fā):

首先,創(chuàng)建百度登錄類(lèi) BaiduLogin.cs 繼承 ILogin 接口;實(shí)現(xiàn)其生成的 DoLogin 方法。

#region ILogin implementation
public LoginResult DoLogin(string UserName, string Password)
{
  throw new NotImplementedException();
}
public CookieContainer cookies { set; get;}
#endregion 

然后我們通過(guò)監(jiān)聽(tīng)百度登錄過(guò)程中的網(wǎng)絡(luò)請(qǐng)求,梳理出修改過(guò)Cookies和最終提交登錄所需的參數(shù)的請(qǐng)求。

Step1: 訪(fǎng)問(wèn)以下鏈接生成初始Cookies:

HttpHelper.GetHttpContent("

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 為隨機(jī)生成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 是一個(gè)記錄從最初執(zhí)行到最終提交之前的耗時(shí)的一個(gè)計(jì)時(shí)器,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:驗(yàn)證最終的登錄結(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("賬號(hào)存在異常") || !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é)果類(lèi):

LoginResult loginResult = new LoginResult() { Result = ResultType.Success, Msg = "Success", Cookies = HttpHelper.GetAllCookies(cookies) }; 

至此,模擬登錄部分的代碼就完成了,為了能夠被其它程序調(diào)用,你還需要在 LoginSite 的枚舉中新增一條來(lái)標(biāo)識(shí)這個(gè)登錄方法,此處增加了一個(gè) Baidu = 5,并設(shè)置 [Description(“Baidu”)]。

然后在 LoginHelper.cs 的 Login 方法中的 switch (loginSite) 里增加一個(gè) case:

case LoginSite.Baidu:
  LoginClass = new BaiduLogin ();
  break;

以上內(nèi)容是腳本之家小編給大家介紹的C#使用ImitateLogin模擬登錄百度的全部敘述,希望大家喜歡。

相關(guān)文章

  • WPF如何自定義ProgressBar滾動(dòng)條樣式

    WPF如何自定義ProgressBar滾動(dòng)條樣式

    這篇文章主要給大家介紹了關(guān)于WPF如何自定義ProgressBar滾動(dòng)條樣式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用WPF具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • C#統(tǒng)計(jì)字符串的方法

    C#統(tǒng)計(jì)字符串的方法

    這篇文章主要為大家詳細(xì)介紹了C#統(tǒng)計(jì)字符串的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C#中foreach循環(huán)對(duì)比f(wàn)or循環(huán)的優(yōu)勢(shì)和劣勢(shì)

    C#中foreach循環(huán)對(duì)比f(wàn)or循環(huán)的優(yōu)勢(shì)和劣勢(shì)

    循環(huán)語(yǔ)句是編程的基本語(yǔ)句,在C#中除了沿用C語(yǔ)言的循環(huán)語(yǔ)句外,還提供了foreach語(yǔ)句來(lái)實(shí)現(xiàn)循環(huán),下面這篇文章主要給大家介紹了關(guān)于C#中foreach循環(huán)對(duì)比f(wàn)or循環(huán)的優(yōu)勢(shì)和劣勢(shì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-09-09
  • 清除aspx頁(yè)面緩存的程序?qū)崿F(xiàn)方法

    清除aspx頁(yè)面緩存的程序?qū)崿F(xiàn)方法

    這篇文章主要介紹了清除aspx頁(yè)面緩存的程序?qū)崿F(xiàn)方法,非常實(shí)用,需要的朋友可以參考下
    2014-08-08
  • C#生成putty格式的ppk文件

    C#生成putty格式的ppk文件

    這篇文章介紹了C#生成putty格式ppk文件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Unity利用UGUI制作提示框效果

    Unity利用UGUI制作提示框效果

    這篇文章主要為大家詳細(xì)介紹了Unity利用UGUI制作提示框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C#多線(xiàn)程之任務(wù)的用法詳解

    C#多線(xiàn)程之任務(wù)的用法詳解

    本文詳細(xì)講解了C#多線(xiàn)程之任務(wù)的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#中l(wèi)ock用法詳解

    C#中l(wèi)ock用法詳解

    這篇文章主要介紹了C#中l(wèi)ock用法,以實(shí)例形式詳細(xì)分析了lock語(yǔ)句的用法及用途,需要的朋友可以參考下
    2014-11-11
  • C#使用NUnit進(jìn)行單元測(cè)試詳解

    C#使用NUnit進(jìn)行單元測(cè)試詳解

    NUnit是一個(gè)開(kāi)源的.Net單元測(cè)試框架,經(jīng)常被用來(lái)在.Net體系下做白盒測(cè)試,本文主要為大家詳細(xì)介紹了如何C#如何使用NUnit進(jìn)行單元測(cè)試,感興趣的可以了解下
    2023-12-12
  • 如何用C#實(shí)現(xiàn)SAGA分布式事務(wù)

    如何用C#實(shí)現(xiàn)SAGA分布式事務(wù)

    大家好,本篇文章主要講的是如何用C#實(shí)現(xiàn)SAGA分布式事務(wù),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下
    2022-01-01

最新評(píng)論