0

Aller ci-dessous pour voir la réponseFacebook jeton d'accès - Automatiser Obtenir le jeton

Je reçois l'amende jeton d'accès Facebook, mais où j'ai des problèmes est quand je suis en train d'automatiser ce processus.

Si je visite cette URL est le navigateur que je reçois le jeton d'accès très bien.

Exemple:

Je coller dans le navigateur et le retour a frappé.

https://www.facebook.com/dialog/oauth?client_id=324234343434&scope=['ads_read', 'ads_management']&redirect_uri=http://www.kb-demos.com/login_success.html&response_type=token

Puis-je obtenir envoyé à cette page:

http://www.kb-demos.com/login_success.html?#access_token=34543534534534KJ534LKJLKJLKHLH4534534J5KH345KJ3L4H53KJ5H3K4LJH34KH54K&expires_in=5180653

j'ai changé la pièce jeton d'accès de sorte que son pas un vrai jeton

Viola jeton d'accès! Ce que j'essaye de faire est de reproduire ce même comportement avec du code. Je me rapproche mais pas tout à fait là.

Je continue d'obtenir l'erreur user_denied.

% 3Ferror% 3Daccess_denied% 26error_code% 3D200% 26error_description% 3DPermissions% 2Berror% 26error_reason% 3Duser_denied% 23_% 3D_ & display = & la page locale = fr = & logger_id 786a3153-1d81-415c-8dca-f8fa8b0cd630

Je publie tous les en-têtes sur la console. C'est l'en-tête de l'emplacement que je suis préoccupé par **

Je pense que cela a à voir avec la redirection 302?

ApplicationId = request.ClientId; 
string permissions = "['ads_management', 'ads_read']"; 

var destinationURL = String.Format(
@"https://www.facebook.com/dialog/oauth?client_id={0}&scope={1}&redirect_uri=http://www.kb-demos.com/login_success.html&response_type=token", 
ApplicationId, 
permissions); 

// Create a new 'HttpWebRequest' Object to the mentioned URL. 
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(destinationURL); 
myHttpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"; 

myHttpWebRequest.AllowAutoRedirect = false; 
// Assign the response object of 'HttpWebRequest' to a 'HttpWebResponse' variable. 
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 

//Console.WriteLine("\nThe HttpHeaders are \n\n\tName\t\tValue\n{0}", myHttpWebRequest.Headers); // my http headers 
// Print the HTML contents of the page to the console. 


var headers = myHttpWebResponse.Headers; 

// output all the headers 
foreach(var header in headers) { 
    Console.WriteLine(header.ToString() + ": " + headers[header.ToString()] + "\n"); 

} 

#region 
//Stream streamResponse = myHttpWebResponse.GetResponseStream(); 
//StreamReader streamRead = new StreamReader(streamResponse); 
//Char[] readBuff = new Char[256]; 
//int count = streamRead.Read(readBuff, 0, 256); 
//Console.WriteLine("\nThe HTML contents of page the are : \n\n "); 
//while (count > 0) 
//{ 
// String outputData = new String(readBuff, 0, count); 
// Console.Write(outputData); 
// count = streamRead.Read(readBuff, 0, 256); 
//} 
//// Close the Stream object. 
//streamResponse.Close(); 
//streamRead.Close(); 
// Release the HttpWebResponse Resource. 
#endregion 


myHttpWebResponse.Close(); 

Console.ReadLine(); 

Je reçois une erreur user_denied ici. Mais dans le navigateur, je reçois un jeton parfait. Je ne peux pas comprendre pourquoi.

enter image description here

Les en-têtes dans l'en-tête de l'emplacement, il semble fonctionner lors de l'utilisation du navigateur.

Scénario possible si je n'arrive pas à obtenir ce qui précède: Je me demandais s'il y a un navigateur avec une API? Quelque chose que je peux appeler à partir de la ligne de commande - transmettre certains arguments - et ensuite obtenir l'URL de redirection est une variable à analyser?

+0

Vous n'êtes pas censé cette « automatiser ». Grattage des pages Facebook, et en utilisant des outils automatisés sur leur site, est explicitement contre leur ToS. – CBroe

+0

@CBroe lmao. Je ne pense pas que vous comprenez le but de cette application. Je possède le compte qui accorde l'accès à cette application. Je lance cette application sur un travail planifié pour obtenir un jeton d'accès tous les jours, donc je peux exécuter une autre application que j'ai développée pour obtenir des rapports SEO pour de nombreux clients, plutôt que de se connecter manuellement pour chaque client. . – Radmation

+0

@CBroe Le problème était que le jeton d'accès expire tous les 60 jours. J'ai maintenant automatisé la récupération des tokens d'accès, donc je n'ai plus besoin de le toucher. Plus une raison majeure pour avoir l'API est d'automatiser les tâches. Je ne suis pas en train de "gratter le site", je donne simplement accès à mon compte facebook. – Radmation

Répondre

-1

Ce code automatisera la récupération de access_token. Vous devez avoir des informations d'identification sur le compte pour lequel vous demandez un jeton d'accès.

Mise à jour

Première connexion au compte facebook.

 // LOG INTO FACEBOOK ACCT 
     string email = "[email protected]"; 
     string pw = "yourPassWord"; 

     CookieContainer cookieJar = new CookieContainer(); 

     HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create("https://www.facebook.com"); 
     request1.CookieContainer = cookieJar; 

     request1.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"; 

     //Get the response from the server and save the cookies from the first request.. 
     HttpWebResponse response = (HttpWebResponse)request1.GetResponse(); 
     var cookies = response.Cookies; 
     cookieJar.Add(cookies); 
     response.Close();// close the response 


     string getUrl = "https://www.facebook.com/login.php?login_attempt=1"; 

     string postData = String.Format("email={0}&pass={1}", email, pw); 
     HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl); 
     getRequest.CookieContainer = cookieJar; 
     //Adding Previously Received Cookies 
     getRequest.CookieContainer.Add(cookies); 
     getRequest.Method = WebRequestMethods.Http.Post; 
     getRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"; 
     getRequest.AllowWriteStreamBuffering = true; 
     getRequest.ProtocolVersion = HttpVersion.Version11; 
     getRequest.AllowAutoRedirect = true; 
     getRequest.ContentType = "application/x-www-form-urlencoded"; 

     byte[] byteArray = Encoding.ASCII.GetBytes(postData); 
     getRequest.ContentLength = byteArray.Length; 
     Stream newStream = getRequest.GetRequestStream(); //open connection 
     newStream.Write(byteArray, 0, byteArray.Length); // Send the data. 
     newStream.Close(); 

     HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse(); 
     using (StreamReader sr = new StreamReader(getResponse.GetResponseStream())) 
     { 
      string sourceCode = sr.ReadToEnd(); 
     } 

demander ensuite le access_token

   ApplicationId = request.ClientId; // your application id 
       string permissions = "['ads_management', 'ads_read']"; 

       var destinationURL = String.Format(
       @"https://www.facebook.com/dialog/oauth?client_id={0}&scope={1}&redirect_uri=http://www.kb-demos.com/login_success.html&response_type=token", 
       ApplicationId, 
       permissions); 

       // Create a new 'HttpWebRequest' Object to the mentioned URL. 
       HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(destinationURL); 
       // use the same cookie container and cookies 
       myHttpWebRequest.CookieContainer = cookieJar; 
       myHttpWebRequest.CookieContainer.Add(cookies); //recover cookies First request 

       myHttpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"; 

       myHttpWebRequest.AllowAutoRedirect = false; 
       // Assign the response object of 'HttpWebRequest' to a 'HttpWebResponse' variable. 
       HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 

       Console.WriteLine("\nThe Request HttpHeaders are \n\n\tName\t\tValue\n{0}", myHttpWebRequest.Headers); // my http headers 
       Console.WriteLine("\nThe Request HttpHeaders are \n\n\tName\t\tValue\n{0}", myHttpWebRequest.CookieContainer); // my http headers 
       //Console.WriteLine("\nThe Request HttpHeaders are \n\n\tName\t\tValue\n{0}", cookies); // my http headers 

       var headers = myHttpWebResponse.Headers; 
       // output all the headers 
       foreach (var header in headers) 
       { 
        Console.WriteLine(header.ToString() + ": " + headers[header.ToString()] + "\n"); 

       } 

       var cow = GetParams(headers["Location"]); 
       string accessToken = ""; 
       accessToken = cow["#access_token"]; 

Et la méthode d'aide

/// <summary> 
    /// Helper method to get Params from URL using RegEx 
    /// </summary> 
    static Dictionary<string, string> GetParams(string uri) 
    { 
     var matches = Regex.Matches(uri, @"[\?&](([^&=]+)=([^&=#]*))", RegexOptions.Compiled); 
     return matches.Cast<Match>().ToDictionary(
      m => Uri.UnescapeDataString(m.Groups[2].Value), 
      m => Uri.UnescapeDataString(m.Groups[3].Value) 
     ); 
    }