最近在以小米选购为案例来进行模拟登录,用到设置C#的WebBrowser控件Cookie达到访问选择小米手机版本的目的,如下图:
以为导入wininet.dll
/// <summary> /// 引用wininet.dll + 定义InternetSetCookie /// </summary> /// <param name="lpszUrlName">需要设置Cookie的URL</param> /// <param name="lbszCookieName">Cookie名称</param> /// <param name="lpszCookieData">Cookie数据</param> /// <returns>设置Cookie是否成功</returns> [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);
这里再加个设置Cookie的函数
public bool SetCookie(CookieCollection ccAll) { foreach (Cookie cookie in ccAll) { InternetSetCookie( "http://" + cookie.Domain.ToString(), cookie.Name.ToString(), cookie.Value.ToString() + ";expires=Sun,22-Feb-2099 00:00:00 GMT"); } return true; }
就可以收工了呢,
不成想,前有拦路虎。
死活折腾都是这个效果,如下图:
绝望之际,想到了在用VS2010逐过程调试的时候,发现Cookie中有的Domain值开头就是点,比如.xiaomi.com,这样肯定就不行了。写个函数把点去掉得了。
public static string RemoveDot(string dotString) { if (dotString.StartsWith(".")) { dotString = dotString.Substring(1, dotString.Length - 1); } return dotString; }
调用它:
public bool SetCookie(CookieCollection ccAll) { foreach (Cookie cookie in ccAll) { InternetSetCookie( "http://" + RemoveDot(cookie.Domain.ToString()), cookie.Name.ToString(), cookie.Value.ToString() + ";expires=Sun,22-Feb-2099 00:00:00 GMT"); } return true; }
这样就能在选择小米手机版本页面登录成功了。