如何保存 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 的经验,您无法按照我的方式掌握并找到问题的根源:

  1. 为 Firefox 或您使用的任何浏览器获取 Cookie 管理器扩展。

  2. 查看您在登录后获得了多少 cookiekey/value。

  3. 安装fiddler sniffer,浏览网站时登录后查看发送了多少请求

  4. 提取 cookie 并将它们注入 HttpClient 或类似的 class 并使用 fiddler 跟踪请求是否成功。

  5. 一旦套接字请求成功,我将相同的 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>

如前所述,它看起来很长,但这总是有效的。

祝你好运。