|
1С и Google cloud storage | ☑ | ||
---|---|---|---|---|
0
Slider2020
22.07.20
✎
11:39
|
Привет. Нужна помощь,связь между 1с и google cloud storage, с последним ранее не работал.
Задача выгружать из 1c в backet файл csv, получил keyfile.json (как я понимаю для авторизации). Инструкций и примеров найти не смог((( Кто то может подсказать(может кто сталкивался) как прикрутить к соединению это keyfile? (не путать с google sheets) |
|||
1
Garykom
гуру
22.07.20
✎
12:02
|
||||
2
Garykom
гуру
22.07.20
✎
12:02
|
(1) все по аналогии
|
|||
3
eklmn
гуру
22.07.20
✎
12:08
|
А в гугле посмотреть? Это если в другое могёш
https://cloud.google.com/iam/docs/quickstart-client-libraries или это настроить https://rclone.org/googlecloudstorage/ выгружай в папочку и синхранизируй ну или да, как вариант затрахаться с кодом (1) |
|||
4
Slider2020
23.07.20
✎
11:28
|
К сожалению в другое не умею, что бы использовать библиотеки, папочку и синхронизацию.((
Пример http://catalog.mista.ru/public/673482/ - не совсем мой. У меня же главный вопрос это авторизация с помощью файла keyfile.json. Не могу сообразить как написать соединение что бы прикрутить к нему файл авторизации |
|||
5
Serginio1
23.07.20
✎
11:46
|
(4) Ну а, что мешает использовать http://catalog.mista.ru/public/238584/
|
|||
6
Slider2020
23.07.20
✎
12:05
|
Хотелось бы сделать все не используя библиотеки и ВК.
|
|||
7
Garykom
гуру
23.07.20
✎
12:10
|
(4) ты хотя бы свой "файла keyfile.json" открывал и глазками смотрел а?
|
|||
8
Garykom
гуру
23.07.20
✎
12:19
|
(7)+ там внутри нуна client_email и private_key с помощью которого подписывается запрос на токен
|
|||
9
Slider2020
23.07.20
✎
12:20
|
"извините был испуган", пробовал подписать, но ничего не получалось(((
|
|||
10
Slider2020
23.07.20
✎
12:22
|
+ так же в примере идёт речь о html поле, которое я не хотел бы использовать.
|
|||
11
Garykom
гуру
23.07.20
✎
12:22
|
||||
12
Slider2020
23.07.20
✎
20:08
|
(11) спасибо, воспользовался, после успешного получения токена(если кому интересно как, могу написать), далее пишу следующий запрос для помещения файла в бакет:
АпиАдрес = "/upload/storage/v1/b/backet_name/o"; ФайлОтправки = Новый Файл("C:\Users\user\Downloads\test.csv"); РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер()); Ресурс = АпиАдрес; URLСайта = "storage.googleapis.com"; OpenSSL = Новый ЗащищенноеСоединениеOpenSSL(); ЗаголовокЗапросаHTTP = Новый Соответствие(); ЗаголовокЗапросаHTTP.Вставить("Content-Length", РазмерФайлаОтправки); //ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=UTF-8"); ЗаголовокЗапросаHTTP.Вставить("Content-Type", "text/csv"); ЗаголовокЗапросаHTTP.Вставить("Authorization", "Bearer " + токен); ЗаголовокЗапросаHTTP.Вставить("uploadType", "media"); ЗаголовокЗапросаHTTP.Вставить("name", "test.csv"); HTTP = Новый HTTPСоединение(URLСайта,,,,,,OpenSSL); HTTPЗапрос = Новый HTTPЗапрос(Ресурс, ЗаголовокЗапросаHTTP); //HTTPЗапрос.УстановитьИмяФайлаТела("C:\Users\user\Downloads\test.csv"); HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(Новый ДвоичныеДанные("C:\Users\user\Downloads\test.csv")); HTTPОтвет = HTTP.ОтправитьДляОбработки(HTTPЗапрос); Если HTTPОтвет.КодСостояния = 200 Тогда Сообщить("Успешно"); ИначеЕсли HTTPОтвет.КодСостояния = 401 Тогда Сообщить("Токен не принят, получите новый"); Иначе Сообщить(Строка(HTTPОтвет.КодСостояния) + " " + Строка(HTTPОтвет.ПолучитьТелоКакСтроку())); КонецЕсли; и получаю ошибку 403, но доступ есть точно. |
|||
13
Slider2020
23.07.20
✎
20:24
|
(12) + инструкции и примеры брал тут: https://cloud.google.com/storage/docs/uploading-objects#upload-object-json
|
|||
14
Garykom
гуру
24.07.20
✎
07:27
|
(12) uploadType=media&name=[OBJECT_NAME] url а не в заголовках
АпиАдрес = "/upload/storage/v1/b/backet_name/o?uploadType=media&name=test.csv"; |
|||
15
Slider2020
24.07.20
✎
07:54
|
(14) АпиАдрес = "/upload/storage/v1/b";
ФайлОтправки = Новый Файл("C:\Users\User\Downloads\test.csv"); РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер()); Ресурс = АпиАдрес; URLСайта = "http://www.storage.googleapis.com"; OpenSSL = Новый ЗащищенноеСоединениеOpenSSL(); ЗаголовокЗапросаHTTP = Новый Соответствие(); ЗаголовокЗапросаHTTP.Вставить("Content-Length", РазмерФайлаОтправки); //ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=UTF-8"); ЗаголовокЗапросаHTTP.Вставить("Content-Type", "text/csv"); ЗаголовокЗапросаHTTP.Вставить("Authorization", "Bearer " + токен); ЗаголовокЗапросаHTTP.Вставить("uploadType", "media"); ЗаголовокЗапросаHTTP.Вставить("BUCKET_NAME", "BUCKET_NAME"); ЗаголовокЗапросаHTTP.Вставить("OBJECT_NAME", "test.csv"); HTTP = Новый HTTPСоединение(URLСайта,,,,,,OpenSSL); HTTPЗапрос = Новый HTTPЗапрос(Ресурс, ЗаголовокЗапросаHTTP); HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(Новый ДвоичныеДанные("C:\Users\User\Downloads\test.csv")); HTTPОтвет = HTTP.ОтправитьДляОбработки(HTTPЗапрос); Если HTTPОтвет.КодСостояния = 200 Тогда Сообщить("Успешно"); ИначеЕсли HTTPОтвет.КодСостояния = 401 Тогда Сообщить("Токен не принят, получите новый"); Иначе Сообщить(Строка(HTTPОтвет.КодСостояния) + " " + Строка(HTTPОтвет.ПолучитьТелоКакСтроку())); КонецЕсли; Получаю: 403 <?xml version='1.0' encoding='UTF-8'?><Error><Code>AccessDenied</Code><Message>Access denied.</Message></Error> |
|||
16
Garykom
гуру
24.07.20
✎
08:16
|
(15) Юморист не из параметров в заголовки, а из заголовков в параметры перенеси.
Должно быть пиАдрес = "/upload/storage/v1/b/backet_name/o?uploadType=media&name=test.csv"; ... ЗаголовокЗапросаHTTP = Новый Соответствие(); ЗаголовокЗапросаHTTP.Вставить("Content-Length", РазмерФайлаОтправки); ЗаголовокЗапросаHTTP.Вставить("Content-Type", "text/csv"); ЗаголовокЗапросаHTTP.Вставить("Authorization", "Bearer " + токен); HTTP = Новый HTTPСоединение(URLСайта,,,,,,OpenSSL); HTTPЗапрос = Новый HTTPЗапрос(Ресурс, ЗаголовокЗапросаHTTP); |
|||
17
Garykom
гуру
24.07.20
✎
08:16
|
(16)+ в мануале же пример для курла
curl -X POST --data-binary @[OBJECT_LOCATION] \ -H "Authorization: Bearer [OAUTH2_TOKEN]" \ -H "Content-Type: [OBJECT_CONTENT_TYPE]" \ "https://storage.googleapis.com/upload/storage/v1/b/[BUCKET_NAME]/o?uploadType=media&name=[OBJECT_NAME]" |
|||
18
Slider2020
24.07.20
✎
08:21
|
(16) делал и так и так
|
|||
19
Garykom
гуру
24.07.20
✎
08:30
|
(18) проверь через curl с тем же токеном
и убедись что нет ошибки в [BUCKET_NAME] |
|||
20
Slider2020
24.07.20
✎
08:47
|
(19) пробовал подставлять и банкет ид, и банкет наме из строки. В заголовках правильно писать object_name или name или objectname?
Правильный ли код (15) ? |
|||
21
Garykom
гуру
24.07.20
✎
08:57
|
(20) код (15) неправильный
object_name писать не надо надо писать &name=ИмяТвоегоФайла и не банкет а https://cloud.google.com/storage/docs/naming-buckets |
|||
22
Garykom
гуру
24.07.20
✎
08:58
|
И убедись что ты создал "ведро" ))
https://cloud.google.com/storage/docs/creating-buckets |
|||
23
Garykom
гуру
24.07.20
✎
08:59
|
||||
24
Slider2020
24.07.20
✎
09:05
|
(22) ведро создали - точно, права на учётку дали точно. (21) код не правильный в каком месте,можете ткнуть? Если object_name = name, то bucket_name = ?
|
|||
25
Garykom
гуру
24.07.20
✎
09:11
|
(24)
АпиАдрес = "/upload/storage/v1/b/"+ИмяВедра"+"/o?uploadType=media&name="+ИмяФайла; |
|||
26
Slider2020
24.07.20
✎
09:13
|
(25) из заголовков убрать?
|
|||
27
Garykom
гуру
24.07.20
✎
09:14
|
(26) угу зачем там лишнее
в заголовках только авторизация и тип контента причем еще вопрос какой тип контента правильный |
|||
28
Garykom
гуру
24.07.20
✎
09:19
|
(27)+ хотя вроде можно даже не указывать
Content-Type The most commonly set metadata is Content-Type (also known as media type), which allows browsers to render the object properly. All objects have a value specified in their Content-Type metadata, but this value does not have to match the underlying type of the object. For example, if the Content-Type is not specified by the uploader and cannot be determined, it is set to application/octet-stream or application/x-www-form-urlencoded, depending on how you uploaded the object. Refer to the IANA Media Types page for a list of valid content types. |
|||
29
Slider2020
24.07.20
✎
09:38
|
Написал так, На HTTPОтвет - зависает, начинает выполнять: HTTP.ОтправитьДляОбработки(HTTPЗапрос) - и зависает,
ИмяФайла = "C:\Users\user\Downloads\test.csv"; OpenSSL = Новый ЗащищенноеСоединениеOpenSSL(); URLСайта = "storage.googleapis.com"; АпиАдрес = "/upload/storage/v1/b/backet_name/o?uploadType=media&name="+ИмяФайла+""; ФайлОтправки = Новый Файл(ИмяФайла); РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер()); ЗаголовокЗапросаHTTP = Новый Соответствие(); ЗаголовокЗапросаHTTP.Вставить("Content-Length", РазмерФайлаОтправки); ЗаголовокЗапросаHTTP.Вставить("Content-Type", "text/csv"); ЗаголовокЗапросаHTTP.Вставить("Authorization", "Bearer " + токен); HTTP = Новый HTTPСоединение(URLСайта,,,,,,OpenSSL); HTTPЗапрос = Новый HTTPЗапрос(АпиАдрес, ЗаголовокЗапросаHTTP); HTTPОтвет = HTTP.ОтправитьДляОбработки(HTTPЗапрос); Если HTTPОтвет.КодСостояния = 200 Тогда Сообщить("Успешно"); ИначеЕсли HTTPОтвет.КодСостояния = 401 Тогда Сообщить("Токен не принят, получите новый"); Иначе Сообщить(Строка(HTTPОтвет.КодСостояния) + " " + Строка(HTTPОтвет.ПолучитьТелоКакСтроку())); КонецЕсли; (28) тип нужно указывать в мануале вроде было описано |
|||
30
Garykom
гуру
24.07.20
✎
09:40
|
(29) у тебя ведро называется "backet_name" ?
и куда дел прицепление файла в тело? |
|||
31
Garykom
гуру
24.07.20
✎
09:42
|
(30)+ Зависает все логично, ты размер указал файла и сервер ждет пока ты ему отправишь
|
|||
32
Slider2020
24.07.20
✎
09:51
|
ИмяБакета = "ИмяБакета";
ИмяФайла = "C:\Users\user\Downloads\test.csv"; OpenSSL = Новый ЗащищенноеСоединениеOpenSSL(); URLСайта = "storage.googleapis.com"; АпиАдрес = "/upload/storage/v1/b/"+ИмяБакета+"/o?uploadType=media&name="+ИмяФайла+""; ФайлОтправки = Новый Файл(ИмяФайла); РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер()); ЗаголовокЗапросаHTTP = Новый Соответствие(); ЗаголовокЗапросаHTTP.Вставить("Content-Length", РазмерФайлаОтправки); ЗаголовокЗапросаHTTP.Вставить("Content-Type", "text/csv"); ЗаголовокЗапросаHTTP.Вставить("Authorization", "Bearer " + токен); HTTP = Новый HTTPСоединение(URLСайта,,,,,,OpenSSL); HTTPЗапрос = Новый HTTPЗапрос(АпиАдрес, ЗаголовокЗапросаHTTP); HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайла); HTTPОтвет = HTTP.ОтправитьДляОбработки(HTTPЗапрос); Если HTTPОтвет.КодСостояния = 200 Тогда Сообщить("Успешно"); ИначеЕсли HTTPОтвет.КодСостояния = 401 Тогда Сообщить("Токен не принят, получите новый"); Иначе Сообщить(Строка(HTTPОтвет.КодСостояния) + " " + Строка(HTTPОтвет.ПолучитьТелоКакСтроку())); КонецЕсли; Вернулся к ошибке: 403 { "error": { "code": 403, "message": "Insufficient Permission", "errors": [ { "message": "Insufficient Permission", "domain": "global", "reason": "insufficientPermissions" } ] } } |
|||
33
Garykom
гуру
24.07.20
✎
09:52
|
(32) гы ты уверен что у тебя ведро на кириллице?
|
|||
34
Slider2020
24.07.20
✎
09:55
|
(33) имя ведра заменил, vedro_name
|
|||
35
Garykom
гуру
24.07.20
✎
09:57
|
(34) да я понял
короче права на ведро проверь https://stackoverflow.com/questions/51962488/google-cloud-storage-insufficient-permission https://gist.github.com/ryderdamen/926518ddddd46dd4c8c2e4ef5167243d |
|||
36
Garykom
гуру
24.07.20
✎
09:58
|
(35)+ и там логика работы обычно от сервисного аккаунта создаешь рабочие акки, даешь им права и уже от них работаешь
|
|||
37
Slider2020
24.07.20
✎
10:04
|
(36) (35) Рабочий аккаунт создан и зашит в keyfile.json, доступ у рабочего аккаунта есть.
|
|||
38
eklmn
гуру
24.07.20
✎
12:00
|
(37) попробуй просто посмотреть в бакет
curl -X GET -H "Authorization: Bearer [OAUTH2_TOKEN]" \ "https://storage.googleapis.com/storage/v1/b/[BUCKET_NAME]/o" |
|||
39
Garykom
гуру
24.07.20
✎
12:05
|
(38) Думаю на чтение у него есть, на запись нету
|
|||
40
Slider2020
27.07.20
✎
10:42
|
(39) (38) Удалось, всем спасибо!
|
|||
41
zmaximka
27.07.20
✎
15:38
|
(12) очень интересует
|
|||
42
Slider2020
05.08.20
✎
10:15
|
И снова здравствуйте, и вот по какому поводу: делаю доступ ко всем файлам в бакете открытым по следующей инструкцие:
https://cloud.google.com/storage/docs/access-control/making-data-public#rest-make-bucket-public пишу вот такой код: Тело = "{ |""bindings"":[ |{ | ""role"": ""roles/storage.objectViewer"", | ""members"":[""allUsers""] |} |] |}"; ИмяФайла = КаталогВременныхФайлов() + "access.json"; ТекстовыйФайлЗапись = Новый ЗаписьТекста(ИмяФайла,КодировкаТекста.UTF8); ТекстовыйФайлЗапись.ЗаписатьСтроку(Тело); ТекстовыйФайлЗапись.Закрыть(); OpenSSL = Новый ЗащищенноеСоединениеOpenSSL(); URLСайта = "storage.googleapis.com"; АпиАдрес = "storage/v1/b/name_backet/iam"; ЗаголовокЗапросаHTTP = Новый Соответствие(); ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json"); ЗаголовокЗапросаHTTP.Вставить("Authorization", "Bearer " + токен); HTTP = Новый HTTPСоединение(URLСайта,,,,,,OpenSSL); HTTPЗапрос = Новый HTTPЗапрос(АпиАдрес, ЗаголовокЗапросаHTTP); HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайла); HTTPОтвет = HTTP.ОтправитьДляОбработки(HTTPЗапрос); Получаю 404((( |
|||
43
Garykom
гуру
05.08.20
✎
10:18
|
>АпиАдрес = "storage/v1/b/name_backet/iam";
косяк, сам найдешь? |
|||
44
Slider2020
05.08.20
✎
10:21
|
(43) из инструкции: storage/v1/b/[BUCKET_NAME]/iam
если речь о "name_backet" - то это я написал, здесь так, в коде я передаю имябакета в который заливаю файлы |
|||
45
trad
05.08.20
✎
10:23
|
"/storage/..."
|
|||
46
Slider2020
05.08.20
✎
10:28
|
(45) не помогло, 404
|
|||
47
Garykom
гуру
05.08.20
✎
10:34
|
(46) метод не тот https://cloud.google.com/storage/docs/json_api/v1/buckets/getIamPolicy
|
|||
48
Garykom
гуру
05.08.20
✎
10:37
|
(47) в смысле post там нетути есть get или put https://cloud.google.com/storage/docs/json_api/v1/buckets/setIamPolicy
ВызватьHTTPМетод("PUT", HTTPЗапрос) |
|||
49
tgu82
05.08.20
✎
11:02
|
Нельзя ли сделать выгрузку из стиральной машины в утюг? )
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |