C# 以编程方式登录instagram
我正在尝试使用web请求登录instagram。我不太明白发生了什么事。获取此信息:远程服务器返回错误:(403)禁止。到目前为止,我所拥有的:C# 以编程方式登录instagram,c#,login,webrequest,C#,Login,Webrequest,我正在尝试使用web请求登录instagram。我不太明白发生了什么事。获取此信息:远程服务器返回错误:(403)禁止。到目前为止,我所拥有的: public static string csrf; CookieContainer c1 = new CookieContainer(); private void button1_Click(object sender, EventArgs e) { string PostData = String
public static string csrf;
CookieContainer c1 = new CookieContainer();
private void button1_Click(object sender, EventArgs e)
{
string PostData = String.Format("csrfmiddlewaretoken={0}&username=ra123&password=ra12345678",getToken());
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://instagram.com/accounts/login/");
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.KeepAlive = true;
req.AllowAutoRedirect = true;
req.CookieContainer = c1;
byte[] byteArray = Encoding.ASCII.GetBytes(PostData);
req.ContentLength = byteArray.Length;
Stream dataStream = req.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Flush();
dataStream.Close();
HttpWebResponse webResp = (HttpWebResponse)req.GetResponse();
Stream datastream = webResp.GetResponseStream();
StreamReader reader = new StreamReader(datastream);
string s = reader.ReadToEnd();
MessageBox.Show(s);
if (s.Contains("ra123"))
{
MessageBox.Show("Loggedin");
}
else
{
MessageBox.Show("Not");
}
}
string getToken()
{
string p = "<input type=\"hidden\" name=\"csrfmiddlewaretoken\" value=\"(.*)\"/>";
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://instagram.com/accounts/login/");
req.Method = "GET";
req.CookieContainer = c1;
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream data = resp.GetResponseStream();
StreamReader sr = new StreamReader(data);
string src = sr.ReadToEnd();
Match m = Regex.Match(src, p);
if (m.Success)
{
return (m.Groups[1].Value.ToString());
}
return false.ToString();
}
公共静态字符串csrf;
CookieContainer c1=新CookieContainer();
私有无效按钮1\u单击(对象发送者,事件参数e)
{
string PostData=string.Format(“csrfmiddlewaretoken={0}&username=ra123&password=ra12345678”,getToken());
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(“https://instagram.com/accounts/login/");
请求方法=“POST”;
req.ContentType=“应用程序/x-www-form-urlencoded”;
req.KeepAlive=true;
req.AllowAutoRedirect=真;
req.CookieContainer=c1;
byte[]byteArray=Encoding.ASCII.GetBytes(PostData);
req.ContentLength=字节数组长度;
Stream dataStream=req.GetRequestStream();
写入(byteArray,0,byteArray.Length);
dataStream.Flush();
dataStream.Close();
HttpWebResponse webResp=(HttpWebResponse)req.GetResponse();
Stream datastream=webResp.GetResponseStream();
StreamReader=新的StreamReader(数据流);
字符串s=reader.ReadToEnd();
MessageBox.Show(s);
如果(s.包含(“ra123”))
{
MessageBox.Show(“Loggedin”);
}
其他的
{
MessageBox.Show(“Not”);
}
}
字符串getToken()
{
字符串p=“”;
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(“https://instagram.com/accounts/login/");
req.Method=“GET”;
req.CookieContainer=c1;
HttpWebResponse resp=(HttpWebResponse)req.GetResponse();
流数据=resp.GetResponseStream();
StreamReader sr=新的StreamReader(数据);
字符串src=sr.ReadToEnd();
匹配m=正则表达式匹配(src,p);
如果(m.成功)
{
返回(m.Groups[1].Value.ToString());
}
返回false.ToString();
}
仅供参考,这不会解决您的问题,但您需要学会使用块将流
和其他实现IDisposable
的对象放入:
public static string csrf;
CookieContainer c1 = new CookieContainer();
private void button1_Click(object sender, EventArgs e)
{
string PostData = String.Format("csrfmiddlewaretoken={0}&username=ra123&password=ra12345678", getToken());
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://instagram.com/accounts/login/");
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.KeepAlive = true;
req.AllowAutoRedirect = true;
req.CookieContainer = c1;
byte[] byteArray = Encoding.ASCII.GetBytes(PostData);
req.ContentLength = byteArray.Length;
using (Stream dataStream = req.GetRequestStream())
{
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Flush();
dataStream.Close();
}
string s;
using (HttpWebResponse webResp = (HttpWebResponse)req.GetResponse())
{
using (Stream datastream = webResp.GetResponseStream())
{
using (StreamReader reader = new StreamReader(datastream))
{
s = reader.ReadToEnd();
}
}
}
MessageBox.Show(s);
if (s.Contains("ra123"))
{
MessageBox.Show("Loggedin");
}
else
{
MessageBox.Show("Not");
}
}
string getToken()
{
string p = "<input type=\"hidden\" name=\"csrfmiddlewaretoken\" value=\"(.*)\"/>";
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://instagram.com/accounts/login/");
req.Method = "GET";
req.CookieContainer = c1;
string src;
using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
{
using (Stream data = resp.GetResponseStream())
{
using (StreamReader sr = new StreamReader(data))
{
src = sr.ReadToEnd();
}
}
}
Match m = Regex.Match(src, p);
if (m.Success)
{
return (m.Groups[1].Value.ToString());
}
return false.ToString();
}
公共静态字符串csrf;
CookieContainer c1=新CookieContainer();
私有无效按钮1\u单击(对象发送者,事件参数e)
{
string PostData=string.Format(“csrfmiddlewaretoken={0}&username=ra123&password=ra12345678”,getToken());
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(“https://instagram.com/accounts/login/");
请求方法=“POST”;
req.ContentType=“应用程序/x-www-form-urlencoded”;
req.KeepAlive=true;
req.AllowAutoRedirect=真;
req.CookieContainer=c1;
byte[]byteArray=Encoding.ASCII.GetBytes(PostData);
req.ContentLength=字节数组长度;
使用(Stream dataStream=req.GetRequestStream())
{
写入(byteArray,0,byteArray.Length);
dataStream.Flush();
dataStream.Close();
}
字符串s;
使用(HttpWebResponse webResp=(HttpWebResponse)req.GetResponse())
{
使用(Stream datastream=webResp.GetResponseStream())
{
使用(StreamReader=新StreamReader(数据流))
{
s=reader.ReadToEnd();
}
}
}
MessageBox.Show(s);
如果(s.包含(“ra123”))
{
MessageBox.Show(“Loggedin”);
}
其他的
{
MessageBox.Show(“Not”);
}
}
字符串getToken()
{
字符串p=“”;
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(“https://instagram.com/accounts/login/");
req.Method=“GET”;
req.CookieContainer=c1;
字符串src;
使用(HttpWebResponse resp=(HttpWebResponse)req.GetResponse())
{
使用(Stream data=resp.GetResponseStream())
{
使用(StreamReader sr=新的StreamReader(数据))
{
src=sr.ReadToEnd();
}
}
}
匹配m=正则表达式匹配(src,p);
如果(m.成功)
{
返回(m.Groups[1].Value.ToString());
}
返回false.ToString();
}
登录的问题是,请求需要在标题处设置cookie,而容器没有设置cookie,因为当您从未知资源管理器访问时,每次登录都会更改cookie。以下是您可以做的:
WebResponse Response;
HttpWebRequest Request;
Uri url = new Uri("http://thewebpage.com:port/login/");
CookieContainer cookieContainer = new CookieContainer();
Request = (HttpWebRequest)WebRequest.Create(url);
Request.Method = "GET";
Request.CookieContainer = cookieContainer;
// Get the first response to obtain the cookie where you will find the "csrfmiddlewaretoken" value
Response = Request.GetResponse();
string Parametros = "csrfmiddlewaretoken=" + cookieContainer.GetCookies(url)["csrftoken"].Value + "&username=USER&password=PASSWORD&next="; // This whill set the correct url to access
Request = (HttpWebRequest)WebRequest.Create(url); // it is important to use the same url used for the first request
Request.Method = "POST";
Request.ContentType = "application/x-www-form-urlencoded";
Request.UserAgent = "Other";
// Place the cookie container to obtain the new cookies for further access
Request.CookieContainer = cookieContainer;
Request.Headers.Add("Cookie",Response.Headers.Get("Set-Cookie")); // This is the most important step, you have to place the cookies at the header (without this line you will get the 403 Forbidden exception
byte[] byteArray = Encoding.UTF8.GetBytes(Parametros);
Request.ContentLength = byteArray.Length;
Stream dataStream = Request.GetRequestStream();
dataStream.Responseite(byteArray, 0, byteArray.Length);
dataStream.Close();
Response = Request.GetResponse();
这对我有什么帮助?我是说“使用”积木有什么好处。另外,我真的很感激这一点,但我现在只需要解决我的问题:(@JohnSaunders)这不是一个答案吗?它使它成为一个大的、格式化的、标记为CW的注释。接下来会发生什么并不取决于我。