Скачивание файла обновлений

Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
1. markovki 19 14.08.15 11:07 Сейчас в теме
Доброе время суток уважаемые форумчане.
Пытаюсь программно скачать файл обновлений:
Устанавливаем соединение:
Соединение = Новый HTTPСоединение(АдресСервера,, КодПользователя, Пароль,);
	Возврат Соединение;

Пытаемся получить файл:
Попытка
	Соединение.Получить(Адрес, ЛокальныйПуть);
Исключение
	Возврат "Ошибка получения файла: "+ОписаниеОшибки();
КонецПопытки;

Дело в том, что работает такая конструкция, если Адрес = "1c/Accounting/3_0_39_67/1cv8.zip", даже если ничего не меняя в коде подставляю в переменную Адрес например "get/Info/Accounting/3_0_39_67/updsetup.exe", то ошибка:
Неудача: Ошибка получения файла: {ОбщийМодуль.Сервера1С.Модуль}: Ошибка при вызове метода контекста (Получить): Ошибка доступа к файлу 'get/Info/Accounting/3_0_37_36/updsetup.exe': Ошибка работы с Интернет:  доступ запрещен. 

<ht ml>
<head><title>403 Forbidden</title></head>
<body>
<h1>403 Forbidden</h1>
</body>
</html>
 : Ошибка работы с Интернет:  доступ запрещен (403)
Показать

И вот что интересно, если захожу на портал 1С, на страницу, где уже висит ссылка непосредственно на это обновление, тогда конфигурация успешно качает, и так для каждого релиза.
Подскажите в чём может быть причина и как исправить?
Если дело в сессиях, то как их использовать? Может сначала инициировать "заход" на страницу со ссылкой, и затем используя сессию этого соединения пытаться скачать файл? Ну это так, мысли вслух.
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. markovki 19 14.08.15 11:20 Сейчас в теме
Да и ещё, адрес страницы со ссылкой на архив обновлений имеет следующий вид:
https://releases.1c.ru/version_file?nick=Accounting30&ver=3.0.37.36&path=Accounting\3_0_37_36\updsetup.exe
Адрес самой ссылки:
http://downloads.v8.1c.ru/get/Info/Accounting/3_0_37_36/updsetup.exe
3. markovki 19 14.08.15 11:47 Сейчас в теме
Может есть какие-то идеи, примеры? В какую сторону копать?
4. markovki 19 14.08.15 11:53 Сейчас в теме
Если совсем никаких идей, может подскажет кто, как подключиться к
https://releases.1c.ru/version_file?nick=Accounting30&ver=3.0.37.36&path=Accounting\3_0_37_36\updsetup.exe
5. Xershi 1473 14.08.15 11:58 Сейчас в теме
(4) markovki, может есть код в 1с, который по кнопке ищет обновление. Тогда попробуйте его посмотреть.
6. markovki 19 14.08.15 12:04 Сейчас в теме
(5) Xershi, в том то и дело, что типовой код скачивает непосредственно zip-архив с шаблоном *.cfu
А мне надо скачать самораспаковывающийся архив, для установки этого шаблона
7. Serega-artem 15 14.08.15 12:24 Сейчас в теме
Мысли в слух, не более.

Ну судя по 403 ошибке - проблема в авторизации. Вы заходите, вводите (или браузер вводит за вас) логин и пароль, создается сессия. В рамках этой сессии вам предоставляется доступ. Потом сессия зарывается и всё. Однако, мне непонятно вот что. Сессия создается "для браузера", через куки. Почему тогда авторизация через браузер открывает доступ для 1с? Но здесь есть мысль. Адрес изначальной ссылки идет через https т.е. через защищенное соединение, там происходит авторизация и формируется (или "открывается") уже собственно ссылка на закачку файла. Возможно ссылка становится доступной для конкретного ip и тогда все логично. В любом случаи, мне кажется, нужно копать в сторону авторизации при запросе файла. Например, передавать логин и пароль через get или еще как-то....
8. fokin 14.08.15 12:36 Сейчас в теме
когда пытаюсь скачать с сайта у меня тоже 403 Forbidden
и вот что мне ответило 1С:

Добрый день!

Причина в следующем:
Ваши запросы идут через прокси-сервера Вашего провайдера, причем IP-адреса изменяются динамически. Т.е. авторизация прошла с одного IP, а при скачивании обновления у Вас другой IP-адрес.
Поскольку система контроля доступа к релизам использует информацию об IP-адресе, Ваш запрос на дистрибутив не пропускается.
Для решения этой проблемы Вам необходимо либо потребовать от своего провайдера прямой доступ к сети (минуя прокси-сервера), либо попробовать сменить провайдера.


так что думаю здесь тоже самое
markovki; +1 Ответить
9. Serega-artem 15 14.08.15 13:03 Сейчас в теме
(8) fokin, Получается сессия привязывается к IP. Тогда всё логично. Надо думать как сделать программную авторизацию.
11. markovki 19 14.08.15 13:33 Сейчас в теме
(10) cassper, спасибо, почитал. К сожалению снова речь о cf или cfu, но ни слова об архивах exe для установки шаблона. Мне необходимо скачать именно самораспаковывающийся архив, чтобы в дальнейшем можно было установить шаблон.
12. markovki 19 14.08.15 13:38 Сейчас в теме
Тогда вопрос:
Как программно авторизоваться на
https://releases.1c.ru/version_file?nick=Accounting30&ver=3.0.37.36&path=Accounting\3_0_37_36\updsetup.exe
Пусть даже с открытием окна браузера или открытием в неком окне 1с, в общем любой похожий пример, ну программно без открытия окон это конечно идеальный вариант :)
13. markovki 19 14.08.15 14:29 Сейчас в теме
Ап
Как авторизоваться на сайте? Приветствуются любые способы
14. Serega-artem 15 14.08.15 14:52 Сейчас в теме
(13) markovki, Чтобы придумать какой-то "умный метод" надо знать как работает система. Как я понимаю, API, как такового, нет, а значит надо искать обходные пути. Я не знаю управляемые у вас формы или обычные, есть вариант для обычных. Чисто теория, т.к. протестировать сейчас нет возможности.

1. Заходим через IE (это важно) на https://login.1c.ru. Выполняем авторизацию, не забыв указать галку "запомнить меня".

2. В обычных формах можно было создать обработку-браузер. Это обычная обработка, с элементом Поле html документа. Назовем элемент "ОкноБраузера".

3. В обработке пишем такой код:

Процедура ПриОткрытии ()
	ЭлементыФормы.ОкноБраузера.Перейти("https://login.1c.ru");
           // Дадим 10 сек. на открытие ссылки. 
         Предупреждение("Эта форма закроется сама!",10,);
         ЭтаФормаЗакрыть(); 
КонецПроцедуры	


4. Перед началом выполнения вашего кода пишем:

ОткрытьФорму("Обработки.Браузер.ФормаЭлемента");



Суть идеи такова, что поле HTML документа базируется на движке IE. Соответственно ссылка будет обработана именно IE с учетом его куков (мы же ставили галку "запомнить"). Вы пройдете авторизацию, создаться сессия для IP и вперед.

Это в теории. На практике - надо побывать.
markovki; +1 Ответить
15. markovki 19 14.08.15 15:19 Сейчас в теме
(14) Serega-artem, Как раз сейчас копаю примерно в этом же направлении, пытаюсь открыть страницу в браузере, в том числе используя COMОбъект. Не удается залогиниться. Пока вопрос открыт. Если можно как-то это сделать именно, через COMОбъект, то и проблема решилась бы
16. Serega-artem 15 14.08.15 15:22 Сейчас в теме
(15) markovki, Вы бы фрагмент кода привели, как именно вы пытаетесь открыть через como.
17. markovki 19 14.08.15 15:46 Сейчас в теме
Просто пытался открыть страницу в браузере, что-то вроде:
Сайт = Новый COMОбъект("InternetExplorer.Application");
Сайт.Navigate("https://releases.1c.ru/version_file?nick=Accounting30&ver=3.0.39.16&path=Accounting\3_0_39_16\updsetup.exe");
Сайт.Visible = Истина;

Опять же вопрос авторизации.
COM никогда не юзал.
Рою документацию, интернет, пока ничего толкового
18. Serega-artem 15 14.08.15 16:13 Сейчас в теме
(17) markovki, Попробуйте мой вариант, но через ком. Зайдите на https://login.1c.ru, авторизуйтесь, поставить галку запомнить. Потом в коде:

Сайт = Новый COMОбъект("InternetExplorer.Application");
Сайт.Navigate("https://login.1c.ru");
Сайт.Visible = Истина;
19. markovki 19 14.08.15 16:22 Сейчас в теме
(18) Serega-artem, вас понял, но не вижу разницы, если вручную я могу зайти и из браузера, чтобы залогиниться. Задача - автоматизировать процесс.
24. Serega-artem 15 14.08.15 19:26 Сейчас в теме
(19) markovki, Вы меня немного не поняли (или я вас))) ). Имелось ввиду, что надо зайти один раз, сохранить пароль в куки и дальше в теории должно было работать автоматически. В любом случаи, метод предложенный foxey более надежный!
20. markovki 19 14.08.15 16:24 Сейчас в теме
Если бы можно было, например, вашим методом автоматически ввести логин и пароль тогда да...
21. foxey 4 14.08.15 17:23 Сейчас в теме
Вот набросал обработочку... Открывает страничку в ПолеHTML, логинится там, а дальше уже идете куда Вам там надо за файлом.
22. foxey 4 14.08.15 17:24 Сейчас в теме
Перем ЭтоПервыйПоказСтраницы;
Процедура ПриОткрытии()
	ЭтоПервыйПоказСтраницы = Истина;
	АдреснаяСтрока = "https://login.1c.ru";
	ЭлементыФормы.ПолеHTML.Перейти(АдреснаяСтрока);
КонецПроцедуры

Процедура ПолеHTMLДокументСформирован(Элемент)
	
	ТекстДокумента = ЭлементыФормы.ПолеHTML.ПолучитьТекст();
	Если Найти(ТекстДокумента, "Личные данные") > 0 И ЭтоПервыйПоказСтраницы Тогда
		// Это нужная страничка открылась... Найдем элемент HTML с логином и паролем, заполним их и нажмем кнопочку отправки формы на сервер.
		ЭтоПервыйПоказСтраницы = Ложь;
		ЭлементыФормы.ПолеHTML.Документ.all("username").value = "user_name";
		ЭлементыФормы.ПолеHTML.Документ.all("password").value = "Pass";
		ЭлементыФормы.ПолеHTML.Документ.all("loginForm").submit();
	КонецЕсли;
	
КонецПроцедуры
Показать

Т.е. на форме элемент ПолеHTMLДокумента и событие ДокументСформирован у него отлавливаем. Флажок ЭтоПервыйПоказСтраницы нужен для избавления от рекурсии.
Serega-artem; markovki; +2 Ответить
23. markovki 19 14.08.15 19:09 Сейчас в теме
(22) foxey, Спасибо за комментарий!!! Используя ваш пример сделал переход по 4-м ссылкам и СРАБОТАЛО!!!! Файл после исполнения кода начал загружаться.
Единственный нюанс: Следующая страница пытается загрузиться, не дождавшись загрузки предыдущей, из-за этого в тестовом режиме раскидал переходы на следующие страницы по кнопкам.
Отсюда вопрос, есть ли возможность дождаться загрузки страницы и только после этого выполнять код дальше?
28. foxey 4 17.08.15 09:56 Сейчас в теме
(23) А можно Ваш код посмотреть. Интересно, что там за переходы на страницы срабатывают...
Пробовал повоевать с другими флажками, чтобы уйти от трехкратного срабатывания события ДокументСформирован - не получилось.
Перем КнопкуЛогинаЕщеНеНажимали;

Процедура ПриОткрытии()
	КнопкуЛогинаЕщеНеНажимали = Истина;
	АдреснаяСтрока = "https://login.1c.ru";
	ЭлементыФормы.ПолеHTML.Перейти(АдреснаяСтрока);
КонецПроцедуры

Процедура ПолеHTMLДокументСформирован(Элемент)
	
	ТекстДокумента = ЭлементыФормы.ПолеHTML.ПолучитьТекст();
	Сообщить("onload:"+ЭлементыФормы.ПолеHTML.document.readyState);
	Если Найти(ТекстДокумента, "Личные данные") > 0 И КнопкуЛогинаЕщеНеНажимали Тогда
		// Это нужная страничка открылась... Найдем элемент HTML с логином и паролем, заполним их и нажмем кнопочку отправки формы на сервер.
		КнопкуЛогинаЕщеНеНажимали = Ложь;
		ЭлементыФормы.ПолеHTML.Документ.all("username").value = "user_name";
		ЭлементыФормы.ПолеHTML.Документ.all("password").value = "Pass";
		ЭлементыФормы.ПолеHTML.Документ.all("loginForm").submit();
		Сообщить("Нажимаем сабмит...");
	КонецЕсли;
	
КонецПроцедуры
Показать

Флаг ReadyState документа соответствует событию ДокументСформирован и равен "complete" в нашем обработчике. Короче, надо код глянуть. Если еще актуально, конечно же.
29. markovki 19 17.08.15 13:46 Сейчас в теме
(28) foxey, процедура при открытии:
ТолькоПросмотр = Истина;
	ЭтоПервыйПоказСтраницы = Истина;
    АдреснаяСтрока = "https://login.1c.ru";
    ЭлементыФормы.ПолеHTMLДокумента.Перейти(АдреснаяСтрока);

На форме кнопка:
	ЭтоПервыйПоказСтраницы = Ложь;
	Пауза(Время);
	АдреснаяСтрока = "https://releases.1c.ru/total";
	ЭлементыФормы.ПолеHTMLДокумента.Перейти(АдреснаяСтрока);
	Пауза(Время);
	АдреснаяСтрока = "https://releases.1c.ru/project/Accounting30";
	ЭлементыФормы.ПолеHTMLДокумента.Перейти(АдреснаяСтрока);
	Пауза(Время);
	АдреснаяСтрока = "https://releases.1c.ru/version_files?nick=Accounting30&ver=3.0.34.10";
	ЭлементыФормы.ПолеHTMLДокумента.Перейти(АдреснаяСтрока);
	Пауза(Время);
	АдреснаяСтрока = "https://releases.1c.ru/version_file?nick=Accounting30&ver=3.0.34.10&path=Accounting\3_0_34_10\updsetup.exe";
	ЭлементыФормы.ПолеHTMLДокумента.Перейти(АдреснаяСтрока);
// Далее подключаю код скачивания архива...
Показать

Пауза(Время) - пытался выполнить задержку исполнения кода - безрезультатно.
В итоге сделал кнопки на форме, для перехода по страницам т.е. в первой кнопке срабатывало:
ЭтоПервыйПоказСтраницы = Ложь;
	АдреснаяСтрока = "https://releases.1c.ru/total";
	ЭлементыФормы.ПолеHTMLДокумента.Перейти(АдреснаяСтрока);

В остальных по аналогии только ссылки разные.
25. Serega-artem 15 14.08.15 19:28 Сейчас в теме
(22) foxey, А имена полей вы просто угадали, или есть какая-то инфа на эту тему?
27. foxey 4 17.08.15 09:02 Сейчас в теме
(25)Имена полей посмотрел в исходнике страницы. Загрузил login.1c.ru в браузер, потом правым мышом - Просмотр кода страницы, ну а дальше - дело внимательности и знания HTML.
Serega-artem; +1 Ответить
26. Serega-artem 15 14.08.15 19:46 Сейчас в теме
И вот это, думаю, будет полезно ТС Публикация 255881
31. markovki 19 18.08.15 11:12 Сейчас в теме
(26) Serega-artem, видел эту публикацию, но пока не разобрался)
30. markovki 19 17.08.15 14:28 Сейчас в теме
ну и:
Процедура ПолеHTMLДокументСформирован(Элемент)
    
    ТекстДокумента = ЭлементыФормы.ПолеHTMLДокумента.ПолучитьТекст();
    Если Найти(ТекстДокумента, "Личные данные") > 0 И ЭтоПервыйПоказСтраницы Тогда
        // Это нужная страничка открылась... Найдем элемент HTML с логином и паролем, заполним их и нажмем кнопочку отправки формы на сервер.
        ЭтоПервыйПоказСтраницы = Ложь;
        ЭлементыФормы.ПолеHTMLДокумента.Документ.all("username").value = login;
        ЭлементыФормы.ПолеHTMLДокумента.Документ.all("password").value = pass;
        ЭлементыФормы.ПолеHTMLДокумента.Документ.all("loginForm").submit();
    КонецЕсли;
    
КонецПроцедуры
Показать
32. markovki 19 18.08.15 11:12 Сейчас в теме
Всем спасибо! Получилось! Сделал по нажатию кнопки с 3-х секундной паузой перед переходом на следующую страницу:
ЭтоПервыйПоказСтраницы = Ложь;
	АдреснаяСтрока = "https://releases.1c.ru/total";
	ЭлементыФормы.ПолеHTMLДокумента.Перейти(АдреснаяСтрока);
	Shell = Новый COMОбъект("WScript.Shell");
	ТаймаутВСекундах = 3;
	Пауза(Shell, ТаймаутВСекундах);
	АдреснаяСтрока = "https://releases.1c.ru/project/"+ТипКонфигурации+Редакция;
	ЭлементыФормы.ПолеHTMLДокумента.Перейти(АдреснаяСтрока);
    Пауза(Shell, ТаймаутВСекундах);
	АдреснаяСтрока = "https://releases.1c.ru/version_files?nick="+ТипКонфигурации+Редакция+"&ver="+ВерсияОбновленияКод;
	ЭлементыФормы.ПолеHTMLДокумента.Перейти(АдреснаяСтрока);
	Пауза(Shell, ТаймаутВСекундах);
	АдреснаяСтрока = "https://releases.1c.ru/version_file?nick="+ТипКонфигурации+Редакция+"&ver="+ВерсияОбновленияКод+­"&path="+ТипКонфигурации+"\"+ВерсияОбновленияЧерезНижнийСлеш­+"\updsetup.exe";
	ЭлементыФормы.ПолеHTMLДокумента.Перейти(АдреснаяСтрока);
    Пауза(Shell, ТаймаутВСекундах);
Показать

И сама процедура паузы:
Процедура Пауза(Shell, ТаймаутВСекундах)

    Shell.Run("ping 127.0.0.1 -n "+СокрЛП(Число(ТаймаутВСекундах)+1),0,1);

КонецПроцедуры

Не самый лучший вариант, хотелось бы конечно реализовать без использования ПолеHTMLДокумента, но тем не менее исправно работает
Оставьте свое сообщение
Вакансии
Программист 1С
Казань
зарплата от 150 000 руб.
Полный день

Программист 1С:ERP
Москва
зарплата от 100 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (удаленно)
Самара
зарплата от 230 000 руб. до 230 000 руб.
Полный день

Руководитель группы разработки 1С
Москва
зарплата от 250 000 руб. до 250 000 руб.
Полный день