Fork me on GitHub

C# Selenium实现自动获取网站cookie

之前写的一个开源的微博相册下载,需要用户手动进入浏览器开发者工具,查看请求,再获取微博的Cookie。
这样对一些新手小白很不友好,于是想着怎么样才能简化这个流程,让所有人都能轻松使用。
于是我发现了Selenium这个强大的可以实现浏览器操作自动化工具。它支持市面上几乎所有的浏览器,Chrome、Firefox、Edge等。只需要在nuget中引入Selenium.WebDriverSelenium.WebDriver.ChromeDriver即可开始自动化之旅。

下面是一段演示代码,打开微博的登录界面,等待用户扫码,然后重定向到微博主页。
不过需要注意的是,我这面设置了一个超时60s,用户需要在60s内扫码,否则就会抛出异常。
当然在这60s之内,用户扫码登录了,如何让程序知道用户扫码成功了呢。我在代码里面使用了wait.Until,检测页面的标题。当然还有更加正规的做法就是检测页面中的一些其他元素,比如用户昵称头像,用来判断登陆成功。
最后在做完所有的事情之后,可以调用driver.Quit();来关闭打开的网页。
image

扫码成功之后,页面上显示Chrome正在受自动测试软件的控制。
image

参考代码
IWebDriver driver = new ChromeDriver();
string com = "https://passport.weibo.com/sso/signin?entry=miniblog&source=miniblog&url=https://weibo.com/";

driver.Url = com;
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60))
{
    PollingInterval = TimeSpan.FromMilliseconds(500),
};
wait.IgnoreExceptionTypes(typeof(NoSuchElementException));
//wait.Until(d => d.FindElement(By.LinkText("title")));

// 等待页面加载完成并获取页面标题
wait.Until(d => d.Title.Equals("微博 – 随时随地发现新鲜事"));

// 获取页面标题并进行检查
string pageTitle = driver.Title;
if (pageTitle.Equals("微博 – 随时随地发现新鲜事"))
{
    Debug.WriteLine("已登陆");
    // 获取所有的 Cookie 对象
    IReadOnlyCollection<Cookie> cookies = driver.Manage().Cookies.AllCookies;

    // 将 Cookie 对象转换为一个字符串,格式类似于 HTTP 请求头的 Cookie 字符串
    string cookie = string.Join("; ", cookies.Select(c => $"{c.Name}={c.Value}"));

    // 打印 Cookie 字符串
    Debug.WriteLine(cookie);
}
else
{
    Debug.WriteLine("未登录");
}

// 程序结束时,手动关闭浏览器
driver.Quit();
posted @ 2024-10-12 13:45  猫叔Vincent  阅读(73)  评论(0编辑  收藏  举报