gifts2017

Демонстрационная конфигурация работы с API ВКонтакте

Опубликовал Павел Толкачев (ltfriend) в раздел Обмен - Интеграция с WEB

В статье представлен обзор работы с API ВКонтакте из 1С. А так же рассматривается демонстрационная конфигурация по работе с API.

Создание приложения "ВКонтакте".

Прежде чем приступить к работае с 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=320x100&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 ВКонтакте 159
.cf 40,58Kb
23.07.13
159
.cf 40,58Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Яков Коган (Yashazz) 24.07.13 17:33
Класс! Обожаю задачки подобной интеграции, спасибо!

И вопрос из серии "некогда самому глянуть" - где-инбудь нормальное описание API там есть?
2. Андрей Карев (lamelioss) 24.07.13 17:53
автору +, тема интересна =)
3. Сергей Карташев (Elisy) 31.07.13 05:23
Не смотрели Facebook на тему создания приложений? Можно ли из FB загружать список друзей с телефонами в 1С и отправлять сообщения пользователям?
4. evgen1977 (musatov1c.ru) 19.08.13 09:52
Интересно. Спасибо за выкладку. Есть запрос на ведение рекламной деятельности через контакт, которую бы можно было учитывать и обсчитывать. Данная разработка может быть путем решения данной задачи.
5. Виталий Фантич (Boudybuilder) 03.11.13 23:59
Интересная обработка.
Буду качать.

Раз уж есть эта тема , так давайте ее обсудим поподробнее.

Имеем 3 самых больших СоцСети: "ОК" , "ВК" и "FB". Ну и Твиттер тут можно вставить с ними в один ряд, так как его используют на всех сайта для размещения постов.
Самое наверное интересное для меня было бы - так это создать обработку универсальную для всех вышеперечисленных ресурсов.

Но для чего она нам могла бы быть полезной?! Давайте , кто знает о полезностях взаимодействий сайта или 1С с даными сетями , пишите сюда. Не ленитьсь.

Мне кажется , что самое главное - это посты! Выкласть информацию с фоткой на стенку группы , чтобы все ее учасники могли увидеть.

Второе , это сбор контактной информации учасников ,если таковое возможно и предусмотрено АРІ.

Дальше что может быть?
6. Юрий Вячеславович (3762515) 22.07.14 17:10
(5) Boudybuilder, а что за соцсеть "ОК"?
KroVladS; kuzyara; +2 Ответить 1
7. Яков Коган (Yashazz) 31.07.14 11:04
(0) Не работает даже попытка получения ключа, т.е. по адресной строке https://oauth.vk.com/authorize итд - говорит, что "не удалось загрузить authorize из oauth.vk.com, и всё. Что неправильно?
8. Vitalya Гуляев (Vix) 30.08.14 11:19
вошли на сайт, а выход с него как организовать?
9. Виталий Фантич (Boudybuilder) 29.10.14 00:28
Кто знает , какими символами делать перевод строки. А то уже все перепробовали а вкотнакте все одной строчкой на стенке.
10. Павел Толкачев (ltfriend) 30.10.14 08:29
(9) Boudybuilder, Перевод строки выполняется обычным способом. Только нужно сообщение кодировать в кодировке URL (urlencode). В предоставленной демо конфигурации можно сделать следующим образом:
ТекстСообщения = РаботаСВнешнимВебСервером.URLEncode(ТекстСообщения);
11. Константин Юрин (kostyaomsk) 01.02.15 09:08
Запомню. Довольно интересная разработка.
12. Владимир Пушин (vladnet) 22.04.15 19:39
Спасибо за разработку!

В функции:

Функция СформироватьСтрокуПараметровЗапроса(Параметры, access_token)

Надо проверять на тип число:

СтрокаПараметров = СтрокаПараметров + Параметр.Ключ + "=" + ?(ТипЗнч(Параметр.Значение)=Тип("Число"), Формат(Параметр.Значение, "ЧГ=0"), Параметр.Значение) + "&";
13. Midasu Milfords (Midasu) 17.08.15 19:29
Не могу разобраться с загрузкой изображения.
Не пойму что должно быть в АдресЗагрузки и АдресРесурса.
Конкретно нужно установить картинку конференции в переписках.
Методы photos.getChatUploadServer и messages.setChatPhoto описаны в api, но как они с файлами взаимодействуют мне не ясно.
В первом методе получаю upload_url, а как туда фото загрузить не ясно, ибо во втором методе его нужно установить.

UPD: А что за Изображение.Записать(...)? Изображение - реквизит типа Картинка? Но зачем оно?
14. Den LEO (s3nsay) 21.09.15 20:24
Ребята скиньте у кого есть эта конфигурация на почту leonov_den89@mail.ru, а то средств не хватает на загрузку.
15. Сергей Галюк (dj_serega) 04.02.16 12:46
"Так как в 1С нет методов для работы с двоичными файлами был придуман следующий способ."
уже в планах :) так что планируйте дорабатывать публикацию :)
http://v8.1c.ru/o7/201602bin/index.htm
16. Алексей Смолинский (NewLifeMan) 02.04.16 13:32
17. Xer shi (Xershi) 08.10.16 00:48
Дополнил конфигурацию справочником всех прав, для получения токена, но автоматическое получение крашит приложение.
У меня авторизация двухфакторная. но через браузер легко получил.

Еще хотел узнать как понять какое апи использую, у них в новых версиях параметры у методов другие, но версию же я не задавал или тут нужно платформу сайта смотреть?
18. Xer shi (Xershi) 09.10.16 15:05
(17) Xershi, сам разобрался. При формировании начального запроса они добавили опционально версию апи, сейчас это
&v=5.57

Плюс перешли на шифрованное соединение и поменяли формат прикрепляемых фоток. Изучив их апи все стало на свои места!
Спасибо за реализацию формирования и парсилки запроса!
19. Krot B4 (KRaSH13) 15.10.16 00:09
(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й час.
20. Xer shi (Xershi) 15.10.16 00:18
(19) KRaSH13, у него там метод подключения через ком идет. Я только добавил букву s к отсечению! Так что качай конфу и смотри код.
21. Павел Толкачев (ltfriend) 15.10.16 11:21
(19) KRaSH13, Зачем вы в "Ресурс" добавляете адрес сервера?
Нужно так
Ресурс = СтрШаблон("method/messages.send?user_id=%2&message=%3&access_token=%4&v=5.57", IDАккаунта, Сообщение, Токен);
22. Капитан Немо (capitan) 22.10.16 21:16
Автор красавчик )


Функция ЗагрузитьФотографиюНаСтену(access_token, uid="", gid="", Изображение) Экспорт

АдресЗагрузки = СтрЗаменить(РаботаССайтомВКонтакте.ПолучитьАдресДляЗагрузкиФотографийНаСтену(access_token, uid, gid), "http://", "");

АдресЗагрузки = СтрЗаменить(РаботаССайтомВКонтакте.ПолучитьАдресДляЗагрузкиФотографийНаСтену(access_token, uid, gid), "https://", "");


23. Павел Толкачев (ltfriend) 26.10.16 10:08
(22) capitan, Ну так, стараюсь ))
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа