В рамках одного нашего проекта в Brights появилась необходимость реализовать автоматическую публикацию обновлений на стену сообщества Вконтакте. Подобная задача, думаю, встречается довольно часто. Подкатом предлагаю готовый пример реализации на языке C#.
Для этого нам необходимо:
После регистрации Вашего приложения Вы получите 2 параметра, которые нам понадобятся далее:
В случае успешного подтверждения предоставление полномочий Вашему приложению вконтакте возвращает параметр Code, который нам понадобится для получения Token-a. Создадим класс Vk с методом GetCode(), который будет направлять пользователя на соответствующую страницу.
В моем случае это десктоп приложение, поэтому для того, чтобы использовать параметр Code, пользователь должен самостоятельно скопировать его со страницы, и передать приложению (ввести в соответствующий edit). Если у Вас веб-приложение, то дела обстоят немного лучше, и Вы можете задать в параметрах get-запроса адрес для редиректа (&redirect_uri=http://yoursite), и затем получить параметр Code непосредственно в Ваше приложение.
Получив Token (ключ) Вы сможете в дальнейшем осуществлять действия от имени пользователя опустив шаги 1-3. По сути Token является краеугольным камнем авторизации любого приложения поддерживающего/дублирующего протокол OAuth. Итак, для получения Token-а нам необходимо указать AppID, AppSecret и AppCode. 1-й и 2-е параметры мы получили при регистрации приложения, а параметр AppCode получили в предыдущем шаге.
В случае успешного получения Token-а вконтакте возвращает json c Token-ом, сроком истечения Token-а и ID пользователя, с которым сопоставлен Token.
Имеется возможность опубликовать текст, ссылку/медиа-контент.
При публикации простого текста, вы получаете в response post_id. При публикации текста и ссылки вы получате processing:1, что говорит о том что вконтакте принял ваш запрос, и возможно опубликует пост. Почему «возможно» смотрите в конце статьи.
Ну и код для загрузки и сохранения Token-а:
Хранить один параметр в xml это излишество, согласен с Вами, но до урезания кода для статьи параметр был не один.
Несмотря на убогость вконтакте API, реализовать автоматический постинг в группу вконтакте новостей вашего портала/журнала/блога достаточно просто.
Ссылки:
Для этого нам необходимо:
- зарегистрировать приложение и получить AppID и AppSecret. Как это сделать описано здесь;
- направить пользователя на страницу вконтакте, где он подтвердит предоставление полномочий Вашему приложению на действия от его имени;
- получить Token;
- опубликовать сообщение на стену.
Шаг 1: регистрация приложения
После регистрации Вашего приложения Вы получите 2 параметра, которые нам понадобятся далее:
- ID приложения (AppID);
- Секретный ключ приложения (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 это излишество, согласен с Вами, но до урезания кода для статьи параметр был не один.
Несколько практических советов/разочарований
- Вы не можете публиковать ссылку нигде, кроме своей стены. Обходной путь — добавить ссылку в текст, при этом вконтакте распознает ее и делает кликабельной. Пример тут;
- Если Вы публикуете посты со ссылкой (на свою страницу), то следите за тем чтобы ссылка была валидной (вела на существующую страницу + не забываем System.Web.HttpUtility.UrlEncode(Link)). Это важно, потому как в случае если ссылка не валидна, пост не будет опубликован и Вы никак не сможете это остледить (как я писал выше, публикация постов со ссылками происходит в асинхронном режиме, и в response Вы получите processing:1;
- Вы не можете публиковать одновременно и ссылку и картинку;
- Вы не можете публиковать посты от имени группы;
- Отправляйте запросы на публикацию с интервалом 2-5 минут, иначе Вам придется организовывать распознавание капчи: в ответ за запрос публикации Вы получите ссылку на изображение капчи, и затем к повторному запросу на публикацию Вам необходимо будет добавить 2 параметра: ID капчи (captcha_sid) и распознанное значение (captcha_key).
Несмотря на убогость вконтакте API, реализовать автоматический постинг в группу вконтакте новостей вашего портала/журнала/блога достаточно просто.
Ссылки: