C#实现模拟登录百度并发送私信
首先获取Token,根据Token获取PubliKey,使用RSA加密POST数据
private Regex _regex = new Regex(@"\{.*\}", RegexOptions.IgnoreCase);
static void Main(string[] args)
{
new Program().Login("用户名", "密码");
Console.ReadLine();
}
public static string Get_time_13()
{
DateTime d = DateTime.Now.AddHours(-8.0);
DateTime d2 = Convert.ToDateTime("1970-01-01 ");
return (d - d2).TotalMilliseconds.ToString("");
}
public void Login(string username, string pwd)
{
var cookieContainer = new CookieContainer();
var token = GetToken(cookieContainer);
if (_regex.IsMatch(token))
{
token = _regex.Match(token).Value;
}
var resultToken = JsonConvert.DeserializeObject<ResultToken>(token);
var pubKey = GetPubKey(resultToken.Data.Token, cookieContainer);
if (_regex.IsMatch(pubKey))
{
pubKey = _regex.Match(pubKey).Value;
}
var publicKey = JsonConvert.DeserializeObject<PublicRsaKey>(pubKey);
var rsakey = publicKey.Key;
var pemToXml = RSAHelper.PemToXml(publicKey.Pubkey);
var password = RSAHelper.RSAEncrypt(pemToXml, pwd);
var url = "https://passport.baidu.com/v2/api/?login";
var postdata = string.Format("staticpage=http%3A%2F%2Fapp.baidu.com%2Fsfile%2Fv3Jump.html&charset=UTF-8&token={0}&tpl=wise&subpro=&apiver=v3&tt={1}&codestring=&safeflg=0&u=%0D%0A%0D%0Ahttp%3A%2F%2Fapp.baidu.com%2Findex%3Fregdev%3D1&isPhone=false&quick_user=0&logintype=dialogLogin&logLoginType=pc_loginDialog&idc=&loginmerge=true&splogin=newuser&username={2}&password={3}&verifycode=&mem_pass=on&rsakey={4}&crypttype=12&ppui_logintime=426406&callback=parent.bd__pcbs__mwrr8d", resultToken.Data.Token, GetJsTimeSeconds(), HttpUtility.UrlEncode(username), HttpUtility.UrlEncode(password), HttpUtility.UrlEncode(rsakey));
PostRequest(url, cookieContainer, postdata);
}
private string GetToken(CookieContainer cookieContainer)
{
var url = string.Format(@"https://passport.baidu.com/v2/api/?getapi&tpl=wise&apiver=v3&tt={0}&class=login&logintype=dialogLogin&callback=bd__cbs__v5pvt1", GetJsTimeSeconds());
GetHtml(url, ref cookieContainer);
return GetHtml(url, ref cookieContainer);
}
private string GetPubKey(string token, CookieContainer cookieContainer)
{
var url = string.Format("https://passport.baidu.com/v2/getpublickey?token={0}&tpl=wise&apiver=v3&tt={1}&callback=bd__cbs__fwnq4r", token, GetJsTimeSeconds());
var html = GetHtml(url, ref cookieContainer);
return html;
}
private static string GetJsTimeSeconds()
{
return (DateTime.UtcNow - DateTime.Parse("1970-01-01 0:0:0")).TotalMilliseconds.ToString("");
}
private string GetHtml(string url, ref CookieContainer cookie)
{
HttpWebRequest request = null;
HttpWebResponse response = null;
try
{
request = (HttpWebRequest)WebRequest.Create(url);
request.Proxy = null;
request.Credentials = CredentialCache.DefaultCredentials;
request.Method = "GET";
request.KeepAlive = true;
request.Accept = "application/json, text/plain, */*";
request.CookieContainer = cookie;
request.AllowAutoRedirect = true;
response = (HttpWebResponse)request.GetResponse();
var sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string ss = sr.ReadToEnd();
sr.Close();
request.Abort();
response.Close();
return ss;
}
catch (WebException ex)
{
return "";
}
}
public void PostRequest(string url, CookieContainer cookieContainer, string postData)
{
HttpWebRequest request = null;
HttpWebResponse response = null;
try
{
request = (HttpWebRequest)WebRequest.Create(url);//实例化web访问类
request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36";
request.Credentials = CredentialCache.DefaultCredentials;
request.Method = "POST"; //数据提交方式为POST
request.ContentType = "application/x-www-form-urlencoded";
request.AllowAutoRedirect = false; // 不用需自动跳转
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
request.CookieContainer = cookieContainer;
request.KeepAlive = true;
//提交请求
byte[] postdatabytes = Encoding.UTF8.GetBytes(postData);
request.ContentLength = postdatabytes.Length;
Stream stream;
stream = request.GetRequestStream();
//设置POST 数据
stream.Write(postdatabytes, , postdatabytes.Length);
stream.Close();
//接收响应
response = (HttpWebResponse)request.GetResponse();
var cookieCollection = response.Cookies;//拿到bduss 说明登录成功
//保存返回cookie
//取下一次GET跳转地址
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string content = sr.ReadToEnd();
CheckLogin(content);
CheckSendMSG(cookieContainer);
sr.Close();
}
catch (Exception ex)
{
}
finally
{
if (request != null) request.Abort();
if (response != null) response.Close();
}
}
public static void CheckLogin(string content)
{
int after = content.IndexOf("err_no");
if (after > )
{
string html = content.Substring(after);
int index = html.IndexOf("=");
int and = html.IndexOf("&");
string ErrorCode = html.Substring(index + , and - index - );
switch (ErrorCode)
{
case "":
Console.WriteLine("登录成功");
break;
case "":
Console.WriteLine("密码错误");
break;
case "":
Console.WriteLine("用户名不存在");
break;
}
}
}
向指定收件人发送百度私信:
public static string FindString(string content, string str)//找到字符串位置
{
int num = content.IndexOf(str);
if (num >= )
{
int length = str.Length;
return content.Substring(num + length, content.Length - num - length);
}
return "";
} public static string GetString(string content, string str)//截取字符串
{
int One = content.IndexOf(str);
int Two = content.IndexOf(str, One + );
return content.Substring(One + , Two - One - );
}
/// <summary>
/// 发送百度私信
/// </summary>
/// <param name="User">收件人</param>
/// <param name="MSG">发送的内容</param>
/// <param name="cookie">Cookie</param>
/// <param name="Token">Token字符串</param>
/// <param name="Vcode">验证码</param>
/// <param name="VcodeStr">动态验证码字符串</param>
/// <returns></returns>
public string SendMSG(string User, string MSG, CookieContainer cookie, string Token, string Vcode, string VcodeStr)
{
HttpHelper http = new HttpHelper(cookie);
http.Encoding = Encoding.UTF8;
string html = http.GetHtml("http://msg.baidu.com/msg/writing/submit/msg", cookie, "msgcontent=" + MSG + "&vcode=" + Vcode + "&msgvcode=" + VcodeStr + "&msgreceiver=" + HttpUtility.UrlEncode(User, Encoding.UTF8) + ";&bdstoken=" + Token + "&qing_request_source=", true);
//string html = http.GetHtml("http://msg.baidu.com/msg/home");
return html;
} public void CheckSendMSG(CookieContainer cookie)
{
try
{
//获取Token
string TokenHtml = GetHtml("http://msg.baidu.com/msg/writing", ref cookie);
string Token = GetString(FindString(TokenHtml, "window.msgBdsToken"), "\"");
//获取验证码字符串
string VcodeHtml = GetHtml("https://passport.baidu.com/v2/?reggetcodestr&tpl=qing&app=stelyg&apiver=v3&class=reg&echoback=msg.home.editor.changeVerifyCode&tt=1471663009977&callback=msg.msgpublish.Form.changeVerifyCode", ref cookie);
string VcodeStr = GetString(FindString(VcodeHtml, "\"verifyStr\""), "\"");
//获取验证码图片
WebClient client = new WebClient();
client.DownloadFile("https://passport.baidu.com/cgi-bin/genimage?" + VcodeStr + "&t=1471585459062", "D:\\验证码.png"); Console.Write("请输入收件人:");
string User = Console.ReadLine();
Console.Write("请输入发送内容:");
string MSG = Console.ReadLine();
Console.Write("请输入验证码:");
string Vcode = Console.ReadLine();
string html = SendMSG(User, MSG, cookie, Token, Vcode, VcodeStr);
string ErrorCode = GetString(FindString(html, "errorNo"), "\"");
switch (ErrorCode)
{
case "":
Console.WriteLine("发送成功");
break;
case "":
Console.WriteLine("用户名不存在");
break;
case "":
Console.WriteLine("验证码错误");
break;
}
Console.WriteLine(html);
}
catch (Exception e)
{ }
}
对RAS秘钥的加密和解密方法,需要引用BouncyCastle.Crypto.dll
public static string PemToXml(string pem)
{
if (pem.StartsWith("-----BEGIN RSA PRIVATE KEY-----")
|| pem.StartsWith("-----BEGIN PRIVATE KEY-----"))
{
return GetXmlRsaKey(pem, obj =>
{
if ((obj as RsaPrivateCrtKeyParameters) != null)
return DotNetUtilities.ToRSA((RsaPrivateCrtKeyParameters)obj);
var keyPair = (AsymmetricCipherKeyPair)obj;
return DotNetUtilities.ToRSA((RsaPrivateCrtKeyParameters)keyPair.Private);
}, rsa => rsa.ToXmlString(true));
} if (pem.StartsWith("-----BEGIN PUBLIC KEY-----"))
{
return GetXmlRsaKey(pem, obj =>
{
var publicKey = (RsaKeyParameters)obj;
return DotNetUtilities.ToRSA(publicKey);
}, rsa => rsa.ToXmlString(false));
} throw new InvalidKeyException("Unsupported PEM format...");
}
private static string GetXmlRsaKey(string pem, Func<object, RSA> getRsa, Func<RSA, string> getKey)
{
using (var ms = new MemoryStream())
using (var sw = new StreamWriter(ms))
using (var sr = new StreamReader(ms))
{
sw.Write(pem);
sw.Flush();
ms.Position = ;
var pr = new PemReader(sr);
object keyPair = pr.ReadObject();
using (RSA rsa = getRsa(keyPair))
{
var xml = getKey(rsa);
return xml;
}
}
} /// <summary>
/// RSA加密
/// </summary>
/// <param name="publickey"></param>
/// <param name="content"></param>
/// <returns></returns>
public static string RSAEncrypt(string publickey, string content)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(publickey);
cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false); return Convert.ToBase64String(cipherbytes);
} /// <summary>
/// RSA解密
/// </summary>
/// <param name="privatekey"></param>
/// <param name="content"></param>
/// <returns></returns>
public static string RSADecrypt(string privatekey, string content)
{
privatekey =
@"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>";
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(privatekey);
cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false); return Encoding.UTF8.GetString(cipherbytes);
}
封装字段:
public class PublicRsaKey
{
[JsonProperty("errno")]
public string Errno { get; set; } [JsonProperty("msg")]
public string Msg { get; set; } [JsonProperty("pubkey")]
public string Pubkey { get; set; } [JsonProperty("key")]
public string Key { get; set; }
} public class ErrInfo
{ [JsonProperty("no")]
public string No { get; set; }
} public class Loginrecord
{ [JsonProperty("email")]
public object[] Email { get; set; } [JsonProperty("phone")]
public object[] Phone { get; set; }
} public class Data
{ [JsonProperty("rememberedUserName")]
public string RememberedUserName { get; set; } [JsonProperty("codeString")]
public string CodeString { get; set; } [JsonProperty("token")]
public string Token { get; set; } [JsonProperty("cookie")]
public string Cookie { get; set; } [JsonProperty("usernametype")]
public string Usernametype { get; set; } [JsonProperty("spLogin")]
public string SpLogin { get; set; } [JsonProperty("disable")]
public string Disable { get; set; } [JsonProperty("loginrecord")]
public Loginrecord Loginrecord { get; set; }
} public class ResultToken
{ [JsonProperty("errInfo")]
public ErrInfo ErrInfo { get; set; } [JsonProperty("data")]
public Data Data { get; set; }
}
C#实现模拟登录百度并发送私信的更多相关文章
- 使用ImitateLogin模拟登录百度
在之前的文章中,我已经介绍过一个社交网站模拟登录的类库:imitate-login ,这是一个通过c#的HttpWebRequest来模拟网站登录的库,之前实现了微博网页版和微博Wap版:现在,模拟百 ...
- C#模拟登录Facebook 实现发送消息、评论帖子
由于目前电脑网页版FB实现模拟登录比较困难,本次选择了FB的手机版页面进行登录 MVC: private static string UserName = "用户名"; priva ...
- 黄聪:C#带cookie模拟登录百度
#region 同步通过POST方式发送数据 /// <summary> /// 通过POST方式发送数据 /// </summary> /// <param name= ...
- C#带cookie模拟登录百度
#region 同步通过POST方式发送数据 /// <summary> /// 通过POST方式发送数据 /// </summary> /// <param name= ...
- Scrapy用Cookie实现模拟登录
模拟登录是爬取某些站点内容的一个关键,有些网站(特别是论坛类),不登录的话,一个数据也拿不到. 模拟登录有这样几个关键: 弄清楚登录的url一些网站打开出现登录的页面,地址栏大多数不是登录提交表单的u ...
- C#模拟登录Twitter 发送私信、艾特用户、回复评论
这次做成了MVC程序的接口 private static string UserName = "用户名"; private static string PassWord = &qu ...
- Python爬虫-百度模拟登录(一)
千呼万唤屎出来呀,百度模拟登录终于要呈现在大家眼前了,最近比较忙,晚上又得早点休息,这篇文章写了好几天才完成.这个成功以后,我打算试试百度网盘的其他接口实现.看看能不能把服务器文件上传到网盘,好歹也有 ...
- casperjs配合phantomjs实现自动登录百度,模拟点击等等操作 - 怕虎在线www.ipahoo.com图文教程 - 怕虎在线
微信支付取消2万元保证金门槛,这是全民电商来袭!-观点-虎嗅网 微信支付取消2万元保证金门槛,这是全民电商来袭! casperjs配合phantomjs实现自动登录百度,模拟点击等等操作 - 怕虎在线 ...
- .Net HttpClient 模拟登录微信公众平台发送消息
1.模拟登录 public WeiXinRetInfo ExecLogin(string name, string pass) { CookieContainer cc = new CookieCon ...
随机推荐
- Luogu3195 [HNOI2008]玩具装箱TOY (方程变形 + 斜率优化 )
题意: 给出一个序列 {a[i]} 把其分成若干个区间,每个区间的价值为 W = (j − i + ∑ak(i<=k<=j) - L)2 ,求所有分割方案中价值之和的最小值. 细节: 仔 ...
- MIP求解方法总结
*本文主要记录和分享学习到的知识,算不上原创 *参考文献见链接 本文主要简述了求解MIP问题的两大类(精确求解和近似求解),或者更细致地,三大类方法(精确算法,ε-近似算法和启发式算法).由于暂时不太 ...
- HDU 2829 斜率优化DP Lawrence
题意:n个数之间放m个障碍,分隔成m+1段.对于每段两两数相乘再求和,然后把这m+1个值加起来,让这个值最小. 设: d(i, j)表示前i个数之间放j个炸弹能得到的最小值 sum(i)为前缀和,co ...
- Python内置函数6
Python内置函数6 1.license() 输出当前python 的license信息 A. HISTORY OF THE SOFTWARE ========================== ...
- 九度oj 题目1342:寻找最长合法括号序列II
题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即 ...
- 100个直接可以拿来用的JavaScript实用功能代码片段(转)
把平时网站上常用的一些实用功能代码片段通通收集起来,方面网友们学习使用,利用好的话可以加快网友们的开发速度,提高工作效率. 目录如下: 1.原生JavaScript实现字符串长度截取2.原生JavaS ...
- ajax原生post请求
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【CCF】通信网络 简单搜索
去重!不然有环就直接挂掉了...0分 #include<iostream> #include<cstdio> #include<string> #include&l ...
- 【单调队列+二分查找】bzoj 1012: [JSOI2008]最大数maxnumber
[题意] 维护一个单调递减的q数组,用id数组记录q数组的每个下标对应在原数组的位置,那么id数组一定有单调性(q数组中越靠后,原数组中也靠后),然后二分查找这个数 [AC] #include< ...
- 【2018.10.20】CXM笔记(思维)
1. 给你个环状字符串,问从哪个地方拆开能使它的字典序最小. 先预处理任意子串的哈希值. 然后枚举拆点,将它与当前最优的拆点比较谁更优(就是从哪拆的字典序更小),具体方法是二分+哈希找出两串最长的相同 ...