Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

1С и Google cloud storage

1С и Google cloud storage
Я
   Slider2020
 
22.07.20 - 11:39
Привет. Нужна помощь,связь между 1с и google cloud storage, с последним ранее не работал.
Задача выгружать из 1c в backet файл csv,  получил keyfile.json (как я понимаю для авторизации).
Инструкций и примеров найти не смог(((
Кто то может подсказать(может кто сталкивался) как прикрутить к соединению это keyfile? (не путать с google sheets)
   Garykom
 
1 - 22.07.20 - 12:02
   Garykom
 
2 - 22.07.20 - 12:02
(1) все по аналогии
   eklmn
 
3 - 22.07.20 - 12:08
А в гугле посмотреть? Это если в другое могёш
https://cloud.google.com/iam/docs/quickstart-client-libraries

или это настроить
https://rclone.org/googlecloudstorage/
выгружай в папочку и синхранизируй

ну или да, как вариант затрахаться с кодом (1)
   Slider2020
 
4 - 23.07.20 - 11:28
К сожалению в другое не умею, что бы использовать библиотеки, папочку и синхронизацию.((
Пример http://catalog.mista.ru/public/673482/ - не совсем мой. У меня же главный вопрос это авторизация с помощью файла keyfile.json. Не могу сообразить как написать соединение что бы прикрутить к нему файл авторизации
   Serginio1
 
5 - 23.07.20 - 11:46
(4) Ну а, что мешает использовать http://catalog.mista.ru/public/238584/
   Slider2020
 
6 - 23.07.20 - 12:05
Хотелось бы сделать все не используя библиотеки и ВК.
   Garykom
 
7 - 23.07.20 - 12:10
(4) ты хотя бы свой "файла keyfile.json" открывал и глазками смотрел а?
   Garykom
 
8 - 23.07.20 - 12:19
(7)+ там внутри нуна client_email и private_key с помощью которого подписывается запрос на токен
   Slider2020
 
9 - 23.07.20 - 12:20
"извините был испуган", пробовал подписать, но ничего не получалось(((
   Slider2020
 
10 - 23.07.20 - 12:22
+ так же в примере идёт речь о html поле, которое я не хотел бы использовать.
   Garykom
 
11 - 23.07.20 - 12:22
   Slider2020
 
12 - 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, но доступ есть точно.
   Slider2020
 
13 - 23.07.20 - 20:24
(12)  + инструкции и примеры брал тут: https://cloud.google.com/storage/docs/uploading-objects#upload-object-json
   Garykom
 
14 - 24.07.20 - 07:27
(12) uploadType=media&name=[OBJECT_NAME] url а не в заголовках
АпиАдрес = "/upload/storage/v1/b/backet_name/o?uploadType=media&name=test.csv";
   Slider2020
 
15 - 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>
   Garykom
 
16 - 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);
   Garykom
 
17 - 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]";
   Slider2020
 
18 - 24.07.20 - 08:21
(16) делал и так и так
   Garykom
 
19 - 24.07.20 - 08:30
(18) проверь через curl с тем же токеном
и убедись что нет ошибки в [BUCKET_NAME]
   Slider2020
 
20 - 24.07.20 - 08:47
(19) пробовал подставлять и банкет ид, и банкет наме из строки. В заголовках правильно писать object_name или name или objectname?
Правильный ли код (15) ?
   Garykom
 
21 - 24.07.20 - 08:57
(20) код (15) неправильный
object_name писать не надо надо писать &name=ИмяТвоегоФайла

и не банкет а https://cloud.google.com/storage/docs/naming-buckets
   Garykom
 
22 - 24.07.20 - 08:58
И убедись что ты создал "ведро" ))
https://cloud.google.com/storage/docs/creating-buckets
   Garykom
 
23 - 24.07.20 - 08:59
   Slider2020
 
24 - 24.07.20 - 09:05
(22) ведро создали - точно, права на учётку дали точно. (21) код не правильный в каком месте,можете ткнуть? Если object_name = name, то bucket_name = ?
   Garykom
 
25 - 24.07.20 - 09:11
(24)
АпиАдрес = "/upload/storage/v1/b/"+ИмяВедра"+"/o?uploadType=media&name="+ИмяФайла;
   Slider2020
 
26 - 24.07.20 - 09:13
(25) из заголовков убрать?
   Garykom
 
27 - 24.07.20 - 09:14
(26) угу зачем там лишнее
в заголовках только авторизация и тип контента
причем еще вопрос какой тип контента правильный
   Garykom
 
28 - 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.
   Slider2020
 
29 - 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) тип нужно указывать в мануале вроде было описано
   Garykom
 
30 - 24.07.20 - 09:40
(29) у тебя ведро называется "backet_name" ?

и куда дел прицепление файла в тело?
 
 Рекламное место пустует
   Garykom
 
31 - 24.07.20 - 09:42
(30)+ Зависает все логично, ты размер указал файла и сервер ждет пока ты ему отправишь
   Slider2020
 
32 - 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"
      }
    ]
  }
}
   Garykom
 
33 - 24.07.20 - 09:52
(32) гы ты уверен что у тебя ведро на кириллице?
   Slider2020
 
34 - 24.07.20 - 09:55
(33) имя ведра заменил, vedro_name
   Garykom
 
35 - 24.07.20 - 09:57
   Garykom
 
36 - 24.07.20 - 09:58
(35)+ и там логика работы обычно от сервисного аккаунта создаешь рабочие акки, даешь им права и уже от них работаешь
   Slider2020
 
37 - 24.07.20 - 10:04
(36) (35) Рабочий аккаунт создан и зашит в keyfile.json, доступ у рабочего аккаунта есть.
   eklmn
 
38 - 24.07.20 - 12:00
(37) попробуй просто посмотреть в бакет

curl -X GET -H "Authorization: Bearer [OAUTH2_TOKEN]" \
  "https://storage.googleapis.com/storage/v1/b/[BUCKET_NAME]/o";
   Garykom
 
39 - 24.07.20 - 12:05
(38) Думаю на чтение у него есть, на запись нету
   Slider2020
 
40 - 27.07.20 - 10:42
(39) (38) Удалось, всем спасибо!
   zmaximka
 
41 - 27.07.20 - 15:38
(12) очень интересует
   Slider2020
 
42 - 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(((
   Garykom
 
43 - 05.08.20 - 10:18
>АпиАдрес = "storage/v1/b/name_backet/iam";

косяк, сам найдешь?
   Slider2020
 
44 - 05.08.20 - 10:21
(43) из инструкции: storage/v1/b/[BUCKET_NAME]/iam
если речь о "name_backet" - то это я написал, здесь так, в коде я передаю имябакета в который заливаю файлы
   trad
 
45 - 05.08.20 - 10:23
"/storage/..."
   Slider2020
 
46 - 05.08.20 - 10:28
(45) не помогло, 404
   Garykom
 
47 - 05.08.20 - 10:34
   Garykom
 
48 - 05.08.20 - 10:37
(47) в смысле post там нетути есть get или put https://cloud.google.com/storage/docs/json_api/v1/buckets/setIamPolicy

ВызватьHTTPМетод("PUT", HTTPЗапрос)
   tgu82
 
49 - 05.08.20 - 11:02
Нельзя ли сделать выгрузку из стиральной машины в утюг? )


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.