3

我正在尝试使用网络请求登录 Instagram。我很难理解发生了什么。得到这个:远程服务器返回一个错误:(403)禁止。到目前为止我所拥有的:

    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();
    }
4

2 回答 2

2

登录的问题是请求需要在标头处设置 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();
于 2013-08-28T12:15:33.987 回答
0

仅供参考,这不会解决您的问题,但是您需要学习将Stream实现的对象和其他对象IDisposable放入using块中:

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();
}
于 2012-12-24T22:50:58.540 回答