使用HttpWebRequest登录到instagram

时间:2014-03-17 16:22:03

标签: c# instagram

嘿伙计们,所以我正在尝试编写一个C#应用程序,用户可以从WPF登录到他们的Instagram帐户。我遇到的问题是获取授权码。当我使用这段代码时,我不断获取登录页面的URL,而不是成功的登录页面。

请帮忙! 任何反馈表示赞赏!被困在这一段时间

private static AuthInfo GetInstagramAuth(string oAuthUri,  string clientId, string redirectUri, InstagramConfig config,
        string login, string password)
    {
        List<Auth.Scope> scopes = new List<Auth.Scope>();
        scopes.Add(Auth.Scope.basic);

        var link = InstaSharp.Auth.AuthLink(oAuthUri, clientId, redirectUri, scopes);

        // Логинимся по указанному узлу
        CookieAwareWebClient client = new CookieAwareWebClient();
        // Зашли на страницу логина
        var result = client.DownloadData(link);
        var html = System.Text.Encoding.Default.GetString(result);

        // Берем токен
        string csr = "";
        string pattern = @"csrfmiddlewaretoken""\svalue=""(.+)""";
        var r = new System.Text.RegularExpressions.Regex(pattern);
        var m = r.Match(html);
        csr = m.Groups[1].Value;

        // Логинимся
        string loginLink = string.Format(
            "https://instagram.com/accounts/login/?next=/oauth/authorize/%3Fclient_id%3D{0}%26redirect_uri%3Dhttp%3A//kakveselo.ru%26response_type%3Dcode%26scope%3Dbasic", clientId);

        NameValueCollection parameters = new NameValueCollection();
        parameters.Add("csrfmiddlewaretoken", csr);
        parameters.Add("username", login);
        parameters.Add("password", password);

        // Нужно добавить секретные кукисы, полученные перед логином

        // Нужны заголовки что ли
        string agent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
        client.Headers["Referer"] = loginLink;
        client.Headers["Host"] = "instagram.com";
        //client.Headers["Connection"] = "Keep-Alive";
        client.Headers["Content-Type"] = "application/x-www-form-urlencoded";
        //client.Headers["Content-Length"] = "88";
        client.Headers["User-Agent"] = agent;
       // client.Headers["Accept-Language"] = "ru-RU";
        //client.Headers["Accept-Encoding"] = "gzip, deflate";
        client.Headers["Accept"] = "text/html, application/xhtml+xml, */*";
        client.Headers["Cache-Control"] = "no-cache";

        // Запрос
        var result2 = client.UploadValues(loginLink, "POST", parameters);

        // Постим данные, Получаем code
        // New link не на апи, а на instagram
        string newPostLink = string.Format(
            "https://instagram.com/oauth/authorize/?client_id={0}&redirect_uri=http://kakveselo.ru&response_type=code&scope=basic", clientId);

        HttpWebRequest request =
            (HttpWebRequest) WebRequest.Create(newPostLink);
        request.AllowAutoRedirect = false;
        request.CookieContainer = client.Cookies;
        request.Referer = newPostLink;
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.UserAgent = agent;

        string postData = String.Format("csrfmiddlewaretoken={0}&allow=Authorize", csr);
        request.ContentLength = postData.Length;

        ASCIIEncoding encoding = new ASCIIEncoding();
        byte[] loginDataBytes = encoding.GetBytes(postData);
        request.ContentLength = loginDataBytes.Length;
        Stream stream = request.GetRequestStream();
        stream.Write(loginDataBytes, 0, loginDataBytes.Length);

        // send the request
        var response = request.GetResponse();
        string location = response.Headers["Location"];

        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("--Responce from the webrequest--");
        Console.ResetColor();
        Console.WriteLine(((HttpWebResponse)response).ResponseUri+"\n\n");


        // Теперь вытаскиваем код и получаем аутентификацию
        pattern = @"kakveselo.ru\?code=(.+)";
        r = new System.Text.RegularExpressions.Regex(pattern);
        m = r.Match(location);
        string code = m.Groups[1].Value;

        // Наконец, получаем токен аутентификации
        var auth = new InstaSharp.Auth(config); //.OAuth(InstaSharpConfig.config);

        // now we have to call back to instagram and include the code they gave us
        // along with our client secret
        var oauthResponse = auth.RequestToken(code);

        return oauthResponse;
    }
}

我使用此website作为示例,CookieAwareWebClient只是处理WebClient的{​​{1}}。我将在下面发布:

Cookies

2 个答案:

答案 0 :(得分:2)

您确定网站上的登录过程在某些步骤中不使用javascript吗? 据我所知,如果是这种情况,webrequests将无法完成这项工作。

与javascript相关的所有数据/操作将仅通过webrequests不存在。 我注意到,出于安全原因,带有个人帐户的网站现在倾向于将他们的登录过程与javascript混合,以避免机器人请求。

答案 1 :(得分:1)

好吧所以我想出了这个问题。如果要使用Webrequests和Web响应,则需要确保标头信息正确无误。我的问题是我没有从浏览器传递足够的信息。要查看此信息,请使用Tamper Data 它是Firefox的附加功能,允许您查看发送到服务器或从服务器接收的所有内容。