Создание приложения «ВКонтакте».
Прежде чем приступить к работае с API необходимо создать приложение, от имени которого будут выполняться все действия (размещение записей и фотографий на стене, добавление и чтение комментариев, чтение данных пользователя и т.п).
Для создания приложения необходимо перейти по этой ссылке: https://vk.com/editapp?act=create
На станице создания приложения необходимо ввести название вашего приложения и выбрать тип «Standalone-приложение».
Для подтверждения действия необходимо получить на мобильный телефон сообщение с кодом.
В результате будет создано приложение. Смысл всех этих действий в получении ID приложения, которое и будет использоваться в запросах к API.
Авторизация на сайте ВКонтакте.
Перед работой с API необходимо авторизироваться. ВКонтакте используется способ авторизации OAuth 2.0.
Если в кратце и попростому, то необходимо открыть браузер, перейти по определнному адресу на странице, на которой необходимо ввести данные пользователя. После успешной авторизации возвращается access_token. Его и нужно сохранить, так как он будет использоваться в запросах.
Более подробную информацию можно посмотреть здесь: http://vk.com/dev/auth_mobile
Я же опишу как все это можно реализовать на 1С.
Необходимо создать обработку для авторизации. На форму вывести поле HTML документа (элемент формы ПолеHTMLДокумента). При открытии формы переходить по адресу
https://oauth.vk.com/authorize?client_id=&scope=&redirect_uri=http://api.vk.com/blank.html&display=page&response_type=token
Ниже приведен пример кода. Переход на страницу вставлен в процедуру «ПриОткрытии()»
Процедура ПриОткрытии()
ЭлементыФормы.ПолеHTMLДокумента1.Перейти("https://oauth.vk.com/authorize?client_id=12345" +
"&scope=photos,wall,offline&redirect_uri=http://api.vk.com/blank.html&" +
"display=page&response_type=token");
КонецПроцедуры
Со списком прав доступа можно ознакомиться на этой странице: http://vk.com/dev/permissions
Единственное, что можно упомянуть — это то, что если вы не хотите постоянно авторизироваться (по умолчанию access_token действует сутки, после чего его необходимо вновь получать), используйте параметр доступа offline. В таком случае срок действия access_token будет неограничен и авторизация потребуется только один раз.
После того, как пользователь верно введен пароль и разрешит приложению использовать необходимые данные будет произведен переход по адресу типа http://api.vk.com/blank.html#access_token=a1dfc7ef2b763d776350375f8a22678a59f28e1ac7e090b4a8486274564d38e9e8a069d10e596223d80d7&expires_in=0&user_id=5184504. Остается отследить такой переход и извлеч из строки адреса необходимую информацию (обымно требуется только access_token).
Для этого необходимо обрабатывать событие «ДокументСформирован» элемента «ПолеHTMLДокумента».
Ниже приведен пример обработки данного события.
Процедура ПолеHTMLДокумента1ДокументСформирован(Элемент)
access_token = "";
Если Элемент.Документ.location.host = "api.vk.com" Тогда
hash = Сред(Элемент.Документ.location.hash, 2);
МассивСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(hash, "&");
Для каждого Параметр ИЗ МассивСтрок Цикл
ИмяПараметра = "";
ЗначениеПараметра = "";
Поз = Найти(Параметр, "=");
Если Поз = 0 Тогда
ИмяПараметра = Параметр;
ЗначениеПараметра = "";
Иначе
ИмяПараметра = НРег(СокрЛП(Лев(Параметр,Поз-1)));
ЗначениеПараметра = СокрЛП(Сред(Параметр, Поз+1));
КонецЕсли;
Если ИмяПараметра = "access_token" Тогда
access_token = ЗначениеПараметра;
КонецЕсли;
КонецЦикла;
Константы.access_token = access_token;
Закрыть();
КонецЕсли;
КонецФункции
Отправка запросов к API ВКонтакте.
После того, как получен access_token можно выполнять запросы к API.
Для этого производится GET запрос по определенному адресу и читается ответ. Общий вид HTTP адреса выглядит следующим образом:
https://api.vk.com/method/ИМЯ_МЕТОДА.xml?параметр1=значение1&параметрN=значениеN&access_token=a1dfc7ef2b763d776350375f8a22678a59f28e1ac7e090b4a8486274564d38e9e8a069d10e596223d80d7
Например, для размещения записи «Привет, ВКонтакт!» на стене пользователя http://vk.com/id5184504 будет такой адрес:
https://api.vk.com/method/wall.post.xml?owner_id=5184504&message=Привет, ВКонтакт!&access_token=a1dfc7ef2b763d776350375f8a22678a59f28e1ac7e090b4a8486274564d38e9e8a069d10e596223d80d7
Примечание. Если необходимо произвести действие со стеной группы, то в owner_id устанавливается значение со знаком «-«.
Ниже приведен код процедуры, выполняющий запросы к API (следует заметить что используется HTTPS соединение).
Процедура ВызватьМетодAPI(ИмяМетода, Параметры, access_token) Экспорт
ИмяВыходногоФайла = ПолучитьИмяВременногоФайла("xml");
Соединение = Новый HTTPСоединение("api.vk.com",,,,, Истина);
Соединение.Получить("method/" + ИмяМетода + ".xml?" +
?(ТипЗнч(Параметры) = Тип("Строка"), Параметры + ?(ЗначениеЗаполнено(Параметры), "&", "") + "access_token="+access_token,
СформироватьСтрокуПараметровЗапроса(Параметры, access_token)),
ИмяВыходногоФайла);
КонецПроцедуры
Описание всех методов вы можете найти на странице для разработчиков ВКонтакте: http://vk.com/dev/methods
Отправка фотографий.
Как производить отправку фотографий можно прочитать в документации ВКонтакте (или посмотреть в демонстационной конфигурации). В этой статье я хочу остановиться лишь на одном моменте.
Изображение отправляется методом POST. Отправляемый файл имеет следующую структуру:
—0123456789
Content-Disposition: form-data; name=»photo»; filename=»image.jpg»
Content-Type: image/jpeg
—0123456789
где 0123456789 — Boundary: некая последовательность символов. Так же необходимо установить HTTP заголовки Content-Type и Content-Length.
Так как в 1С нет методов для работы с двоичными файлами был придуман следующий способ. Формируются 2 текстовый файла: с началом конченого файла:
—0123456789
Content-Disposition: form-data; name=»photo»; filename=»image.jpg»
Content-Type: image/jpeg
и окончанием
—0123456789
Итого получается 3 файла:
1. текстовый файл с началом
2. само изображение
3. текстовый файл с окончанием
Используя метод «ОбъединитьФайлы» соединяем 3 файла в один и отправляем уже полученный файл.
Ниже приведен код демонстирующий отправку файла.
ИмяВходногоФайла = ПолучитьИмяВременногоФайла("in");
ИмяВходногоФайла1 = ПолучитьИмяВременногоФайла("in1");
ИмяВходногоФайла2 = ПолучитьИмяВременногоФайла("in2");
ИмяВходногоФайла3 = ПолучитьИмяВременногоФайла("in2");
ИмяВыходногоФайла = ПолучитьИмяВременногоФайла("out");
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
ВходнойФайл = Новый ЗаписьТекста(ИмяВходногоФайла1, КодировкаТекста.ANSI, Символы.ПС);
ВходнойФайл.ЗаписатьСтроку("--"+Boundary);
ВходнойФайл.ЗаписатьСтроку("Content-Disposition: form-data; name=""photo""; filename=""image.jpg""");
ВходнойФайл.ЗаписатьСтроку("Content-Type: image/jpeg");
ВходнойФайл.ЗаписатьСтроку("");
ВходнойФайл.Закрыть();
Изображение.Записать(ИмяВходногоФайла2);
ВходнойФайл = Новый ЗаписьТекста(ИмяВходногоФайла3, КодировкаТекста.ANSI, Символы.ПС);
ВходнойФайл.ЗаписатьСтроку("");
ВходнойФайл.ЗаписатьСтроку("--"+Boundary);
ВходнойФайл.Закрыть();
МассивФайлов = Новый Массив;
МассивФайлов.Добавить(ИмяВходногоФайла1);
МассивФайлов.Добавить(ИмяВходногоФайла2);
МассивФайлов.Добавить(ИмяВходногоФайла3);
ОбъединитьФайлы(МассивФайлов, ИмяВходногоФайла);
ФайлОтправки = Новый Файл(ИмяВходногоФайла);
РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
ЗаголовокHTTP = Новый Соответствие;
ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary="+Boundary);
ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки);
Соединение = Новый HTTPСоединение(АдресЗагрузки);
Соединение.ОтправитьДляОбработки(ИмяВходногоФайла, АдресРесурса, ИмяВыходногоФайла, ЗаголовокHTTP);
Прикрепление карты к сообщению на стене.
В текущей реализации API отсутствует возможность прикрепления карты к сообщению. Что бывает не очень удобно. Например, если в сообщении идет речь о какой-нибудь проводимой акции, то хорошо бы было к нему прикрепить карту с местом проведения акции. Данная задача была решена мной следующим образом: обращением к Google Maps API получается изображение карты, а потом оно прикрепляется к сообщению как обычная картина.
Для того, чтобы получить изображение карты с нужным местом необходимо отправить запрос по адресу
http://maps.google.com/maps/api/staticmap?center=LAT,LONG&zoom=14&size=320×100&maptype=roadmap&markers=color:red%7Ccolor:red%7Clabel:C%7CLAT,LONG&sensor=false
где LAT и LONG географические координаты места. Описание остальных параметров можно найти в описании Google Maps API. Скажу лишь, что приведенные в данном примере по моему мнению являются оптимальными и их можно не менять. В ответ приходит изображение карты.
Ниже приведен пример использования.
// после выполнения вызова в этом файле будет изображение с картой
ИмяФайлаКарты = ПолучитьИмяВременногоФайла("jpg");
Соединение = Новый HTTPСоединение("maps.google.com");
Соединение.Получить("maps/api/staticmap?center="+lat+","+long+"&zoom=14&size=320x100&maptype=roadmap" +
"&markers=color:red%7Ccolor:red%7Clabel:C%7C"+lat+","+long+"&sensor=false", ИмяФайлаКарты);
Демонстрационная конфигурация.
Для демонстрации работы с API и более лучшего понимания всего вышесказанного была создана демонстрационная конфигурация. В этой конфигурации реализован механизм авторизации и отправка сообщения на стену с возможностью прикрепления изображения. Кроме того, в конфигурации существует общий модуль «РаботаССайтомВКонтакте» в котором реализованы готовые вызовы следующих методов API в виде соответсвующих процедур и функций 1С:
- размещение и удаление записей на стене;
- добавление, чтение и удаление комментариев к записям;
- работа с рекламой — получение списка рекламных кабинетов, работа с рекламными кампаниями и рекламными объявлениями (создание, изменение и удаление);
- работа со списком пользоваталей и получение информации о них;
- работа с географическими местами;
- размещение фотографий.
т.е., например, чтобы получить информацию о пользователях можно воспользоваться следующим кодом
РаботаССайтомВКонтакте.ПолучитьИнформациюОПользователях("a1dfc7ef2b763d776350375f8a22678a59f28e1ac7e090b4a8486274564d38e9e8a069d10e596223d80d7", "5184504");
первый параметр access_token, второй — id пользователя.
Возвращаемым значением функций является Структура либо массив структур в завимости от формата ответа сервера. Ключами структуры являются параметры возвращаемые в ответе сервером. Приведенный ниже пример демонстрирует вывод имен пользователей с ID 123456 и 654321.
ДанныеОПользователях = ПолучитьИнформациюОПользователях(access_token, "123456,654321");
Для каждого ДанныеОПользователе Из ДанныеОПользователях Цикл
Сообщить("Имя пользователя " + ДанныеОПользователе.uid +
" - " + ДанныеОПользователе.first_name);
КонецЦикла;
Используя написанную выше информации, документацию разработчика ВКонтакте и примеры из демострационной конфигурации можно достаточно просто добавить отсутствующий функционал.
Общий модуль «РаботаССайтомВКонтакте» и обработку «АвторизацияНаСайте» можно как есть перенести в рабочую конфигурацию и начать использовать API ВКонтакте.
Демонстрационная база работает как в режиме управляемых форм так и в обычном приложении.
Примечание.
Код демонстрационной конфигурации может использоваться в других разработках без каких-либо органичений.
Класс! Обожаю задачки подобной интеграции, спасибо!
И вопрос из серии «некогда самому глянуть» — где-инбудь нормальное описание API там есть?
автору +, тема интересна =)
Не смотрели Facebook на тему создания приложений? Можно ли из FB загружать список друзей с телефонами в 1С и отправлять сообщения пользователям?
Интересно. Спасибо за выкладку. Есть запрос на ведение рекламной деятельности через контакт, которую бы можно было учитывать и обсчитывать. Данная разработка может быть путем решения данной задачи.
Интересная обработка.
Буду качать.
Раз уж есть эта тема , так давайте ее обсудим поподробнее.
Имеем 3 самых больших СоцСети: «ОК» , «ВК» и «FB». Ну и Твиттер тут можно вставить с ними в один ряд, так как его используют на всех сайта для размещения постов.
Самое наверное интересное для меня было бы — так это создать обработку универсальную для всех вышеперечисленных ресурсов.
Но для чего она нам могла бы быть полезной?! Давайте , кто знает о полезностях взаимодействий сайта или 1С с даными сетями , пишите сюда. Не ленитьсь.
Мне кажется , что самое главное — это посты! Выкласть информацию с фоткой на стенку группы , чтобы все ее учасники могли увидеть.
Второе , это сбор контактной информации учасников ,если таковое возможно и предусмотрено АРІ.
Дальше что может быть?
(5) Boudybuilder, а что за соцсеть «ОК»?
(0) Не работает даже попытка получения ключа, т.е. по адресной строкеhttps://oauth.vk.com/authorize итд — говорит, что «не удалось загрузить authorize из oauth.vk.com, и всё. Что неправильно?
вошли на сайт, а выход с него как организовать?
Кто знает , какими символами делать перевод строки. А то уже все перепробовали а вкотнакте все одной строчкой на стенке.
(9) Boudybuilder, Перевод строки выполняется обычным способом. Только нужно сообщение кодировать в кодировке URL (urlencode). В предоставленной демо конфигурации можно сделать следующим образом:
Запомню. Довольно интересная разработка.
Спасибо за разработку!
В функции:
Функция СформироватьСтрокуПараметровЗапроса(Параметры, access_token)
Надо проверять на тип число:
СтрокаПараметров = СтрокаПараметров + Параметр.Ключ + «=» + ?(ТипЗнч(Параметр.Значение)=Тип(«Число»), Формат(Параметр.Значение, «ЧГ=0»), Параметр.Значение) + «&»;
Не могу разобраться с загрузкой изображения.
Не пойму что должно быть в АдресЗагрузки и АдресРесурса.
Конкретно нужно установить картинку конференции в переписках.
Методы photos.getChatUploadServer и messages.setChatPhoto описаны в api, но как они с файлами взаимодействуют мне не ясно.
В первом методе получаю upload_url, а как туда фото загрузить не ясно, ибо во втором методе его нужно установить.
UPD: А что за Изображение.Записать(…)? Изображение — реквизит типа Картинка? Но зачем оно?
Ребята скиньте у кого есть эта конфигурация на почту leonov_den89@mail.ru, а то средств не хватает на загрузку.
«Так как в 1С нет методов для работы с двоичными файлами был придуман следующий способ.»
http://v8.1c.ru/o7/201602bin/index.htm
уже в планах 🙂 так что планируйте дорабатывать публикацию 🙂
(6) ОК — Одноклассники))
Дополнил конфигурацию справочником всех прав, для получения токена, но автоматическое получение крашит приложение.
У меня авторизация двухфакторная. но через браузер легко получил.
Еще хотел узнать как понять какое апи использую, у них в новых версиях параметры у методов другие, но версию же я не задавал или тут нужно платформу сайта смотреть?
(17) Xershi, сам разобрался. При формировании начального запроса они добавили опционально версию апи, сейчас это
Плюс перешли на шифрованное соединение и поменяли формат прикрепляемых фоток. Изучив их апи все стало на свои места!
Спасибо за реализацию формирования и парсилки запроса!
(18) Xershi,
Сервер = «api.vk.com»;
Ресурс = СтрШаблон(«%1/method/messages.send?user_id=%2&message=%3&access_token=%4&v=5.57», Сервер, IDАккаунта, Сообщение, Токен);
Соединение = Новый HTTPСоединение(Сервер,443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.Получить(Запрос);
СообщитьПользователю(Строка(Ответ.КодСостояния));
Остальные параметры тоже есть, токен получен. Ответ на запрос постоянно «404», что бы ни делал. Не пойму в чем проблема, бьюсь 3й час.
(19) KRaSH13, у него там метод подключения через ком идет. Я только добавил букву s к отсечению! Так что качай конфу и смотри код.
(19) KRaSH13, Зачем вы в «Ресурс» добавляете адрес сервера?
Нужно так
Ресурс = СтрШаблон(«method/messages.send?user_id=%2&message=%3&access_token=%4&v=5.57», IDАккаунта, Сообщение, Токен);
Автор красавчик )
Функция ЗагрузитьФотографиюНаСтену(access_token, uid=»», gid=»», Изображение) Экспорт
АдресЗагрузки = СтрЗаменить(РаботаССайтомВКонтакте.ПолучитьАдресДляЗагрузкиФотографийНаСтену(access_token, uid, gid), «http://», «»);
АдресЗагрузки = СтрЗаменить(РаботаССайтомВКонтакте.ПолучитьАдресДляЗагрузкиФотографийНаСтену(access_token, uid, gid), «https://», «»);
(22) capitan, Ну так, стараюсь ))
А в этой конфигурации только как загружать фото или есть пример скачивания на диск новостей с картинками?
Уважаемые форумчане! Перешлите на kg.og@mail.ru конфигурацию работы с API VK please!
Автору огромное спасибо, пригодилось!
Мои пять копеек. Если при загрузке фото на сервер возвращается:
То вместо
Пишем:
Может кто то сталкивался при выгрузки на стену изображения ошибка
Ошибка при загрузке изображения на стену: {ОбщийМодуль.РаботаССайтомВКонтакте.Модуль(1529)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки): Ошибка работы с Интернет: Couldn’t resolve host name
8.3.8.1652
Режим совместимости Версия 8.3.7
просто текст отправляет в vk
(27) Выложена обновлённая версия демонстрационной конфигурации, где исправлены некоторые ошибки (в том числе и ошибка загрузки изображений).
Очень интересно!
Может кому пригодится. Сделал функцию отправки фотографий на сервер с использованием двоичных данных без записи файлов на диск.
Входящие параметры:
Изображение = двоичные данные картинки.
АдресЗагрузкиФото = Адрес, полученный ранее методом photos.getWallUploadServer. Без «https://»
Показать
Как реализовать отправку смайлов в сообщении? кто-нибудь сталкивался?
Дело в том, что символьные коды смайлом идут с &, а данный символ используется при перечислении параметров.В результате чего логика строки запроса нарушается.
А что делать, если вк потребует ввод капчи? если много сообщений допустим отправляешь, то может потребовать
Спасибо огромное, очень выручили!
У кого выходит ошибка что-то типа «v version is required» — теперь в запросе необходимо явно указывать номер версии API ВК (https://vk.com/dev/version_update) , поэтому добавляем соответствующий параметр при вызове любого метода ВК.
(34) Золотой Вы человек! Спасибо большое, полчаса мозг ломал. Немного конкретизирую:
В процедуре СформироватьСтрокуПараметровЗапроса(Параметры, access_token)
Находим строку
СтрокаПараметров = СтрокаПараметров + «access_token=» + access_token»;
И приводим её к такому виду:
СтрокаПараметров = СтрокаПараметров + «access_token=» + access_token+»&v=5.73″;
Где 5.73 — версия API
Ребята подскажите что я делаю не так??. не удается выгрузить запись на стену
У меня ошибка еще при авторизации: не удалось скачать authorize из oauth.vk.com
Это про что вообще?
На платформе 8.3.15.1700 не работает. Подозреваю, что связано с тем, что код писался еще под платформу, где использовался IE в качестве браузера, а с недавних пор платформа использует Webkit.
Переход по ссылке таким образом «Элементы.HTMLСтраница.Документ.location.href = » не работает, переделал на «HTMLСтраница = «. Далее некорректно ведет себя браузер после загрузки страницы (Процедура HTMLСтраницаДокументСформирован). В Элемент.Документ.location.href лежит просто «https://api.vk.com/blank.html» без параметров, соответственно в Элемент.Документ.location.hash пусто.
(40) А нет, на 8.3.13, где уже WebKit все работает. Видимо просто баг платформы 8.3.15.1700