如何保存 cookie 以供日后使用?
How to save cookies and use them later?
我登录网站 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”。也许我做错了什么。也许应该采取不同的方式。
谢谢!
根据我处理高级别 cookie 的经验,您无法按照我的方式掌握并找到问题的根源:
为 Firefox 或您使用的任何浏览器获取 Cookie 管理器扩展。
查看您在登录后获得了多少 cookiekey/value。
安装fiddler sniffer,浏览网站时登录后查看发送了多少请求
提取 cookie 并将它们注入 HttpClient 或类似的 class 并使用 fiddler 跟踪请求是否成功。
一旦套接字请求成功,我将相同的 headers 和 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);
}
</pre>
如前所述,它看起来很长,但这总是有效的。
祝你好运。
我登录网站 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
根据我处理高级别 cookie 的经验,您无法按照我的方式掌握并找到问题的根源:
为 Firefox 或您使用的任何浏览器获取 Cookie 管理器扩展。
查看您在登录后获得了多少 cookiekey/value。
安装fiddler sniffer,浏览网站时登录后查看发送了多少请求
提取 cookie 并将它们注入 HttpClient 或类似的 class 并使用 fiddler 跟踪请求是否成功。
一旦套接字请求成功,我将相同的 headers 和 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); } </pre>
如前所述,它看起来很长,但这总是有效的。
祝你好运。