c# - 如何保存 cookie 并在以后使用它们?
问题描述
我登录网站https://dmarket.com。我想保存 cookie 并稍后使用。以免下次访问该网站。
private void login_Click(object sender, EventArgs e)
{
string login = textBox1.Text;
string password = textBox2.Text;
string steamguard = textBox3.Text;
IWebDriver driver = new ChromeDriver();
driver.Navigate().GoToUrl(@"https://steamcommunity.com/openid/login?openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.realm=https%3A%2F%2Fapi.dmarket.live&openid.return_to=https%3A%2F%2Fapi.dmarket.live%2Fauth%2Fv1%2Fcallback%2Fsteam%2F901e7d34-06c1-44b0-82b4-2f982c058361");
driver.FindElement(By.XPath("//*[@id=\"steamAccountName\"]")).SendKeys(login);
driver.FindElement(By.XPath("//*[@id=\"steamPassword\"]")).SendKeys(password);
driver.FindElement(By.XPath("//*[@id=\"imageLogin\"]")).Click();
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(150);
driver.FindElement(By.XPath("//*[@id=\"twofactorcode_entry\"]")).SendKeys(steamguard);
driver.FindElement(By.XPath("//*[@id=\"login_twofactorauth_buttonset_entercode\"]/div[1]")).Click();
var cookies = driver.Manage().Cookies.AllCookies;
driver.Manage().Cookies.AddCookie(cookies);
}
但是出现错误:错误 CS1503 参数 1:无法从“System.Collections.ObjectModel.ReadOnlyCollection <OpenQA.Selenium.Cookie>”转换为“OpenQA.Selenium.Cookie”。也许我做错了什么。也许它应该以不同的方式完成。谢谢!
解决方案
根据我处理高级别 cookie 的经验,您无法掌握并以我的方式解决问题的根源:
为 Firefox 或您使用的任何浏览器获取 Cookie 管理器扩展。
查看您在登录后获得了多少 cookie 键/值。
安装 fiddler 嗅探器,在浏览网站时查看其中有多少在登录后发送请求。
提取该 cookie 并将它们注入 HttpClient 或类似的类中,如果成功与否,则使用 fiddler 跟踪请求。
一旦套接字请求成功,我将相同的标头和 cookie 添加到 selenium 请求,并继续做我的 selenium 工作。
也许更长的方法,但总是和我一起工作,让我给你看一个 instagram 登录的例子:
var ig_did = driver.Manage().Cookies.GetCookieNamed("ig_did");
var sessionid = driver.Manage().Cookies.GetCookieNamed("sessionid");
var mid = driver.Manage().Cookies.GetCookieNamed("mid");
var ig_nrcb = driver.Manage().Cookies.GetCookieNamed("ig_nrcb");
var rur = driver.Manage().Cookies.GetCookieNamed("rur");
var csrftoken = driver.Manage().Cookies.GetCookieNamed("csrftoken");
var ds_user_id = driver.Manage().Cookies.GetCookieNamed("ds_user_id");
string ig_did_value = ig_did.ToString().Substring(0, ig_did.ToString().IndexOf(";")).Replace("ig_did=", "");
string sessionid_value = sessionid.ToString().Substring(0, sessionid.ToString().IndexOf(";")).Replace("sessionid=", "");
string mid_value = mid.ToString().Substring(0, mid.ToString().IndexOf(";")).Replace("mid=", "");
string ig_nrcb_value = ig_nrcb.ToString().Substring(0, ig_nrcb.ToString().IndexOf(";")).Replace("ig_nrcb=", "");
string rur_value = rur.ToString().Substring(0, rur.ToString().IndexOf(";")).Replace("rur=", "");
string ds_user_id_value = ds_user_id.ToString().Substring(0, ds_user_id.ToString().IndexOf(";")).Replace("ds_user_id=", "");
string csrftoken_value = csrftoken.ToString().Substring(0, csrftoken.ToString().IndexOf(";")).Replace("csrftoken=", "");
然后将它们注入 HttpClient 并用 fiddler 嗅探它们:
var baseAddress = new Uri("https://www.instagram.com");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler()
{
CookieContainer = cookieContainer,
Proxy = new WebProxy("127.0.0.1:8888", false),
UseProxy = true,
AllowAutoRedirect = true
})
using (httpclient = new HttpClient(handler) { BaseAddress = baseAddress })
{
httpclient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36");
httpclient.DefaultRequestHeaders.Add("X-CSRFToken", csrftoken_value);
httpclient.DefaultRequestHeaders.Add("Referer", "My_Instagram_URL");
httpclient.DefaultRequestHeaders.Add("X-IG-App-ID", Ig_app_Id_value);
httpclient.DefaultRequestHeaders.Add("Origin", "https://www.instagram.com");
httpclient.DefaultRequestHeaders.Add("Connection", "keep-alive");
httpclient.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");
httpclient.DefaultRequestHeaders.Add("Sec-Fetch-Site", "same-origin");
httpclient.DefaultRequestHeaders.Add("Sec-Fetch-Mode", "cors");
httpclient.DefaultRequestHeaders.Add("Sec-Fetch-Dest", "empty");
cookieContainer.Add(baseAddress, new System.Net.Cookie("ig_did", ig_did_value));
cookieContainer.Add(baseAddress, new System.Net.Cookie("mid", mid_value));
cookieContainer.Add(baseAddress, new System.Net.Cookie("ig_nrcb", ig_nrcb_value));
cookieContainer.Add(baseAddress, new System.Net.Cookie("csrftoken", csrftoken_value));
cookieContainer.Add(baseAddress, new System.Net.Cookie("sessionid", sessionid_value));
cookieContainer.Add(baseAddress, new System.Net.Cookie("rur", rur_value));
string url = "My_Instagram_URL";
var response = await httpclient.GetAsync(url);
}
如前所述,它看起来很长,但这总是有效的。
祝你好运。
推荐阅读
- amazon-web-services - AWS Glue 从 json 文件更改架构
- java - 从 CAS 检索属性时 MongoDB 对象 ID 更改
- sql - SP2-0552:未声明绑定变量“N3”
- javascript - 多个 div 根据按钮单击和输入的值显示隐藏行
- javascript - 将文件名从目录添加到对象
- r - R中基于条件组合的数据查询
- ios - 我们能否在将 Objc 对象从 void*“桥接”到 UIKit 对象之前检查它是否被释放?
- c++ - 在具有不同编译器的混合 C/C++ 项目中将 CMake 目标与 OpenMP 链接
- java - 描述 资源路径 位置 类型 方法 run(Class
, String[]) 对于 SpringBootApplication Application.java 类型未定义 - javascript - LWC 4 相关选项列表