Dropbox — это один самых популярных сервисов облачного хранения данных. Подобному сервису облачного хранения данных можно придумать массу применений (например, хранить резервные копии данных), а для реализации всех светлых идей Dropbox предоставляет доступ для сторонних приложений по протоколу OAuth. И сегодняшняя статья расскажет о том, как работать с Dropbox из 1С.
Для начала нужно зарегистрироваться в Dropbox и создать приложение и создать приложение при помощи App Console.
Создание приложения с полным доступом к аккаунту Dropbox выглядит так:
От только что созданного приложения нам потребуются два ключа: App key и App secret.
Я не буду приводить в статье весь код обработки (его там достаточно много), поясню лишь основные моменты и предупреждаю, что код написан по-минимуму (какие-либо оповещения и обработки ошибок отсутствуют).
Для начала нужно объявить глобальные переменные «WinHttp» и «ДанныеАвторизации» — я их объявил в модуле управляемого приложения, хотя это можно сделать и в другом месте. Там же (в модуле управляемого приложения) я инициализировал переменную «WinHttp»:
1 | WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); |
В процедуре авторизации я помещаю, полученные ранее, App key и App secret в структуру «ДанныеАвторизации». Затем делается запрос, на получение OAuth ключей:
1 2 3 | WinHttp.Open("POST", "https://api.dropbox.com/1/oauth/request_token", Ложь); WinHttp.SetRequestHeader("Authorization", "OAuth 1.0"", PLAINTEXT"", " + ДанныеАвторизации.AppId + """, " + ДанныеАвторизации.AppS + "&"""); WinHttp.Send(); |
Обрабатываем ответ, и помещаем полученные OAuth ключи в структуру «ДанныеАвторизации». После этого нужно дать пользователю возможность авторизоваться в аккаунте Dropbox и разрешить доступ приложению, для этого открывается отдельно окно с единственным объектом — поле HTML документа.
1 2 3 | ФормаАвторизации = ПолучитьФорму("Обработка.Dropbox.Форма.ФормаРегистрации", , ЭтаФорма); ФормаАвторизации.HTML = "https://www.dropbox.com/1/oauth/authorize?oauth_token=" + ДанныеАвторизации.oauth_token + "&oauth_callback=http://1c-programmer-blog.ru/dropbox.html"; ФормаАвторизации.ОткрытьМодально(); |
Параметр oauth_callback содержит страницу, на которую пользователь перенаправляется после регистрации Dropbox-приложения (у меня на этой странице написано, что окно можно закрыть).
После этого отправляем запрос на конвертацию наших OAuth ключей:
1 2 3 | WinHttp.Open("POST", "https://api.dropbox.com/1/oauth/access_token", Ложь); WinHttp.SetRequestHeader("Authorization", "OAuth 1.0"", PLAINTEXT"", " + ДанныеАвторизации.AppId + """, " + ДанныеАвторизации.oauth_token + """, " + ДанныеАвторизации.AppS + "&" + ДанныеАвторизации.oauth_token_secret + """"); WinHttp.Send(); |
Результат запроса обрабатываем и записываем конвертированные ключи в структуру «ДанныеАвторизации» (заменяя старые OAuth ключи).
Далее коротко. Информация об аккаунте (ответ в формате JSON):
1 2 3 | WinHttp.Open("GET", "https://api.dropbox.com/1/account/info", Ложь); WinHttp.SetRequestHeader("Authorization", "OAuth 1.0"", PLAINTEXT"", " + ДанныеАвторизации.AppId + """, " + ДанныеАвторизации.oauth_token + """, " + ДанныеАвторизации.AppS + "&" + ДанныеАвторизации.oauth_token_secret + """"); WinHttp.Send(); |
Список файлов (ответ в формате JSON):
1 2 3 | WinHttp.Open("GET", "https://api.dropbox.com/1/metadata/auto/?list=true", Ложь); WinHttp.SetRequestHeader("Authorization", "OAuth 1.0"", PLAINTEXT"", " + ДанныеАвторизации.AppId + """, " + ДанныеАвторизации.oauth_token + """, " + ДанныеАвторизации.AppS + "&" + ДанныеАвторизации.oauth_token_secret + """"); WinHttp.Send(); |
Скачивание файла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | WinHttp.Open("GET", "https://api-content.dropbox.com/1/files/auto" + Элементы.Файлы.ТекущиеДанные.Файл + "", Ложь); WinHttp.SetRequestHeader("Authorization", "OAuth 1.0"", PLAINTEXT"", " + ДанныеАвторизации.AppId + """, " + ДанныеАвторизации.oauth_token + """, " + ДанныеАвторизации.AppS + "&" + ДанныеАвторизации.oauth_token_secret + """"); WinHttp.Send(); Если WinHttp.Status = 200 Тогда StreamOut = Новый COMОбъект("ADODB.Stream"); StreamOut.Type = 1; StreamOut.Mode = 3; StreamOut.Open(); StreamOut.Write(WinHttp.ResponseBody); StreamOut.SaveToFile(Диалог.ПолноеИмяФайла, 2); StreamOut.Close(); StreamOut = Неопределено; КонецЕсли; |
Загрузка файла (стандартными средствами, ибо через WinHttp это не так-то просто):
1 2 3 4 | Заголовки = Новый Соответствие; Заголовки.Вставить("Authorization", "OAuth 1.0"", PLAINTEXT"", " + ДанныеАвторизации.AppId + """, " + ДанныеАвторизации.oauth_token + """, " + ДанныеАвторизации.AppS + "&" + ДанныеАвторизации.oauth_token_secret + """"); Соединение = Новый HTTPСоединение("api-content.dropbox.com",,,,,Истина); Соединение.ОтправитьДляОбработки(Диалог.ПолноеИмяФайла, "1/files_put/auto" + Элементы.Файлы.ТекущиеДанные.Файл + "/" + Ф.Имя + "", ПолучитьимяВременногоФайла("txt"), Заголовки); |
И напоследок сама обработка и некоторые ссылки:
Загрузка...
В мобильном приложении возникает ошибка при создании COMОбъекта. Как исправить?
В мобильном приложении работать не будет, т.к. в нем нельзя использовать COM.
Исправить можно переписав код: заменить COM-объект для HHTP-запросов на соответствующий объект в 1С.
А можно как-то сделать чтобы каждый раз не надо было подтверждать доступ ?
Статья к сожалению устарела, т.к. Dropbox теперь использует OAuth 2, так что спасибо за основы но лично я пошел курить документацию