2012-05-07 3 views
1

그래프 API를 사용하여 Facebook에 사진을 게시하려고합니다. 내 일정에 메시지를 게시 할 수 있었지만 사진은 게시하지 않았습니다. Facebook 디버거는 오류가없고 개체 속성이 정확합니다.Facebook Graph API ASP.NET 게시 이미지

public class oAuthFacebook 
{ 
    public enum Method { GET, POST }; 

    public const string AUTHORIZE = "https://graph.facebook.com/oauth/authorize"; 

    public const string ACCESS_TOKEN = "https://graph.facebook.com/oauth/access_token"; 

    public const string CALLBACK_URL ="http://test.com/FbCallback.aspx"; 


    private string _consumerKey = ""; 

    private string _consumerSecret = ""; 

    private string _token = ""; 



public string ConsumerKey 
{ 

    get 
    { 
     if (_consumerKey.Length == 0) 
     { 
      _consumerKey = ""; 
     } 
     return _consumerKey; 
    } 
    set { _consumerKey = value; } 
} 


public string ConsumerSecret 
{ 
    get 
    { 
     if (_consumerSecret.Length == 0) 
     { 
      _consumerSecret = ""; 
     } 
     return _consumerSecret; 
    } 
    set { _consumerSecret = value; } 

    } 

public string Token { get { return _token; } set { _token = value; } } 





public string AuthorizationLinkGet() 
{ 
    return string.Format("{0}?client_id={1}&redirect_uri={2}&,publish_actions", 
    AUTHORIZE, this.ConsumerKey, CALLBACK_URL); 
} 

public void AccessTokenGet(string authToken) 
{ 
    this.Token = authToken; 
    string accessTokenUrl = string.Format("{0}?client_id={1}&redirect_uri= 
    {2}&client_secret={3}&code={4}", 
    ACCESS_TOKEN, this.ConsumerKey, CALLBACK_URL, this.ConsumerSecret, authToken); 

    string response = WebRequest(Method.GET, accessTokenUrl, String.Empty); 

    if (response.Length > 0) 
    { 
     NameValueCollection qs = HttpUtility.ParseQueryString(response); 

     if (qs["access_token"] != null) 
     { 
      this.Token = qs["access_token"]; 
     } 
    } 
} 

public string WebRequest(Method method, string url, string postData) 
{ 
    HttpWebRequest webRequest = null; 
    StreamWriter requestWriter = null; 
    string responseData = ""; 
    webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest; 
    webRequest.Method = method.ToString(); 
    webRequest.ServicePoint.Expect100Continue = false; 
    webRequest.UserAgent = "http://test.com"; 
    webRequest.Timeout = 40000; 

    if (method == Method.POST) 
    { 
     webRequest.ContentType = "application/x-www-form-urlencoded"; 

     requestWriter = new StreamWriter(webRequest.GetRequestStream()); 
     try 
     { 
      requestWriter.Write(postData); 
     } 
     catch 
     { 
      throw; 
     } 
     finally 
     { 
      requestWriter.Close(); 
      requestWriter = null; 
     } 
    } 
    responseData = WebResponseGet(webRequest); 
    webRequest = null; 
    return responseData; 
} 



public string WebResponseGet(HttpWebRequest webRequest) 
{ 
    StreamReader responseReader = null; 
    string responseData = ""; 
    try 
    { 
     responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream()); 
     responseData = responseReader.ReadToEnd(); 
    } 
    catch 
    { 
     throw; 
    } 
    finally 
    { 
     webRequest.GetResponse().GetResponseStream().Close(); 
     responseReader.Close(); 
     responseReader = null; 
    } 
    return responseData; 
} 

그리고 이것은 내가 testmessage을 전송하는 방법이다, 그것은 잘 작동 :

var json = oAuth.WebRequest(oAuthFacebook.Method.POST, url, "message=" + 
HttpUtility.UrlEncode("Testmessage")); 

내가 대신 사진과 함께 작동하도록하는 일 동안 난 무엇을 어떤 아이디어를 시도했습니다 잘못하고있는거야?

답변

1

원시 요청을 보내는 대신 FB C# SDK (사용 가능한 here 또는 NuGet)를 보도록 제안 할 수 있습니다. 여기에 내가 FB 앨범에 이미지를 업로드하는 데 사용하는 내 기능입니다 (당신은 앨범 ID를 알아야 하나 또는 당신은뿐만 아니라 그것을 만들거나 모든 앨범을 열거하고 당신이 필요로하는 하나 얻을 수 있습니다) :

public static string UploadPhoto(string imageName, string albumID, string accesstoken, string photoComment = null, bool doNotPostStory = false) 
{ 
    var fbAPI = new FacebookApp(accesstoken); 
    var p = new FacebookMediaObject {FileName = path}; 

    p.SetValue(<<YOUR IMAGE GOES HERE AS byte[]>>); 

    p.ContentType = "multipart/form-data"; 

    var param = new Dictionary<string, object> { {"attachment", p} }; 
    if (!string.IsNullOrEmpty(photoComment)) 
     param.Add("message", photoComment); 

    // http://stackoverflow.com/questions/7340949/is-it-possible-to-upload-a-photo-to-fanpage-album-without-publishing-it 
    // http://developers.facebook.com/blog/post/482/ 
    if (doNotPostStory == true) 
    { 
     param.Add("no_story", "1"); 
    } 

    var result = fbAPI.Post(string.Format("http://graph.facebook.com/{0}/photos", albumID), param); 
    return result.ToString(); 
} 
+0

감사합니다. 지금은 효과가 있지만 이제는 또 다른 질문이 있습니다. 다른 사용자가 응용 프로그램을 작동하게하려면 어떻게해야합니까? publish_action 권한과 같은 Facebook 승인이 필요합니까? –

+1

이것을 확인하십시오 - https://developers.facebook.com/docs/reference/javascript/ - 기본적으로 앱 ID를 전달하고 FB.Init() 호출에 "publish_stream"권한을 요청해야합니다. 다른 사용자가 로그인하고 앱에서 요청을 보게됩니다. 동의하면 해당 사용자에게 유효한 앱 토큰을 받게됩니다. 따라서 담벼락에 게시 할 수 있습니다. – avs099