Доступ к Facebook API используя C#

Если Вы как и я ориентированны на .NET Core, скорей всего вы знаете, что Facebook SDK for .NET не поддерживает его, по крайне мере на момент написании статьи, ну и конечно это относится к Nuget

По этому мы сами по себе, но на самом деле реализовать Graph API, не так и сложно, для этого надо можно просто использовать HttpClient или использовать любой другой тип, который отвечает  за обработку Http - запросов. Теперь перейдем к коду:

public class Account
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string Locale { get; set; }
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Gender { get; set; }
}

 Класс Account служит для представления учётной записи пользователя в Facebook. Пожалуйста обратите внимание на то, что вы можете добавить больше свойств какие пожелаете.

public interface IFacebookClient
{
    Task<T> GetAsync<T>(string accessToken, string endpoint, string args = null);
    Task PostAsync(string accessToken, string endpoint, object data, string args = null);
}
 
public class FacebookClient : IFacebookClient
{
    private readonly HttpClient _httpClient;
 
    public FacebookClient()
    {
        _httpClient = new HttpClient
        {
            BaseAddress = new Uri("https://graph.facebook.com/v2.8/")
        };
        _httpClient.DefaultRequestHeaders
            .Accept
            .Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }
 
    public async Task<T> GetAsync<T>(string accessToken, string endpoint, string args = null)
    {
        var response = await _httpClient.GetAsync($"{endpoint}?access_token={accessToken}&{args}");
        if (!response.IsSuccessStatusCode)
            return default(T);
 
        var result = await response.Content.ReadAsStringAsync();
 
        return JsonConvert.DeserializeObject<T>(result);
    }
 
    public async Task PostAsync(string accessToken, string endpoint, object data, string args = null)
    {
        var payload = GetPayload(data);
        await _httpClient.PostAsync($"{endpoint}?access_token={accessToken}&{args}", payload);
    }
 
    private static StringContent GetPayload(object data)
    {
        var json = JsonConvert.SerializeObject(data);
 
        return new StringContent(json, Encoding.UTF8, "application/json");
    }
}

FacebookClient отвечает за обслуживания POST и GET запросов к Facebook API. Довольно простой код, нет магии здесь, только имейте виду, что вы должны добавить силку на пакет Newtonsoft.Json.

public interface IFacebookService
{
    Task<Account> GetAccountAsync(string accessToken);
    Task PostOnWallAsync(string accessToken, string message);
}
 
public class FacebookService : IFacebookService
{
    private readonly IFacebookClient _facebookClient;
 
    public FacebookService(IFacebookClient facebookClient)
    {
        _facebookClient = facebookClient;
    }
 
    public async Task<Account> GetAccountAsync(string accessToken)
    {
        var result = await _facebookClient.GetAsync<dynamic>(
            accessToken, "me", "fields=id,name,email,first_name,last_name,age_range,birthday,gender,locale");
 
        if (result == null)
        {
            return new Account();
        }
 
        var account = new Account
        {
            Id = result.id,
            Email = result.email,
            Name = result.name,
            UserName = result.username,
            FirstName = result.first_name,
            LastName = result.last_name,
            Locale = result.locale
        };
 
        return account;
    }
 
    public async Task PostOnWallAsync(string accessToken, string message)
        => await _facebookClient.PostAsync(accessToken, "me/feed", new {message});
}  

В нашем FacebookService лежит настоящая "бизнес логика". В нем ми используем FacebookClient для выполнения HTTP запросов, к конечной точки с дополнительными параметрами.

public class Program
{
    public static void Main(string[] args)
    {
        var accessToken = "YOUR_GRAPH_API_ACCESS_TOKEN";
        var facebookClient = new FacebookClient();
        var facebookService = new FacebookService(facebookClient);
        var getAccountTask = facebookService.GetAccountAsync(accessToken);
 
        Task.WaitAll(getAccountTask);
        var account = getAccountTask.Result;
        Console.WriteLine($"{account.Id} {account.Name}");
 
        var postOnWallTask = facebookService.PostOnWallAsync(accessToken, "Hello from C# .NET Core!");
        Task.WaitAll(postOnWallTask);
    }
}

И наконец, наше приложение используя FacebookService получает нашу учетную запись Facebook и размещает сообщение на нашей стене. Только запомните ключ доступа вы можете получить тут и отметьте необходимые разрешение. И как вы уже заметили, это тривиальное консольное приложение поэтому Task.WaitAll() вызывается.

Исходный код нашего приложение вы можете скачать тут

Данная статья является переводом, оригинальный текст Вы можете найти здесь

Автор перевода: Grygorii Shkliaruk

Автор оригинала: Piotr Gankiewicz

P.S. Данная статья является авторским переводом, все замечание прошу оставлять в комментарии к данной статьи.

Только авторизованные пользователи могут оставлять комментарии

Чтобы оставить комментарий Вам нужно Зарегистрироваться или Войти в систему