Пример работы с Google Documents List Data API

10.07.11

Интеграция - Внешние источники данных

Простой пример работы с Google Docs из 1С V8.
Рассмотрены только некоторые простые операции: получение списка документов/коллекций, загрузка документа на сервер, установка прав доступа, удаление документа.

Скачать файлы

Наименование Файл Версия Размер
GoogleDocsAPI Test
.epf 13,02Kb
172
.epf 13,02Kb 172 Скачать

Это простой пример работы с Google Docs из 1С V8.

Рассмотрены только некоторые простые операции: получение списка документов/коллекций, загрузка документа на сервер, установка прав доступа, удаление документа.

Модификация документов средствами API мне не требовалась, и поэтому делать не пробовал.


Первым делом получаем идентификатор/параметр авторизации (authentication token)

ФайлИд = ПолучитьИмяВременногоФайла();                 
Соединение = Новый HTTPСоединение("www.google.com", , , , , Истина);
Соединение.Получить("accounts/ClientLogin?accountType=GOOGLE&service=writely&source=1C&Email=" + ИмяПользователя + "&Passwd=" +  Пароль, ФайлИд);

//writely,wise 
ФайлОтвета = Новый ТекстовыйДокумент;
ФайлОтвета.Прочитать(ФайлИд, "utf-8");
ПараметрАвторизации = ФайлОтвета.ПолучитьСтроку(3);

А дальше пытаемся управлять сервисом с помощью методов HTTPСоединения: ОтправитьДляОбработки(Put), Получить(Get), Удалить(Delete).


Например, чтобы опубликовать документ Excel

Файл = Новый Файл(ИсточникИмяФайла);
РазмерФайла = Файл.Размер();
ИмяФайла = Файл.Имя;
Файл = Неопределено;
 
СайтУРЛ = "docs.google.com";
УРЛ = "feeds/default/private/full";
РезультатИмяФайла = ПолучитьИмяВременногоФайла();
//ПараметрАвторизации = ПолучитьПараметрАвторизации(); 
 
Соединение = Новый HTTPСоединение(СайтУРЛ, , , , , Истина);//"spreadsheets0.google.com"
 
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "GoogleLogin auth=" + Сред(ПараметрАвторизации, 6));
Заголовки.Вставить("GData-Version", "3.0");
Заголовки.Вставить("Content-Length", Формат(РазмерФайла, "ЧГ="));
Заголовки.Вставить("Content-Type", "application/vnd.ms-excel");
Заголовки.Вставить("Slug", ИмяФайла);
                               
//Теперь можно отправлять GET или POST запросы гугловскому API.
//Отправка POST Запроса
Соединение.ОтправитьДляОбработки(ИсточникИмяФайла, УРЛ, РезультатИмяФайла, Заголовки);

В результате выполнения команды получаем XML-документ (структура файла документирована).

Из файла ответа можно вытащить идентификатор ресурса (resourceId), выглядит как строка вида «0ApemGBzasF4MdC1WaEE1UGxDYjlnWUxDdTRlbDZzdEU».

Если нужно добавить документ в существующую коллекцию (папку), то URL должен содержать идентификатор папки

УРЛ = "feeds/default/private/full" + "/folder%3A0B5emGBzasF4MZmViYTJjNmMtNGI0ZS00YmMzLWIzYmYtYzIzMDhlYmUwMzlR/contents";
//Здесь «0B5emGBzasF4MZmViYTJjNmMtNGI0ZS00YmMzLWIzYmYtYzIzMDhlYmUwMzlR» это идентификатор папки.

А теперь удалим документ

СайтУРЛ = "docs.google.com";
УРЛ = "feeds/default/private/full/" + ИдентификаторДокумента + "";//?delete=true
 //ПараметрАвторизации = ПолучитьПараметрАвторизации(); 
Соединение = Новый HTTPСоединение(СайтУРЛ, , , , , Истина);//"spreadsheets0.google.com"
 
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "GoogleLogin auth=" + Сред(ПараметрАвторизации, 6));
Заголовки.Вставить("If-Match", "*");//If-Match: 
Заголовки.Вставить("GData-Version", "3.0");
                               
//Теперь можно отправлять GET или POST, DELETE запросы гугловскому API.
Соединение.Удалить(УРЛ, Заголовки);//feeds/spreadsheets/private/full

Получим список документов (и коллекций)

СайтУРЛ = "docs.google.com";
УРЛ = "feeds/default/private/full";
//УРЛ = "feeds/default/private/full/-/folder";
//GET /feeds/default/private/full/-/folder
//GET /feeds/default/private/full?showfolders=true
 
РезультатИмяФайла = ПолучитьИмяВременногоФайла();
//ПараметрАвторизации = ПолучитьПараметрАвторизации(); 
 
Соединение = Новый HTTPСоединение(СайтУРЛ, , , , , Истина); //"spreadsheets0.google.com"
 
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "GoogleLogin auth=" + Сред(ПараметрАвторизации, 6));
Заголовки.Вставить("GData-Version", "3.0");
                               
//Теперь можно отправлять GET или POST запросы гугловскому API.
//Например получение списка spreadsheets через GET:
Соединение.Получить(УРЛ, РезультатИмяФайла, Заголовки); //feeds/spreadsheets/private/full

Подробности смотреть в http://code.google.com/intl/ru-RU/apis/documents/docs/3.0/developers_guide_protocol.html

 
Обработка для 1C 8.2 во вложении к публикации - это просто заготовка, на которой изучалась/проверялась работа с API.


PS: Google Docs & Spreadsheets (сервисы writely, wise) изначально разные продукты (созданные в разное время), похоже Google немножко менял API и некоторые примеры из интернета не работают.

См. также

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22447    19    1    

22

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9207    9    8    

10

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    15745    10    17    

11

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48700    97    163    

86

Перенос начальных остатков из Парус 7.71 в БГУ

Внешние источники данных Взаиморасчеты Учет ОС и НМА Логистика, склад и ТМЦ Бюджетный учет Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 2.0 1С:Бухгалтерия государственного учреждения Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Перенос словарей и начальных остатков из ПП Парус-Бухгалтерия Бюджет 7.71 в 1Сv8 БГУ2. Заполнение словарей и документов по вводу начальных остатков. Не требуется установка ПП Парус7. Возможна дозагрузка. Позволит автоматически и наиболее полно ввести данные в программу для начала работы. 

15600 руб.

08.12.2011    81562    128    123    

147
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
0. nsirotkin@mail.ru 75 11.07.11 10:11 Сейчас в теме
Простой пример работы с Google Docs из 1С V8.
Рассмотрены только некоторые простые операции: получение списка документов/коллекций, загрузка документа на сервер, установка прав доступа, удаление документа.


Перейти к публикации

1. DanilaDru 262 11.07.11 10:11 Сейчас в теме
Занимался в начале года, выгружал данные в таблицу. http://danila.org.ua/?p=1166
Кстати, расскажите, какое было практическое применение данного функционала, если не секрет.
2. nsirotkin@mail.ru 75 11.07.11 16:23 Сейчас в теме
Возможное назначение (примерно как и у вас) опубликовать документ и отправить по электронной почте ссылку для ознакомления, при необходимости удалить публикацию.
Например: акт сверки для контрагента, расчетный листок для сотрудника, продажи/остатки/взаиморасчеты для менеджера.
Выглядит достаточно просто/удобно и не нужно городить web доступ.

Искал по форуму и в интернете, но ваш пример не видел. ПолучитьCOMОбъект("", "Microsoft.XMLHTTP") хоть какие то преимущества дает?
3. DanilaDru 262 12.07.11 09:57 Сейчас в теме
(2)не помню чтобы в ходе реализации я получил преимущества :) по-моему у меня наблюдались некоторые проблемы под веб клиент и было решено сделать так.
4. Danil.Potapov 514 13.07.11 21:08 Сейчас в теме
интересно, как узнал, что в методах Записать, ОтправитьДляОбработки, Удалить параметр Заголовки может быть не строкой а соответствием?
5. nsirotkin@mail.ru 75 14.07.11 05:04 Сейчас в теме
Хм. Действительно синтаксис помощник говорит тип параметра «Строка».
Я подсмотрел в форуме 26.10.2010 Капралов Александр (1С) приводил пример авторизации в Гугл АПИ http://partners.v8.1c.ru/forum/thread.jsp?id=852626#852626
6. alyuev 202 20.07.11 11:49 Сейчас в теме
Интересно, а как на семерке (v7.7) отправить файл?
7. nsirotkin@mail.ru 75 21.07.11 10:26 Сейчас в теме
(6) Наверное можно попробовать так http://forum.mista.ru/topic.php?id=105730

objHTTP = createObject("Microsoft.XMLHTTP");
//Пример отправки строки:
Попытка
objHTTP.open("POST",Адрес,0);
objHTTP.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
objHTTP.send(Источник);
8. CTDEVIce 4 10.10.11 12:55 Сейчас в теме
А как сделать POST-запрос с передачей параметров в файле? Что-то никак не получается.
9. nsirotkin@mail.ru 75 11.10.11 20:13 Сейчас в теме
(8) CTDEVIce,

POST=ОтправитьДляОбработки
В примере есть функция УстановитьПраваДоступа.
10. CTDEVIce 4 12.10.11 18:11 Сейчас в теме
Ага, вроде как понял. Попробую.
11. vovche 18.10.11 16:33 Сейчас в теме
12. ineshyk 09.07.13 12:49 Сейчас в теме
было бы здорово увидеть пример работы 1c и tasks api
13. nsirotkin@mail.ru 75 09.07.13 16:09 Сейчас в теме
(12) ineshyk

Работа с REST web сервисом edostavka.ru, пример POST запроса с параметрами
http://infostart.ru/public/84674/

Google Tasks API
https://developers.google.com/google-apps/tasks/

:)

Самому тоже интересно, но в ближайшем будущем туда не полезу.
1С проводили опрос в коференции по интеграции с другими системами, и поддержку REST web сервисов у них попросили.
14. ineshyk 09.07.13 16:42 Сейчас в теме
(12)
необходимость работы с Rest сервисами и json-объектами я поднимал на партнерке,
пока изучают вопрос.

за ссылки спасибо, документацию пока читаю, но там не совсем понятно с авторизацией и как использовать области (scope), например, такую https://www.googleapis.com/auth/tasks при авторизации пока не могу понять.


пока есть такой код получения списка задач:

[CODE ]СайтУРЛ = "www.googleapis.com/tasks/v1";
УРЛ = "/users/@me/lists?maxResults=10&key="+YOUR_API_KEY;

РезультатИмяФайла = ПолучитьИмяВременногоФайла();

Соединение = Новый HTTPСоединение(СайтУРЛ, , , , , Истина);

Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + Сред(ПараметрАвторизации, 6));
Заголовки.Вставить("X-JavaScript-User-Agent", "Google APIs Explorer");

//Теперь можно отправлять GET или POST запросы гугловскому API.
//Например получение списка spreadsheets через GET:
Соединение.Получить(УРЛ, РезультатИмяФайла, Заголовки);[/1C-CODE]


Параметр авторизации получаю пока по примеру со статьи:

ИмяПользователя = "***************";
	Пароль          = "***************";
	YOUR_API_KEY    = "***********************";
	ФайлИд = ПолучитьИмяВременногоФайла();                 
	Соединение = Новый HTTPСоединение("www.google.com", , , , , Истина);
	Соединение.Получить("accounts/ClientLogin?accountType=GOOGLE&service=writely&source=1C&Email=" + ИмяПользователя + "&Passwd=" +  Пароль, ФайлИд);
	
	//writely,wise 
	ФайлОтвета = Новый ТекстовыйДокумент;
	ФайлОтвета.Прочитать(ФайлИд, "utf-8");
	ПараметрАвторизации = ФайлОтвета.ПолучитьСтроку(3);
Показать


Понятно, что выдает ошибку авторизации при получении списка задач, т.к. что указывать строке подключения при авторизациии вот тут (service=writely&source=1C) понятия не имею, т.к. не могу найти в документации описания такого подключения.
17. nsirotkin@mail.ru 75 09.07.13 20:36 Сейчас в теме
(14) ineshyk

Я сам еще не пробовал OAuth 2.0

Посмотрите здесь https://developers.google.com/accounts/docs/OAuth2Login
и подробнее https://developers.google.com/accounts/docs/OAuth2Login#authenticationuriparameters

для Google Drive
For example, if you wanted per-file access to a user’s Google Drive, your scope might be openid profile email https://www.googleapis.com/auth/drive.file.


для Tasks API scope должен включать https://www.googleapis.com/auth/tasks

PS: Поделитесь потом результатами изысканий.
15. ineshyk 09.07.13 16:47 Сейчас в теме
(12) было не плохо увидеть пример использования авторизации OAuth 2.0 из 1С
16. ooosnika 09.07.13 17:04 Сейчас в теме
Интересная вещь,попдойдет ли она мне,у нас есть несколько объектов,с несвязанными базами между собой,и надо чтобы каждому объекту раз в час передавалась некоторая информация от других объектов.Пробывал делать через почту,но все всремя проблемы со спамом.Может этим воспользоваться,или я уже мудрю
18. kievanton 30.09.13 15:11 Сейчас в теме
пытаюcь опубликовать файл типа BAK - не получается и в архиве пробовал публиковать - тоже не получилось.
выдает ошибку: Files must be uploaded using the resumable upload mechanism.
полазил в инете, нашел пару способов - не помогло.
почитал документацию, тоже что-то похожее нашел - не помогло.
вот пример кода
ИсточникИмяФайла = "G:\i.topal\test_igor.bak";
	
	
	Файл = Новый Файл(ИсточникИмяФайла);
	РазмерФайла = Файл.Размер();
	ИмяФайла = Файл.Имя;
	Файл = Неопределено;
	 
	СайтУРЛ = "docs.google.com";
	//СайтУРЛ = "http://schemas.google.com/g/2005#resumable-create-media";
	УРЛ = "feeds/default/private/full?convert=false";
	//УРЛ = "feeds/upload/create-session/default/private/full?convert=false";
	РезультатИмяФайла = ПолучитьИмяВременногоФайла();
	 
	Соединение = Новый HTTPСоединение(СайтУРЛ, , , , , Истина);//"spreadsheets0.google.com"
	 
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Authorization", "GoogleLogin auth=" + Сред(ПараметрАвторизации, 6));
	Заголовки.Вставить("GData-Version", "3.0");
	Заголовки.Вставить("Content-Length", Формат(РазмерФайла, "ЧГ="));
	Заголовки.Вставить("Content-Type", "application/octet-stream");
	Заголовки.Вставить("Slug", ИмяФайла);
	                               
	//Теперь можно отправлять GET или POST запросы гугловскому API.
	//Отправка POST Запроса
	Соединение.ОтправитьДляОбработки(ИсточникИмяФайла, УРЛ, РезультатИмяФайла, Заголовки);
Показать
19. nsirotkin@mail.ru 75 03.10.13 17:41 Сейчас в теме
(18) kievanton,

Наверное, перспективнее сразу пробовать Google Drive API.
https://developers.google.com/drive/manage-uploads

Important: Version 3 of the Google Documents List API has been officially deprecated as of September 14, 2012. It will continue to work as per our deprecation policy, but we encourage you to move to the Google Drive API.


Я планировал поковырять Google Drive API, но не в ближайшее время. У вас есть уникальная возможность разобраться самостоятельно и поделиться достигнутыми результатами с сообществом.
20. kievanton 15.10.13 14:19 Сейчас в теме
(19) реализовал с помощью приложения гугл драйв, которое синхронит папку на компьютере с облаком, установил его под системной учетной записью, создал службу, которая им управляет.
в итоге: бекап вначале делается в отдельную папку, там архивируется, а потом копируется в папку, которая подключена к облаку, а система автоматом синхронит файлы с облаком.
21. nsirotkin@mail.ru 75 15.10.13 17:19 Сейчас в теме
(20) Нормально получилось.
И не зачем без необходимости прикручивать к 1С лишние вещи :)
22. DedMoroz1983 2 10.06.14 11:48 Сейчас в теме
В данной статье описано, как загрузить, удалять файл на google docs и получить список докуметут. Cтало интересно, а как же скачать сам файл/документ с google docs/drive?
23. nsirotkin@mail.ru 75 10.06.14 14:17 Сейчас в теме
24. artfa 58 19.10.14 23:42 Сейчас в теме
ошибка доступа к файлу, не проходит
		Соединение.Получить("accounts/ClientLogin?accountType=GOOGLE&service=writely&source=1C&Email=" + ИмяПользователя + "&Passwd=" +  Пароль, ФайлИд);//writely,wise 
25. nsirotkin@mail.ru 75 20.10.14 08:49 Сейчас в теме
(24) В google безопасность подкрутили.

Как вариант, можно разрешить доступ "ненадежным устройствам и приложениям".
www.google.com/settings/security/lesssecureapps
26. Гарин 1 01.04.15 11:13 Сейчас в теме
параметр авторизации получаю нормально, но команда ОтправитьДляОбработки(... выдает ошибку: Ошибка аутентификации при доступе к ресурсу: feeds/default/private/full
27. nsirotkin@mail.ru 75 01.04.15 19:17 Сейчас в теме
(26) Гарин,

Разрешить доступ "ненадежным устройствам и приложениям" не помогает? (25)

Надо мигрировать с Documents List API на Drive API

Warning: The deprecation period for Version 3 of the Google Documents List API is nearly at an end. On April 20, 2015, we will discontinue service for this API. This means that service calls to the API are no longer supported, and features implemented using this API will not function after April 20, 2015. You must migrate to the Drive API as soon as possible to avoid disruptions to your application.
28. drugoi_mir 15 06.05.15 15:10 Сейчас в теме
А каким образом изменить содержимое документа в . Т.е. к примеру я загрузил документ test.xls. Теперь хочу его содержимое перезаписать полностью из другого файла. Подскажите как можно это сделать?

Я получил id файла, который хочу перезаписать(нашел по наименованию). А дальше в гугле вообще непонятное описание следует, может кто поможет расшифровать, как это в 1С оформить, буду очень благодарен. Ниже описание с google api:
Обновление метаданных

Вот пример обновления как метаданные документа и его содержание, в то же время. Название документа обновляется, чтобы , например, документа и его содержимое заменяется содержимым Test.doc. Так запрос содержит новое содержание документа, редактировать СМИ ссылка используется.

Обратите внимание, что в том числе ETag для метаданных обеспечивает неявную If-Match для медиа-контента, а также, потому что любой обновление для медиа-контента вызывает ETag метаданных, чтобы изменить.

PUT https://docs.google.com/feeds/default/media/document:1234abcd
Authorization: <your authorization header here>
Content-Length: 73612
Content-Type: multipart/related; boundary="END_OF_PART"
Slug: test.doc
--END_OF_PART
Content-Type: application/atom+xml

<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="BxAaTxRZAyp7ImBq">
<category scheme="http://schemas.google.com/g/2005#kind"
term="http://schemas.google.com/docs/2007#document"/>
<title>example document</title>
</entry>

--END_OF_PART
Content-Type: application/msword

... doc contents here ...

--END_OF_PART
29. nsirotkin@mail.ru 75 07.05.15 12:45 Сейчас в теме
(28) drugoi_mir,

В статье есть пример удаления документа.
Сообщение (27) читали? (кусочек про поддержку API)
30. drugoi_mir 15 07.05.15 13:33 Сейчас в теме
(29) nsirotkin@mail.ru, смысл в том, что если удалить документ и допустим настроить права на доступ извне по ссылке, то ссылка доступа изменится. А нужно просто изменить содержимое документа, без изменения ссылки доступа.

Да читал. Там тоже описание такое себе. Как-то гугл в плане описания api не особо радует.

В Drive API еще проблема, что авторизация проходит только по oauth 2.0 При этом типе авторизации свое приложение надо регистрировать в гугле и пользователь должен нажать кнопку, что подтверждает доступ к данным. Таким образом полностью автоматической работы(чтобы пользователь не нажимал подтверждение) приложения не получится.

А задача при которой гугл можно использовать простая. Например выгружать остатки по номенклатуре в гугл докс. И менять их каждый день.
31. Ольга_tmp 71 28.04.16 09:37 Сейчас в теме
ClientLogin еще поддерживается гуглом?
32. nsirotkin@mail.ru 75 28.04.16 16:51 Сейчас в теме
(31) Ольга_tmp,

Статья уже не актуальна. Планировал сделать новую публикацию с oauth2.
Приложил тестовую обработку с oauth2 (по мотивам http://pro1c.net/pub/283).
Что в ней работает, а что нет, уже не помню (разбирайтесь сами)…
Токен живет 1час, может быть лучше смотреть в сторону яндекса.
Прикрепленные файлы:
GoogleDocsAPITest_auth2.epf
33. primara 53 04.10.16 09:37 Сейчас в теме
(32) nsirotkin@mail.ru, то, что токен живет 1 час - не проблема, нужно просто проверять живой ли еще токен, и если его время уже истекло, дергать процедуру обновления токена, она совершенно незаметна для пользователя.
nsirotkin@mail.ru; +1 Ответить
36. nsirotkin@mail.ru 75 12.10.16 12:50 Сейчас в теме
(33) primara,

Да, про обновление токена я знаю/понимаю.
Но после закрытия обработки некому обновлять токен.
34. quares 21 10.10.16 16:37 Сейчас в теме
(32) nsirotkin@mail.ru, Прикольно, конечно, однако как получить конкретный документ (таблицу) и данные из неё?
Заранее спасибо.
35. nsirotkin@mail.ru 75 12.10.16 12:43 Сейчас в теме
(34) quares,

Статья уже не актуальна. Приложена обработка (32)
или http://infostart.ru/public/520534/
38. echo77 1868 23.07.17 16:44 Сейчас в теме
(35) Напишите, пожалуйста, в начале статьи большими красными буквами, что статья не актуальна и приложите ссылку на новую публикацию с oauth2.
Я тут не читая комментариев начал пробовать :-)
37. echo77 1868 21.07.17 16:31 Сейчас в теме
Оставьте свое сообщение