登录Instagram的编程(Login to instagram programmatically

2019-07-17 13:36发布

我试图登录使用Web请求的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();
    }

Answer 1:

与登录的问题是,该请求需要在头设置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();


Answer 2:

仅供参考,这不会解决你的问题,但你需要学会把你的Stream ,并实现其他目标IDisposableusing块:

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


文章来源: Login to instagram programmatically