0

我正在使用 Facebook SDK http://facebooksdk.net/上传视频。
我的函数:EnsureRequiredPermissions()运行良好,但如何写得更好呢?

下面的 C# 控制台应用程序应该能够将视频上传到 Facebook 墙,如果您要将“我”替换为 PageId 并使用页面的 AuthToken,它也应该能够将视频上传到 Facebook 页面。

请注意默认超时 100 秒的变通方法。

public void Main()
{
    var facebookClient = new FacebookClient(@"SomeFacebookOAuthToken");

    // Ensure the web request does not time out at 100 seconds.
    facebookClient.SetHttpWebRequestFactory(CreateHttpWebRequest);

    if (!EnsureRequiredPermissions(facebookClient))
    {
        Console.WriteLine(@"Insufficient permissions to continue.");
        return;
    }

    var result = UploadVideo(facebookClient, @"C:\Path\To\Video.mp4", @"Some Title", @"Some Description");
    Console.WriteLine(result);
}

private static bool EnsureRequiredPermissions(FacebookClient facebookClient)
{
    var requiredPermissions = new List<String>
    {
        @"publish_stream"
    };

    dynamic response = facebookClient.Get(@"me/permissions");
    var responseObj = JObject.Parse(response.ToString());
    foreach (JProperty permission in responseObj[@"data"][0].Children())
    {
        if (requiredPermissions.Contains(permission.Name) && permission.Value.ToString() == @"1")
            requiredPermissions.Remove(permission.Name);
    }
    return requiredPermissions.Count == 0;
}

private static object UploadVideo(FacebookClient facebookClient, string path, string title, string description)
{
    var mediaStream = new FacebookMediaStream
    {
        ContentType = @"application/octet-stream",
        FileName = Path.GetFileName(path)
    };

    // Note: FacebookMediaStream supports IDisposable but closes the stream before all bytes are read.
    using (var fileStream = File.OpenRead(path))
    {
        mediaStream.SetValue(fileStream);
        var parameters = new
        {
            description = description,
            title = title,
            mediaStream
        };
        try
        {
            return facebookClient.Post(@"me/videos", parameters);
        }
        catch (FacebookOAuthException unknownError)
        {
            // Facebook are wankers so pretty much every exception
            // will be: "An unknown error has occurred".
            Console.WriteLine(unknownError);
            throw;
        }
    }
}

private static HttpWebRequestWrapper CreateHttpWebRequest(Uri url)
{
    var httpWebRequest = (HttpWebRequest) WebRequest.Create(url);
    var wrapper = new HttpWebRequestWrapper(httpWebRequest)
    {
        Timeout = System.Threading.Timeout.Infinite
    };
    return wrapper;
}
4

1 回答 1

1

我知道我迟到了,但我是这样做的:Assembly Facebook.dll, v6.0.10.0

1)创建模型:

public class FbData<T> {
    public IList<T> Data { get; set; }
}
public class UserPermission {
    public string Permission { get; set; }
    public string Status { get; set; }
    [JsonIgnore]
    public bool Granted { get { return Status.ToLower() == "granted"; } }
}

2)像这样使用助手:

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using Microsoft.AspNet.Facebook;
using Microsoft.AspNet.Facebook.Client;
using System.Threading.Tasks;
 public class FacebookHelper
{
    public static async Task<IList<T>> GetArrayAsync<T>(Facebook.FacebookClient facebookClient, string path)
    {
        dynamic response = await facebookClient.GetTaskAsync(path);
        var str = response.ToString() as string;
        if (str.IsNullOfEmpty())
            return default(IList<T>);
        var result = await Newtonsoft.Json.JsonConvert.DeserializeObjectAsync<FbData<T>>(str);
        return result.Data;
    }
    public static async Task<bool> EnsureRequiredPermissions(Facebook.FacebookClient facebookClient, params string[] Permissions)
    {
        var requiredPermissions = new List<String>(Permissions);
        var userPerms = await GetArrayAsync<UserPermission>(facebookClient, "me/permissions");
        var allowed = from e in userPerms where e.Granted select e.Permission;
        requiredPermissions.RemoveAll(o => allowed.Contains(o));
        return requiredPermissions.Count == 0;
    }
}

编辑:添加更多示例如果您希望拨打一个电话,例如图片、喜欢和用户,您可以使用以下内容:

 public static async Task<T> GetAsync<T>(Facebook.FacebookClient facebookClient, string objectPath, bool AddGetFields = true)
        where T: class
    {
       var path = objectPath + (AddGetFields ? FacebookQueryHelper.GetFields(typeof(T)) : "");
        dynamic response = await facebookClient.GetTaskAsync(path);
        var str = response.ToString() as string;
        if (str.IsNullOfEmpty())
            return default(T);
        return await Newtonsoft.Json.JsonConvert.DeserializeObjectAsync<T>(str);
    }
  public static Task<MyAppUser> GetCurrentLogedUser(Facebook.FacebookClient facebookClient)
    {
        return GetAsync<MyAppUser>(facebookClient, "/me");
    }

模型将是:

public class MyAppUser
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string Link { get; set; }

    [JsonProperty("picture")] // This renames the property to picture.
    [FacebookFieldModifier("type(large)")] // This sets the picture size to large.
    public FacebookConnection<FacebookPicture> ProfilePicture { get; set; }



    //[FacebookFieldModifier("limit(8)")] // This sets the size of the friend list to 8, remove it to get all friends.
    //public FacebookGroupConnection<MyAppUserFriend> Friends { get; set; }

    //[FacebookFieldModifier("limit(16)")] // This sets the size of the photo list to 16, remove it to get all photos.
    //public FacebookGroupConnection<FacebookPhoto> Photos { get; set; }

    public FacebookGroupConnection<Like> Likes { get; set; }
}
public class Like
{
    public string Name { get; set; }
    public string Category { get; set; }
    public string Id { get; set; }
}
public class FacebookPicture
{
    public string Url { get; set; }
}

FacebookQueryHelper.GetFields(typeof(T)) 返回一个字符串告诉 facebook 返回特定字段,因此如果模型只有 id,它不会返回所有字段。如果模型具有 FacebookGroupConnection 或 FacebookConnection 属性,它将被填充(如 Likes 属性)。它还将添加修饰符,例如 :[FacebookFieldModifier("limit(16)")] 会将 resutl 数组限制为 16

于 2015-04-11T05:43:30.070 回答