让我们一起走向未来
🎓作者简介:全栈领域优质创作者
🌐个人主页:百锦再@新空间代码工作室
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[15045666310@163]
📱个人微信:15045666310
🌐网站:https://meihua150/
💡座右铭:坚持自己的坚持,不要迷失自己!要快乐
目录
- 让我们一起走向未来
- 1. 使用 WebBrowser 控件
- 1.1 添加 WebBrowser 控件
- 1.2 使用 WebBrowser 控件访问网页
- 1.3 获取 Cookie
- 2. 使用 CefSharp
- 2.1 安装 CefSharp
- 2.2 初始化 CefSharp
- 2.3 获取 Cookie
- 3. 使用 HttpClient
- 3.1 发送 HTTP 请求
- 3.2 获取 Cookie
- 4. 使用 Selenium WebDriver
- 4.1 安装 Selenium WebDriver
- 4.2 使用 Selenium WebDriver 访问网页
- 4.3 获取 Cookie
- 总结
在 Winform 应用程序中模拟浏览器访问并获取 HTTP 头信息和 Cookie 是一个常见的需求,尤其是在需要与 Web API 交互或自动化网页操作的场景中。本文将详细介绍如何使用不同的方法和技术来实现这一目标。
1. 使用 WebBrowser 控件
WebBrowser 控件是 Winform 中内置的一个控件,可以嵌入 IE 浏览器内核,用于显示和操作网页。虽然它的功能相对有限,但对于简单的任务来说已经足够。
1.1 添加 WebBrowser 控件
- 新建一个 Winform 项目。
- 打开工具箱,右键点击空白处,选择“选择项”。
- 选择“COM 组件”,勾选“Microsoft Web Browser”。
- 将控件拖拽到窗体上。
1.2 使用 WebBrowser 控件访问网页
private void Form1_Load(object sender, EventArgs e)
{
axWebBrowser1.Navigate("https://www.baidu");
}
1.3 获取 Cookie
WebBrowser 控件默认只能获取没有 HttpOnly 标志的 Cookie。如果需要获取所有 Cookie,可以使用 WINAPI 的 InternetGetCookieEx
函数。
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool InternetGetCookieEx(
string pchURL,
string pchCookieName,
StringBuilder pchCookieData,
ref uint pcchCookieData,
int dwFlags,
IntPtr lpReserved
);
private void GetCookies(string url)
{
uint size = 0;
InternetGetCookieEx(url, null, null, ref size, 0x00002000, IntPtr.Zero);
StringBuilder cookieData = new StringBuilder((int)size);
InternetGetCookieEx(url, null, cookieData, ref size, 0x00002000, IntPtr.Zero);
MessageBox.Show(cookieData.ToString());
}
调用 GetCookies
方法即可获取指定 URL 的所有 Cookie。
2. 使用 CefSharp
CefSharp 是一个基于 Chromium 的开源浏览器控件,可以嵌入到 Winform 应用程序中,提供更强大的功能和更好的性能。
2.1 安装 CefSharp
- 新建一个 Winform 项目。
- 在解决方案管理器中,右键点击“引用”,选择“管理 NuGet 程序包”。
- 搜索并安装
CefSharp.WinForms
包。
2.2 初始化 CefSharp
public partial class Form1 : Form
{
public ChromiumWebBrowser chromeBrowser;
public Form1()
{
InitializeComponent();
InitializeChromium();
}
private void InitializeChromium()
{
CefSettings settings = new CefSettings();
Cef.Initialize(settings);
chromeBrowser = new ChromiumWebBrowser("https://www.baidu");
this.Controls.Add(chromeBrowser);
chromeBrowser.Dock = DockStyle.Fill;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Cef.Shutdown();
}
}
2.3 获取 Cookie
CefSharp 提供了多种方法来获取 Cookie,以下是一个示例:
private void button1_Click(object sender, EventArgs e)
{
Task<CefSharp.JavascriptResponse> t = chromeBrowser.EvaluateScriptAsync("document.cookie");
t.Wait();
var cookie = t.Result.Result;
MessageBox.Show(cookie.ToString());
}
或者使用标准的 CefSharp 方法:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Load += Form1_Load;
}
ChromiumWebBrowser webBrower = null;
string cookies;
private void Form1_Load(object sender, EventArgs e)
{
string path = "";
webBrower = new ChromiumWebBrowser(path);
webBrower.Dock = DockStyle.Fill;
webBrower.FrameLoadEnd += WebBrower_FrameLoadEnd;
this.Controls.Add(webBrower);
webBrower.Load("http://localhost/page1.html");
}
private void WebBrower_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
{
ICookieManager cookieManager = webBrower.GetCookieManager();
CookieVisitor visitor = new CookieVisitor();
visitor.SendCookie += visitor_SendCookie;
cookieManager.VisitAllCookies(visitor);
}
private void visitor_SendCookie(CefSharp.Cookie obj)
{
cookies += obj.Domain.TrimStart('.') + "^" + obj.Name + "^" + obj.Value + "\r\n";
}
private void button1_Click(object sender, EventArgs e)
{
this.textBox_cookie.Text = cookies;
}
public class CookieVisitor : CefSharp.ICookieVisitor
{
public event Action<CefSharp.Cookie> SendCookie;
public void Dispose()
{
}
public bool Visit(CefSharp.Cookie cookie, int count, int total, ref bool deleteCookie)
{
deleteCookie = false;
if (SendCookie != null)
{
SendCookie(cookie);
}
return true;
}
}
}
3. 使用 HttpClient
HttpClient 是 .NET 中用于发送 HTTP 请求和接收响应的类,可以用于模拟浏览器访问并获取头信息和 Cookie。
3.1 发送 HTTP 请求
public static async Task<string> SendHttpRequest(string url, HttpMethod method, Dictionary<string, string> headers = null, HttpContent content = null)
{
using (HttpClient client = new HttpClient())
{
if (headers != null)
{
foreach (var header in headers)
{
client.DefaultRequestHeaders.Add(header.Key, header.Value);
}
}
using (HttpRequestMessage request = new HttpRequestMessage(method, url))
{
if (content != null)
{
request.Content = content;
}
using (HttpResponseMessage response = await client.SendAsync(request))
{
return await response.Content.ReadAsStringAsync();
}
}
}
}
3.2 获取 Cookie
public static async Task<string> GetCookies(string url)
{
using (HttpClientHandler handler = new HttpClientHandler())
{
handler.CookieContainer = new CookieContainer();
using (HttpClient client = new HttpClient(handler))
{
await client.GetAsync(url);
var cookies = handler.CookieContainer.GetCookies(new Uri(url));
string cookieString = string.Join("; ", cookies.Cast<Cookie>().Select(c => $"{c.Name}={c.Value}"));
return cookieString;
}
}
}
调用 GetCookies
方法即可获取指定 URL 的所有 Cookie。
4. 使用 Selenium WebDriver
Selenium WebDriver 是一个强大的自动化测试工具,可以用于模拟浏览器操作,包括获取头信息和 Cookie。
4.1 安装 Selenium WebDriver
- 新建一个 Winform 项目。
- 在解决方案管理器中,右键点击“引用”,选择“管理 NuGet 程序包”。
- 搜索并安装
Selenium.WebDriver
和Selenium.WebDriver.ChromeDriver
包。
4.2 使用 Selenium WebDriver 访问网页
private void btnLoad_Click(object sender, EventArgs e)
{
var options = new ChromeOptions();
IWebDriver driver = new ChromeDriver(options);
try
{
driver.Navigate().GoToUrl("https://account.chsi/passport/login");
driver.FindElement(By.Name("username")).SendKeys("Tom");
driver.FindElement(By.Name("password")).SendKeys("123456");
driver.Manage().Window.Maximize();
string pageSource = driver.PageSource;
Console.WriteLine(pageSource);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
driver.Quit();
}
}
4.3 获取 Cookie
private void GetCookies(IWebDriver driver)
{
var cookies = driver.Manage().Cookies.AllCookies;
foreach (var cookie in cookies)
{
Console.WriteLine($"{cookie.Name}={cookie.Value}");
}
}
调用 GetCookies
方法即可获取当前页面的所有 Cookie。
总结
在 Winform 应用程序中模拟浏览器访问并获取头信息和 Cookie 有多种方法,每种方法都有其优缺点。WebBrowser 控件简单易用,但功能有限;CefSharp 功能强大,但配置相对复杂;HttpClient 适用于简单的 HTTP 请求;Selenium WebDriver 适用于复杂的自动化测试场景。根据具体需求选择合适的方法,可以有效地实现模拟浏览器访问并获取所需信息。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1742569402a4460211.html
评论列表(0条)