@old_mamont

С чего начать обучение C# для разработки софта под соц.сети и дальнейшей работы с API этих соц.сетей?

Приветствую вас.

Основы программирования мне понятны. Представление имею.

Хочу начать изучать C# для конкретных целей, а если быть точнее, то разработка софтов для соц.сетей и работа с API этих соц.сетей.

Был бы рад полезным ссылкам, видео-курсам и книжкам конкретно под эти цели.

Заранее благодарен.
  • Вопрос задан
  • 478 просмотров
Пригласить эксперта
Ответы на вопрос 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Работа с API - это просто веб-запросы.

Подготовка запросов и обработка ответов - это в большинстве своем сериализация/десериализация, в основном JSON-данных, реже XML.

Все остальное будет зависеть от типа приложений, которые вы планируете разрабатывать.

По работе с API социальных сетей лучше читать официальную документацию.

У меня есть библиотека для авторизации по протоколу OAuth (используется многими, если не всеми, социальными сетями), которая помимо прочего, имеет унифицированные механизмы работы с API. Посмотреть на работу библиотеки можно по следующей ссылке: demo-oauth.nemiro.net

Для многих крупных проектов (сайтов) можно найти готовые узкопрофильные решения.

Ниже представлен небольшой пример использования библиотеки Nemiro.OAuth в проекте Windows Forms для авторизации через Instagram и использование полученного маркера доступа для загрузки списка последних изображений текущего пользователя. Изображения загружаются в ImageList и затем выводятся в ListView:
using System;
using System.Drawing;
using System.Net.Http;
using System.Windows.Forms;
using Nemiro.OAuth;
using Nemiro.OAuth.LoginForms;

namespace InstagramWinForms
{

  public partial class Form1 : Form
  {

    // базовый адрес API
    private const string API_BASE_URL = "https://api.instagram.com/v1";

    // элемент для хранения полученных изображений
    private ImageList ImageList = new ImageList();

    // элемент для вывода изображений
    private ListView ListView1 = new ListView();

    private string AccessToken;

    public Form1()
    {
      InitializeComponent();

      // размер изображений 150x150px, 16bit
      this.ImageList.ImageSize = new Size(150, 150);
      this.ImageList.ColorDepth = ColorDepth.Depth16Bit;

      // настраиваем список для вывода
      this.ListView1.View = View.LargeIcon;
      this.ListView1.LargeImageList = this.ImageList;

      this.ListView1.Dock = DockStyle.Fill;

      // добавляем список на форму
      this.Controls.Add(this.ListView1);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      // запрос на получение маркера доступа
      this.GetAccessToken();
    }

    private void GetAccessToken()
    {
      // создаем форму для Instagram
      // ВНИМАНИЕ: используйте собственный идентификатор и ключ
      // получить идентификатор и ключ можно на сайте instagram:
      // https://www.instagram.com/developer/clients/manage/
      var login = new InstagramLogin
      (
        // client id вашего приложения
        "9fcad1f7740b4b66ba9a0357eb9b7dda", 
        // client key вашего приложения
        "3f04cbf48f194739a10d4911c93dcece", 
        // требуется адрес возврата, 
        // можно использовать указанный, 
        // но лучше сделать свой
        "http://oauthproxy.nemiro.net/",
        // права доступа
        // https://www.instagram.com/developer/authorization/
        // для public_content (и возможно других) убедитесь, 
        // что в настройках приложения (на сайте instagram) 
        // в разделе Permissions нет никаких требований 
        // (если требования есть, то чтобы все работало, 
        // нужно их удовлетворить :-) ...)
        scope: "basic public_content",
        // требуем получить данные профиля пользователя
        loadUserInfo: true
      );

      // привязываем форму авторизации к текущей форме
      login.Owner = this;

      // показываем форму
      login.ShowDialog();

      if (login.IsSuccessfully)
      {
        // все прошло успешно, запоминаем маркер доступа
        this.AccessToken = login.AccessToken.Value;

        // выводим в заголовок текущей формы имя пользователя
        this.Text = (login.UserInfo.DisplayName ?? login.UserInfo.UserName);

        // получаем изображения
        this.GetRecentMedia();
      }
      else
      {
        MessageBox.Show("Error...", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
      }
    }

    private void GetRecentMedia()
    {
      // отправляем запрос на получение изображений
      OAuthUtility.GetAsync
      (
        String.Format
        (
          "{0}/users/self/media/recent?access_token={1}", 
          API_BASE_URL, 
          this.AccessToken
        ),
        // результат запроса будет передан в метод GetRecentMedia_Result
        callback: GetRecentMedia_Result
      );
    }

    private async void GetRecentMedia_Result(RequestResult result)
    {
      if (result.StatusCode == 200)
      {
        // получили успешный ответ
        // обрабатываем его
        foreach (UniValue item in result["data"])
        {
          // загружаем текущую картинку
          using (var client = new HttpClient())
          {
            var s = await client.GetStreamAsync(item["images"]["thumbnail"]["url"].ToString());

            // добавляем изображение в список
            Invoke(new Action(() => this.ImageList.Images.Add(Image.FromStream(s))));
          }

          // создаем элемент для вывода в список 
          var image = new ListViewItem();
          // название изображения
          image.Text = item["caption"]["text"].ToString();
          // индекс изображения в списке (ImageList)
          image.ImageIndex = this.ImageList.Images.Count - 1;

          // добавляем элемент в список
          Invoke(new Action(() => this.ListView1.Items.Add(image)));
        }
      }
      else
      {
        this.ShowError(result);
      }
    }

    private void ShowError(RequestResult result)
    {
      if (result["meta"]["error_message"].HasValue)
      {
        MessageBox.Show
        (
          result["meta"]["error_message"].ToString(), 
          "Error", 
          MessageBoxButtons.OK, 
          MessageBoxIcon.Error
        );
      }
      else
      {
        MessageBox.Show
        (
          result.ToString(), 
          "Error", 
          MessageBoxButtons.OK, 
          MessageBoxIcon.Error
        );
      }
    }

    private void button1_Click(object sender, EventArgs e)
    {
      this.GetRecentMedia();
    }

  }

}

preview.gif?raw=true
Код проекта можно найти по следующей ссылке:
https://github.com/alekseynemiro/nemiro.oauth.dll/...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы