Имя: Пароль:
1C
1С v8
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
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
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
Нельзя ли сделать выгрузку из стиральной машины в утюг? )
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.