|
本帖最后由 依然在飞翔 于 2013-8-19 13:45 编辑
公司用的腾讯企业邮箱,想把邮箱里的企业地址簿导出一下,发现腾讯的企业邮箱没导出企业地址簿的功能,好纠结。只好自己写个工具来导了。在使用HttpHelper登陆腾讯企业邮箱的时候,在密码这个地方卡住了。密码加密用的javascript RSAKey(),研究了一下,奈何咱技术不到家,好捉鸡。只能从别的地方寻找突破口了。
偶然发现 腾讯企业邮箱的 登陆模板 功能(可以把登陆表单嵌入到其它网页上)是直接提交密码的。
额。。不废话了。过程如下。
@符号分割邮箱地址,获emailInfo[0](用户名) emailInfo[1](企业邮箱域名)
Post以下数据到 https://exmail.qq.com/cgi-bin/login 这个地址
firstlogin=false&errtemplate=dm_loginpage&aliastype=other&dmtype=bizmail&p=&uin=邮箱用户名&pwd=密码&domain=邮箱域名
提交之后,进入到一个跳转页面,在跳转页面用正则获取 sid r 这两个值(后面请求的url地址需要加上这两个参数)
从服务端返回的cookie中 获取 qm_sid qm_sk 两个值,拼接成cookie(之后Get请求的页面,使用这个cookie即可)
可以进行登录了。用上面拼接的cookie ,Get请求邮箱首页
http://exmail.qq.com/cgi-bin/frame_html?sid=前面获取的sid&r=前面获取的r
接下来,就可以想干啥干啥了。。。
[code=csharp] private void btnLogin_Click(object sender, EventArgs e)
{
string[] emailInfo = txtEmail.Text.Trim().Split('@'); // @符号分割邮箱地址,获emailInfo[0](用户名) emailInfo[1](企业邮箱域名)
string password = txtPassword.Text.Trim();
string url = "https://exmail.qq.com/cgi-bin/login";
string postData = string.Format("firstlogin=false&errtemplate=dm_loginpage&aliastype=other&dmtype=bizmail&p=&uin={0}&pwd={1}&domain={2}", emailInfo[0], password, emailInfo[1]);
HttpResult result = GetHttpResult(url, "Post", "", postData);
string sid = GetRegex(result.Html, @"""frame_html\?sid=(.+?)""", 1);
string r = GetRegex(result.Html, @"""&r=(.+?)""", 1);
string qm_sid = GetRegex(result.Cookie, "qm_sid=(.+?);", 0);
//string qm_username = GetRegex(result.Cookie, "qm_username=(.+?);", 0); //
string qm_sk = GetRegex(result.Cookie, "qm_sk=(.+?);", 0);
//string qm_ssum = GetRegex(result.Cookie, "qm_ssum=(.+?);", 0);
string cookie = qm_sid + qm_sk;
url = string.Format("http://exmail.qq.com/cgi-bin/frame_html?sid={0}&r={1}", sid, r);
result = GetHttpResult(url, "Get", cookie, "");
txtHtmlSource.Text = "";
txtHtmlSource.AppendText("sid:" + sid + "\r\n");
txtHtmlSource.AppendText("r:" + r + "\r\n");
txtHtmlSource.AppendText("qm_sid:" + qm_sid + "\r\n");
//txtHtmlSource.AppendText("qm_username" + qm_username + "\r\n");
txtHtmlSource.AppendText("qm_sk:" + qm_sk + "\r\n");
//txtHtmlSource.AppendText("qm_ssum:" + qm_ssum + "\r\n\r\n");
txtHtmlSource.AppendText(result.Html);
}
/// <summary>
/// Http请求
/// </summary>
/// <param name="url">网址</param>
/// <param name="method">Get/Post</param>
/// <param name="cookie">cookie</param>
/// <param name="postData">Post数据</param>
/// <returns>HttpResult</returns>
private static HttpResult GetHttpResult(string url, string method, string cookie, string postData)
{
HttpHelper http = new HttpHelper();
HttpItem item = new HttpItem()
{
URL = url,//URL 必需项
Method = method,//URL 可选项 默认为Get
IsToLower = false,//得到的HTML代码是否转成小写 可选项默认转小写
Cookie = cookie,//字符串Cookie 可选项
Referer = "",//来源URL 可选项
Postdata = postData,//Post数据 可选项GET时不需要写
Timeout = 100000,//连接超时时间 可选项默认为100000
ReadWriteTimeout = 30000,//写入Post数据超时时间 可选项默认为30000
UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",//用户的浏览器类型,版本,操作系统 可选项有默认值
ContentType = "text/html",//返回类型 可选项有默认值
Allowautoredirect = false,//是否根据301跳转 可选项
//CerPath = "d:\123.cer",//证书绝对路径 可选项不需要证书时可以不写这个参数
//Connectionlimit = 1024,//最大连接数 可选项 默认为1024
ProxyIp = "",//代理服务器ID 可选项 不需要代理 时可以不设置这三个参数
//ProxyPwd = "123456",//代理服务器密码 可选项
//ProxyUserName = "administrator",//代理服务器账户名 可选项
};
HttpResult result = http.GetHtml(item);
//string html = result.Html;
//string cookie = result.Cookie;
return result;
}
/// <summary>
/// 单条数据正则获取
/// </summary>
/// <param name="code">源码</param>
/// <param name="ruler">正则表达式</param>
/// <param name="id">返回结果下标</param>
/// <returns>string</returns>
private static string GetRegex(string code, string ruler, int id)
{
string matchValue = "";
Regex r = new Regex(ruler, RegexOptions.Singleline);
Match m = r.Match(code);
if (m.Success)
{
matchValue = m.Groups[id].ToString();
}
return matchValue;
}[/code]
|
|