首页 > 解决方案 > 如何保存 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”。也许我做错了什么。也许它应该以不同的方式完成。谢谢!

在此处输入图像描述

标签: c#seleniumselenium-webdrivercookies

解决方案


根据我处理高级别 cookie 的经验,您无法掌握并以我的方式解决问题的根源:

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

  2. 查看您在登录后获得了多少 cookie 键/值。

  3. 安装 fiddler 嗅探器,在浏览网站时查看其中有多少在登录后发送请求。

  4. 提取该 cookie 并将它们注入 HttpClient 或类似的类中,如果成功与否,则使用 fiddler 跟踪请求。

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

                     

                      


                    }

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

祝你好运。


推荐阅读