C# 使用HttpWebRequest登录instagram

C# 使用HttpWebRequest登录instagram,c#,instagram,C#,Instagram,嘿,伙计们,我正在尝试编写一个C#应用程序,用户可以从WPF登录到他们的instagram帐户。我遇到的问题是获取授权码。当我使用这段代码时,我总是得到登录页面URL,而不是成功登录页面 救命啊! 任何反馈都将不胜感激!我被困在这个问题上有一段时间了 private static AuthInfo GetInstagramAuth(string oAuthUri, string clientId, string redirectUri, InstagramConfig config,

嘿,伙计们,我正在尝试编写一个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;
    }
}

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

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

好的,所以我解决了这个问题。如果要使用webrequests和webresponses,则需要确保标题信息正确。我的问题是我没有从浏览器中传递足够的信息。要查看我使用的这些信息
它是Firefox的一个附加组件,允许您查看向服务器发送或从服务器接收的所有信息

我肯定Instagram使用javascript,但是为什么webrequest不能工作呢?我认为webrequest就像在GUI上手动输入信息一样,只是它是“幕后的”?检查这个链接:好的,谢谢,这是一个非常有用的答案!现在我知道,如果需要,我可以使用WebBrowser对象。不过,还有一个问题,理想情况下,我真正想要的是网站登录,然后它将生成webrequest,并将用户访问令牌附加到新webaddress的末尾。因此,如果它的javascript无法使用WebRequests访问该访问令牌?+1感谢您的帮助!我想这可能就是问题所在
    using System;
/// <summary>
/// A Cookie-aware WebClient that will store authentication cookie information and persist it through subsequent requests.
/// </summary>
using System.Net;



public class CookieAwareWebClient : WebClient
{
    //Properties to handle implementing a timeout
    private int? _timeout = null;
    public int? Timeout
    {
        get
        {
            return _timeout;
        }
        set
        {
            _timeout = value;
        }
    }

    //A CookieContainer class to house the Cookie once it is contained within one of the Requests
    public CookieContainer Cookies { get; private set; }

    //Constructor
    public CookieAwareWebClient()
    {
        Cookies = new CookieContainer();
    }

    //Method to handle setting the optional timeout (in milliseconds)
    public void SetTimeout(int timeout)
    {
        _timeout = timeout;
    }

    //This handles using and storing the Cookie information as well as managing the Request timeout
    protected override WebRequest GetWebRequest(Uri address)
    {
        //Handles the CookieContainer
        var request = (HttpWebRequest)base.GetWebRequest(address);
        request.CookieContainer = Cookies;
        //Sets the Timeout if it exists
        if (_timeout.HasValue)
        {
            request.Timeout = _timeout.Value;
        }
        return request;
    }

}