【问题标题】:How can i login to linkedin using HTTP POST Request with C#我如何使用带有 C# 的 HTTP POST 请求登录到linkedin
【发布时间】:2023-09-22 09:01:01
【问题描述】:

我正在开发一个简单的 Windows 窗体程序,它从“文本框”获取用户名和密码,然后在“消息框”中显示我的链接名称。

我想通过使用“HttpWebRequest”或使用任何方法将我的 POST 请求发送到 Linked-in 来完成代码,然后我可以获得响应并找到我的名字以将其显示在“消息框”中。

我熟悉创建“GET”请求,并且我提出了一些“POST”请求,但在这种情况下,我不知道如何使用 POST 请求发送我的“txt_UserName.Text”和“txt_Password”和我怎样才能收到响应。

当我尝试登录时,我尝试使用 Fiddler 从linkedin 捕获 POST 请求(=POST),但是当我看到它们的标头时它捕获了超过 4 个请求,这似乎是一个 GET 请求,这是一个示例:

GET /nhome/?trk= HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

它们都有多个 cookie 值。

这是我的 POST 请求代码:

    public void SubmitData()
    {
        try
        {              
            string postData = "This is a test that posts this string to a Web server.";
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);

            // Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create("http://www.linkedin.com");
            // Set the Method property of the request to POST.
            request.Method = "POST";
            // Set the ContentLength property of the WebRequest.
            request.ContentLength = byteArray.Length;
            //Content Length
            request.ContentLength = byteArray.Length;

            // Get the request stream.
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close();

            // Get the response.
            WebResponse response = request.GetResponse();
            dataStream = response.GetResponseStream();

            StreamReader sr = new StreamReader(dataStream);
            MessageBox.Show(sr.ReadToEnd());

            sr.Close();
            dataStream.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
        }
    }

现在我唯一想知道的是,我如何将我的用户名和密码作为值发送到登录链接?


编辑:

下面是我的第二次尝试,没关系,我现在可以在 postData 中发送用户和密码,我可以存储 Cookie 并检索它。但有两个问题: 1-我怎样才能确保登录完成并且没有失败 2-如果登录完成,我想知道从个人资料中获取我的名字的第二步是什么,是提出了另一个请求还是什么?

  private void button1_Click(object sender, EventArgs e)
    {
        PostMessage();
    }


    private void PostMessage()
    {
        try { 

        // POST Data and the POST uri
        string    postData = "isJsEnabled=true&source_app=&session_key=" + textBox1.Text + "&session_password=" + textBox2.Text + "&signin=Sign+In&session_redirect=";
        string    uri = "https://www.linkedin.com/uas/login-submit";

        // Encoding the POST Data
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);

        // Create the POST Request
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(uri);

        //POST Parameters (Method and etc.)
        WebReq.Method = "POST";
        WebReq.ContentType = "application/x-www-form-urlencoded";
        WebReq.ContentLength = byteArray.Length;

        // Set the POST Request Cookies
        var cookieContainer = new CookieContainer();
        WebReq.CookieContainer = cookieContainer;

        // Get the request stream.
        Stream dataStream = WebReq.GetRequestStream();
        // Write the data to the request stream.
        dataStream.Write(byteArray, 0, byteArray.Length);
        // Close the Stream object.
        dataStream.Close();


        // Get the response.
        HttpWebResponse response = (HttpWebResponse)WebReq.GetResponse();
        dataStream = response.GetResponseStream();

        StreamReader sr = new StreamReader(dataStream);
        //MessageBox.Show(sr.ReadToEnd());
        sr.Close();
        dataStream.Close();

        if (response.StatusCode != HttpStatusCode.OK)
        {
            MessageBox.Show(" Error: " + response.StatusDescription);
            response.Close();
        }

        foreach (Cookie cook in response.Cookies)
        {
            MessageBox.Show(cook.Name + " " + cook.Value);
        }

            }

        catch (Exception ex)
        {
            MessageBox.Show("POST Message Error: " + ex.Message);
        }

    }

【问题讨论】:

标签: c# .net http post fiddler


【解决方案1】:

我在登录时使用了 Fiddler,发现了一个对 https://www.linkedin.com/uas/login-submit 的请求,其中包含用户名和密码。找到了?现在,如果您想完全从 HTTP 请求的角度来看它,您将必须弄清楚如何使用浏览器发送和接收的其他请求和响应在 post data/cookie 标头中生成其他数据此特定请求之前的站点(信息应该在那里)。我认为这将引导您完成您需要做的事情,但还有一些工作要做!

【讨论】:

  • 谢谢,我试图找到它,但我找不到。我会再试一次,再给你重播一次。
  • 好的,我找到了 POST 请求 POST /uas/login-submit HTTP/1.1 并且有很多 cookie 值,但我的问题是我怎么知道我应该使用哪个 cookie 密钥以及如何通过我的文本框值(txt_User.Text 和 txt_Pass.Text)作为 cookie 值来获得响应我认为我应该给你一个正确的答案,但我希望你能在这方面帮助我
  • 密码字符串在 PostData 中,因此您只需通过 string.Format 将 POST 正文的相应字段替换为用户名密码即可(使用您的代码)。使用 fiddler 的 WebForms 选项卡查看细分的字段。右键单击 Fiddler 上的请求->Replay->Reissue from Composer 并查看如果您在没有所有必需数据的情况下重新执行它,它将无法正常工作。筛选这些数据以获取请求的信息需要做一些工作。
  • Anwyay 如果你以前从未真正做过这件事,我认为你应该从一个更简单的网站开始用于教育目的,也许你不需要 cookie 并且你不需要很多POST 字符串中的其他数据。
  • 我照你说的做。但请你看看我在问题中的最后一次编辑,如果你能用代码编辑你的答案。谢谢
【解决方案2】:

你需要的比你想象的要多,有很好的文档说明如何做到这一点只是here,你将需要一个身份验证令牌等,这是因为像其他服务一样,例如谷歌,他们正在使用 oauth2 来保护应用程序等。

oauth 通过发布令牌和刷新令牌来工作,并且有一点学习曲线,但并不是特别困难。

基本上会发生以下情况

  1. 您在链接中注册您的应用程序,他们会给您一个 客户端密码。
  2. 您将此代码传递给您的应用程序中的链接 他们将生成一个身份验证屏幕,说明该应用程序是 请求许可。
  3. 然后你批准它,它会给你一个访问令牌
  4. 然后您使用访问令牌登录(linkedin 上的访问令牌有效期为 60 天,此时您必须刷新它们)。

从好的方面来说,api 中的链接非常简单,一旦获得授权,您就可以很容易地获得东西。所有这些都在逐步提供的链接中进行了详细说明。

顺便说一句,还有一个 nuget 包可以让您访问个人资料信息。

试试Install-Package LinkedIn

我应该指出,上面的 nuget 包为您提供了一个登录提供程序来帮助您进行身份验证,如果您不想自己推出的话。

在下面的 cmets 之后添加。

如果您只想知道如何发送发布请求,这里有一段通用代码可以做到这一点:

string url = "www.foo.bar.com";

using (var webClient= new WebClient())
{
    var data = new NameValueCollection();
    data["username"] = "<yourusername>";
    data["password"] = "<yourPassword>";

    var response = webClient.UploadValues(url, "POST", data);
}

注意:因为它是一个 web uri,所以你应该在这里的方法参数中使用 POST。

【讨论】:

  • 我知道我可以使用 API,但我认为我应该只使用 HTTP 请求而不使用 API。我通过这个例子来了解更多关于 HTTP 请求和响应的信息。
  • 恐怕不是你的本意。
  • 我知道这种方式可能不是正确的方式,但是当我以非法方式使用它时。我只是写一个测试程序。我的目标没有链接,但我的目标是如何使用 HTTP 请求,使用 C# 响应
  • 如果这是您想要的,请添加通用帖子详细信息。
  • 谢谢你,你的答案很清楚,我现在试试,再给你重播
【解决方案3】:

您遇到的问题是 Linkedin 在登录会话中使用重定向并且难以捕捉。 因此,您需要在登录会话中以某种方式对其重定向到 https://www.linkedin.com/nhome/?trk= 进行编码,这提供了用户页面访问权限。

我也在对此进行测试,但是通常无法弄清楚这部分 httpWebRequest.AllowAutoRedirect = true; 应该可以解决问题,但在这种情况下它不起作用。

所以,如果你找到解决方案,请告诉我,如果我找到了也会发布。

【讨论】: