我正在使用 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;
}