已用万能框架模拟登陆成功。。。
现在还有需求就是免密登陆网站,也就是类似于QQ软件点击邮箱按钮弹出浏览器直接登陆到邮箱一样
OK,按需求分析,直接开干
请求方式:POST
请求地址:http://xxx.com/login.action
PostData:accToken=xxxxxxx
返回登陆成功的主页html源码
postData信息直接模拟就可以了。
请求方式是POST,并不是GET
那么我就度娘了一下,得到下面方法
[C#] 纯文本查看 复制代码 /// <summary>
/// 打开新的浏览器,并且提交POST数据
/// </summary>
/// <param name="url">地址</param>
/// <param name="postData">;POST 数据</param>
public static void OpenNewIe(string url, string postData)
{
var ie = new InternetExplorer();
object vPost, vHeaders, vFlags, vTargetFrame;
vPost = null;
vFlags = null;
vTargetFrame = null;
vHeaders = "Content-Type: application/x-www-form-urlencoded" + Convert.ToChar(10) + Convert.ToChar(13);
if (!string.IsNullOrEmpty(postData))
vPost = ASCIIEncoding.ASCII.GetBytes(postData);
ie.Visible = true;
ie.Navigate(url, ref vFlags, ref vTargetFrame, ref vPost, ref vHeaders);
}
嗯,心想妥妥的,直接用这个方法去打开IE,用fiddler抓包监控了一下发现缺少了cookies,
搜索一下论坛上的,站长说:
vHeaders = "Content-Type: application/x-www-form-urlencoded;set-cookie=写你的Cookie值就行了" + Convert.ToChar(10) + Convert.ToChar(13);
真实的环境去模拟了一下,发现有趣的事情
1:设置的cookie在Content-Type里,真正的cookies浏览器用了他自己的
2: var ie = new InternetExplorer();创建对象的时候就直接打开了浏览器,不是Inetrnet Explorer IE.
基于着2个问题,我就想着直接GET的方式到login.action页面
将cookies 设置到IE:
[C#] 纯文本查看 复制代码 [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool InternetGetCookie(string lpszUrlName, string lbszCookieName, StringBuilder lpszCookieData, ref int lpdwSize);
返回了ture,设置成功了。用Process.StartD打开IE,用fiddler抓包监控了GET的方式去打开IE,并没有将COOKIES设置进去。
不知问题出在哪里,经过漫长的度娘。。。。
度娘有人说:
设置cookie有两种,一种是会话级的,即脱离会话cookie即清除,一种是持久性的,程序结束也仍然存在,直到超期。 会话级的cookie很特别,因为它是保存在内存中的,所以你在Temporary Internet Files文件夹中是找不到它的,只能在你设置cookie的应用程序中读出。而持久性cookie就可以在Temporary Internet Files文件夹中找到。这种cookie才能进行传递。两种cookie的设置程序是一样的,唯一的区别是持久性cookie设置要在cookie值后附加上“;expires=Sun,22-Feb-2099 00:00:00 GMT",过期时间可以根据需要自定。
如果是会话cookie的话是不是就无法免登陆弹出IE?
有人说用webBrowser多好,问题是webBrowser很多东西都不支持,不知道为什么,以为这个网页很多控件,如身份证读卡器,SIM读写卡,摄像头控件等等,
|