Как стать автором
Обновить

Вконтакте wall.post посредством C#

Время на прочтение6 мин
Количество просмотров45K
В рамках одного нашего проекта в Brights появилась необходимость реализовать автоматическую публикацию обновлений на стену сообщества Вконтакте. Подобная задача, думаю, встречается довольно часто. Подкатом предлагаю готовый пример реализации на языке C#.

Для этого нам необходимо:
  1. зарегистрировать приложение и получить AppID и AppSecret. Как это сделать описано здесь;
  2. направить пользователя на страницу вконтакте, где он подтвердит предоставление полномочий Вашему приложению на действия от его имени;
  3. получить Token;
  4. опубликовать сообщение на стену.

Шаг 1: регистрация приложения


После регистрации Вашего приложения Вы получите 2 параметра, которые нам понадобятся далее:
  1. ID приложения (AppID);
  2. Секретный ключ приложения (AppSecret).

Шаг 2: получение Code


В случае успешного подтверждения предоставление полномочий Вашему приложению вконтакте возвращает параметр Code, который нам понадобится для получения Token-a. Создадим класс Vk с методом GetCode(), который будет направлять пользователя на соответствующую страницу.
  public static class Vk
  {
    public static void GetCode()
    {
      string reqStrTemplate =
        "http://api.vkontakte.ru/oauth/authorize?client_id={0}&scope=offline,wall";

      System.Diagnostics.Process.Start(
        string.Format(reqStrTemplate, Publics.Vk_AppID));

    }
  }


* This source code was highlighted with Source Code Highlighter
.


В моем случае это десктоп приложение, поэтому для того, чтобы использовать параметр Code, пользователь должен самостоятельно скопировать его со страницы, и передать приложению (ввести в соответствующий edit). Если у Вас веб-приложение, то дела обстоят немного лучше, и Вы можете задать в параметрах get-запроса адрес для редиректа (&redirect_uri=http://yoursite), и затем получить параметр Code непосредственно в Ваше приложение.

Шаг 3: Token


Получив Token (ключ) Вы сможете в дальнейшем осуществлять действия от имени пользователя опустив шаги 1-3. По сути Token является краеугольным камнем авторизации любого приложения поддерживающего/дублирующего протокол OAuth. Итак, для получения Token-а нам необходимо указать AppID, AppSecret и AppCode. 1-й и 2-е параметры мы получили при регистрации приложения, а параметр AppCode получили в предыдущем шаге.
В случае успешного получения Token-а вконтакте возвращает json c Token-ом, сроком истечения Token-а и ID пользователя, с которым сопоставлен Token.
  public class VkJsonTokenResponse
  {
    public string access_token { get; set; }
    public string expires_in { get; set; }
    public string user_id { get; set; }
  }


* This source code was highlighted with Source Code Highlighter
.


    public static string GetToken(string Code)
    {
      string reqStrTemplate =
        "https://api.vkontakte.ru/oauth/access_token?client_id={0}&client_secret={1}&code={2}";

      string reqStr = string.Format(reqStrTemplate, Publics.Vk_AppID, Publics.Vk_Secret, Code);

      WebClient webClient = new WebClient();
      string response = webClient.DownloadString(reqStr);

      JavaScriptSerializer s = new JavaScriptSerializer();
      VkJsonTokenResponse jsonResponse = s.Deserialize<VkJsonTokenResponse>(response);
      Token = jsonResponse.access_token;
      SaveTokens();
      return Token;
    }


* This source code was highlighted with Source Code Highlighter
.


Шаг 4: Заключительный этап публикация на стене


Имеется возможность опубликовать текст, ссылку/медиа-контент.
public static string PostMessage(string Message, string Link, string CapchaID, string CapchaKey)
    {
      string reqStr = string.Format( 
        "https://api.vkontakte.ru/method/wall.post?owner_id={0}=&access_token={1}&message={2}",
        Publics.Vk_GroupID, Vk.Token, Message);

      if (!string.IsNullOrEmpty(Link))
        reqStr += string.Format("&attachment={0}", System.Web.HttpUtility.UrlEncode(Link));

      if (!string.IsNullOrEmpty(CapchaID))
        reqStr += string.Format("&captcha_sid={0}", CapchaID);

      if (!string.IsNullOrEmpty(CapchaKey))
        reqStr += string.Format("&captcha_key={0}", CapchaKey);

      WebClient webClient = new WebClient();
      return webClient.DownloadString(reqStr);
    }


* This source code was highlighted with Source Code Highlighter
.

При публикации простого текста, вы получаете в response post_id. При публикации текста и ссылки вы получате processing:1, что говорит о том что вконтакте принял ваш запрос, и возможно опубликует пост. Почему «возможно» смотрите в конце статьи.
Ну и код для загрузки и сохранения Token-а:
    private static void SaveTokens()
    {
      XmlSerializer s = new XmlSerializer(typeof(string));
      FileStream fs = new FileStream(Publics.CurrPath + "vk.xml", FileMode.OpenOrCreate);
      s.Serialize(fs, Token);
      fs.Flush();
    }

    public static void LoadTokens()
    {
      try
      {
        XmlSerializer s = new XmlSerializer(typeof(string));
        FileStream fs = new FileStream(Publics.CurrPath + "vk.xml", FileMode.Open);
        Token = (string)s.Deserialize(fs);
      }
      catch (Exception ex)
      {
        Error.SaveError("Vk.LoadTokens", ex.Message);
      }
    }


* This source code was highlighted with Source Code Highlighter
.

Хранить один параметр в xml это излишество, согласен с Вами, но до урезания кода для статьи параметр был не один.

Несколько практических советов/разочарований


  1. Вы не можете публиковать ссылку нигде, кроме своей стены. Обходной путь — добавить ссылку в текст, при этом вконтакте распознает ее и делает кликабельной. Пример тут;
  2. Если Вы публикуете посты со ссылкой (на свою страницу), то следите за тем чтобы ссылка была валидной (вела на существующую страницу + не забываем System.Web.HttpUtility.UrlEncode(Link)). Это важно, потому как в случае если ссылка не валидна, пост не будет опубликован и Вы никак не сможете это остледить (как я писал выше, публикация постов со ссылками происходит в асинхронном режиме, и в response Вы получите processing:1;
  3. Вы не можете публиковать одновременно и ссылку и картинку;
  4. Вы не можете публиковать посты от имени группы;
  5. Отправляйте запросы на публикацию с интервалом 2-5 минут, иначе Вам придется организовывать распознавание капчи: в ответ за запрос публикации Вы получите ссылку на изображение капчи, и затем к повторному запросу на публикацию Вам необходимо будет добавить 2 параметра: ID капчи (captcha_sid) и распознанное значение (captcha_key).


Несмотря на убогость вконтакте API, реализовать автоматический постинг в группу вконтакте новостей вашего портала/журнала/блога достаточно просто.
Ссылки:
  1. Документация Вконтакте API
Теги:
Хабы:
+3
Комментарии10

Публикации

Изменить настройки темы

Истории

Ближайшие события