以编程方式登录Instagram

3

我正在尝试使用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();
    }
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();

0

顺便说一下,这并不能解决你的问题,但你需要学会将实现IDisposable接口的Stream和其他对象放入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();
}

这会对我有什么帮助呢?也就是说,“使用”块的好处是什么?此外,我非常感激您的帮助,但我现在只需要解决我的问题 :( - user1815324
@JohnSaunders 这不是一个答案吗? - bmargulies
2
它将生成一个大型格式化的CW标记注释。接下来发生什么取决于我。 - John Saunders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接