C# 如何使用带有C的HTTP POST请求登录linkedin
我正在开发一个简单的Windows窗体程序,它从文本框中获取用户名和密码,然后在消息框中显示我的链接名 我想通过使用HttpWebRequest或使用任何方法将我的POST请求发送到Linked in来完成代码,然后我可以得到响应并找到我的名字,并将其显示在Messagebox中 我熟悉创建GET请求,也提出了一些POST请求,但在这种情况下,我不知道如何在POST请求中发送我的txt_UserName.Text和txt_密码,以及如何接收响应 当我尝试登录时,我尝试使用Fiddler从linkedin捕获POST request=POST,但当我看到它们的标题时,它捕获了4个以上的请求,看起来像GET请求。这是一个示例:C# 如何使用带有C的HTTP POST请求登录linkedin,c#,.net,http,post,fiddler,C#,.net,Http,Post,Fiddler,我正在开发一个简单的Windows窗体程序,它从文本框中获取用户名和密码,然后在消息框中显示我的链接名 我想通过使用HttpWebRequest或使用任何方法将我的POST请求发送到Linked in来完成代码,然后我可以得到响应并找到我的名字,并将其显示在Messagebox中 我熟悉创建GET请求,也提出了一些POST请求,但在这种情况下,我不知道如何在POST请求中发送我的txt_UserName.Text和txt_密码,以及如何接收响应 当我尝试登录时,我尝试使用Fiddler从link
GET /nhome/?trk= HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
它们都有多个cookies值
这是我的邮政编码:
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中发送用户和密码,我可以存储Cookies并检索它。但有两个问题:
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);
}
}
你需要比你想象的更多的东西来登录。关于如何登录,有很好的文档,你需要一个身份验证令牌等,这是因为像其他服务一样,例如谷歌,他们使用oauth2来保护应用程序等 oauth通过发布令牌和刷新令牌来工作,有一点学习曲线,但并不特别困难 基本上发生了以下情况 你向linked in注册你的应用程序,他们会给你一个 客户机密。 将此代码传递给应用程序中的链接 他们将生成一个auth屏幕,显示应用程序正在运行 请求许可。 然后您批准此操作,它将为您提供一个访问令牌 然后使用访问令牌登录linkedin上的访问令牌有效期为60天,此时必须刷新它们。 另一方面,api中的链接非常直接,一旦授权,您将能够非常轻松地获取内容。所有这些都在nice逐步提供的链接中详细介绍 顺便说一下,还有一个nuget软件包,可以让您访问配置文件信息 尝试安装LinkedIn软件包 我应该指出,上面的nuget包为您提供了一个登录提供程序,如果您不想使用自己的登录,它可以帮助您进行身份验证 在您的评论之后添加 如果您只想知道如何发送post请求,那么下面是一段通用代码:
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。我在登录时使用了Fiddler,发现一个包含用户名和密码的请求。找到了吗?现在,如果您想完全从HTTP请求的角度来看待它,那么您必须找出如何使用浏览器在该特定请求之前向站点发送和接收的其他请求和响应来生成post数据/cookie头中的其他数据信息。我想这会引导你去做你需要做的事情,但是还有一些工作要做 您遇到的问题是,Linkedin在登录会话中使用重定向,并且不同于捕获。 因此,在登录会话中,您需要编写代码,使其重定向到提供用户页面访问的页面 我也在用它进行测试,但是通常情况下,我并没有设法弄明白这一部分 httpWebRequest.AllowAutoRedirect=true; 应该这样做,但不是在这种情况下,它不工作
因此,如果你找到了解决方案,请告诉我,如果我找到了,我也会发布它。你阅读了LinkedIn的文档吗?使用LinkedIn按钮登录是一种身份验证机制,最好使用API来获取这家伙要找的数据。我知道我可以使用API,但我认为我应该只使用HTTP请求而不使用API。我通过这个例子来了解更多关于HTTP请求和响应的信息。恐怕这不是你想要的方式。我知道这种方式可能不是正确的方式,但是当我以非法方式使用它时。我只是在写一个测试程序。我的目标未链接,但我的目标是如何使用HTTP请求、响应和CAdded通用帖子详细信息,如果这是您想要的。谢谢,您的答案很清楚,我现在将尝试并重新播放给您谢谢,我试图找到它,但我找不到。我将再次尝试并重播给您。好的,我找到了POST请求POST/uas/login submit HTTP/1.1,有很多cookie值,但我的问题是如何知道我使用了哪个cookie键
应该使用以及如何将我的文本框值txt_User.Text和txt_pass.Text作为cookies值传递,以获得响应我认为我应该给你一个正确的答案,但我希望你能在这方面帮助我。密码字符串在PostData中,因此,您只需通过一个string.Format(可能使用您的代码)将帖子正文的相应字段替换为用户名密码。使用fiddler的WebForms选项卡查看字段的明细。右键单击Fiddler->Replay->Reissue from Composer上的请求,并查看如果您在没有所有必需数据的情况下重新执行它,它将无法工作。筛选这些数据以获取请求的信息需要一点工作。安维,如果你以前从未这样做过,我认为你应该从一个更简单的网站开始,用于教育目的,也许在那里你不需要cookies,也不需要POST字符串中的大量其他数据。我照你说的做。但是,请你看看我最后一次编辑的问题,如果你可以编辑你的答案与代码。谢谢