Имя: Пароль:
1C
 
Как скачать файл из инета?
0 recommend
 
05.11.08
08:29
Есть задачка
надо заполнить в инете форму и получить текстовый файл с прайсом
и Сохранить его на диске.

Лазить а инет, читать страницы и заполнять формы
Вроде как понятно:

objIE = СоздатьОбъект("InternetExplorer.Application");
objIE.Visible = 0;
objIE.Silent = 0;
objIE.Navigate(Адрес);
Пока objIE.readyState<4 Цикл // Ждем пока она загрузится
КонецЦикла;
obj Doc = objIE.Document;

objForm = objDoc.forms(0); // Получаем первую форму в документе
objForm.elements("query").value = "cc"+сокрЛП(арт);
objForm.submit();

Как
Получить и сохранить файл ума не приложу
Подскажите кто сталкивался
1 Дядя Васька
 
05.11.08
08:31
Через v7plus по ссылке на файл...
2 recommend
 
05.11.08
08:39
на файл сылки не он дается в ответ на заполнение формы.
Кроме того
Чтобы попасть на страницу с формой надо пройти
еще ряд форм (в том числе и с паролями)
Это удобнее делать в InternetExplorer.Application
3 FN
 
05.11.08
09:19
Присоединюсь к вопросу автора - сам когда пытался - ничего не получилось.
4 Дядя Васька
 
05.11.08
09:24
(2) Ну заполнив страничку в том числе и с паролями ты же получишь ссылку на другую страничку, где будет прямая ссылка на файл? Вот тогда в7плюсом ее и подхватывай.
5 recommend
 
05.11.08
09:41
Как я уже писал прямой ссылки на файл нет.
Просто принажатии на субмит появляется предложение сохранить
файл (Это не редкость)
6 ДенисЧ
 
05.11.08
09:42
А если посмотреть на код формы и руками сформировать соответствующий GET (или POST) запрос?
7 recommend
 
05.11.08
09:45
Это без проблем

вопрос как написать команду
СОХРАНИТЬ ФАЙЛ
8 ДенисЧ
 
05.11.08
09:46
(7) Ээээ...
Посылаешь сформированный запрос. В ответ приходит файл с именем файла в кладжах...
9 recommend
 
05.11.08
09:49
Что то я торможу
можно подробне  
что надо дописать к (1)
чтобы программа знала куда сохранить файл?
10 FN
 
05.11.08
09:53
(9) Тебе советуют примерно это:
HTTPСоединение = СоздатьОбъект("Addin.v7httpReader");

HTTPСоединение.Получить( "http://твой.сайт","c:\супер_мега.файл", 1);
11 recommend
 
05.11.08
10:26
(6) А разве в
Addin.v7httpReader
можно сформировать POST Запрос?

Верно ли то, что в
InternetExplorer.Application
впринципе нельзя скачать файл?
12 recommend
 
05.11.08
12:19
Верно ли то, что в
InternetExplorer.Application
в принципе нельзя скачать файл?
13 FN
 
05.11.08
12:58
Апну, вместо автора ветки...
14 smaharbA
 
05.11.08
12:58
(12) нет не верно
15 FN
 
05.11.08
13:03
(14)ООООО!!!!!
smaharbA, поделись опытом! В частности я не могу решить проблему:
есть сайт с авторизацией - там картинка с цифрами - хочу ее показывать в 1С (ну сохранить из окна IE), а потом с сайта *.csv качать.

не умею:
1. Сохранять файлы с помощью IE
2. Сохранять картинки с загруженой страницы
16 FN
 
05.11.08
13:04
P.S. Весь Инет перерыл - не нашел (может плохо искал), на msdn тоже ничего вразумительного. Я так понимаю что тут можно скриптиками как-то, а вот как?
17 NikVars
 
05.11.08
13:22
18 recommend
 
05.11.08
13:27
(17) Это читает страницу и распознает теги
но файлы не сохраняет
19 recommend
 
05.11.08
13:31
objIE = СоздатьОбъект("InternetExplorer.Application");
   objIE.Visible = 1;
   objIE.Silent = 0;
   objIE.Navigate(Адрес);
   Пока objIE.readyState < 4 Цикл // Ждем пока она загрузится
   КонецЦикла;  
   
   objIE.ExecWB(4, 2 , "c:\ff.txt" );

Вот что у меня получилось:

ExecWB - Выполняет команду и возвращает статус выполнения. Доступен в InternetExplorer и WebBrowser.

4 Меню "Файл" - "Сохранить как...".
2 Не запрашивать ввод пользователя (не задается никаких вопросов).


только есть маленькая проблемма
2 - работает как-то не так

Просит нажать СОХРАНИТЬ
20 NikVars
 
05.11.08
13:53
21 smaharbA
 
05.11.08
13:59

objIE = СоздатьОбъект("InternetExplorer.Application");
objIE.Visible = 1;
objIE.Silent = 0;
objIE.Navigate(Адрес);
Пока objIE.readyState < 4 Цикл // Ждем пока она загрузится

КонецЦикла;  
Стр=objIE.document.body.innerHTML;
Предупреждение(Стр);
22 smaharbA
 
05.11.08
13:59
Но это не серьезно, метод стар как адо
23 smaharbA
 
05.11.08
14:02
Можно и из ИЕ

   Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
   Скрипт.language="vbscript";
   Имя="Имя";
   Пароль="Пароль";
   УРЛ="http://Как скачать файл из инета?";
   x =CreateObject("Microsoft.XMLHTTP");
   x.Open("GET", СокрЛП(УРЛ), 1,Имя,Пароль);
   x.Send();
   к=_GetPerformanceCounter();

   Пока x.Status<>200 Цикл
       //Если _GetPerformanceCounter()-к>=2000 Тогда
       //    Сообщить("Страница "+УРЛ+" неотвечает. Пипец!","!!!");
       //КонецЕсли;
       Состояние("Ждем...");
   КонецЦикла;
   ВвестиСтроку("","",1,,2);
   s = CreateObject("ADODB.Stream");
   s.Mode = 3;
   s.Type = 1;
   s.Open();
   Скрипт.AddObject("s",s);
   Скрипт.AddObject("x",x);
   Предупреждение(x.responseText);
   Скрипт.Eval("s.Write(x.responseText)");
   Сообщить(s.size);
   s.SaveToFile("C:\download", 2);
24 smaharbA
 
05.11.08
14:05

Функция ПреобразованиеБинаровВТекст(Объект)
   Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
   Скрипт.language="javascript";
   РекордСет=СоздатьОбъект("ADODB.Recordset");
   Объект.position=0;
   Скрипт.AddObject("Объект",Объект);
   Скрипт.AddObject("РекордСет",РекордСет);
   РекордСет.Fields.Append("txt", 200, Объект.Size, 128);
   РекордСет.Open();
   РекордСет.AddNew();
   Скрипт.Eval("РекордСет.Fields('txt').AppendChunk(Объект.Read)");
   Стр=РекордСет.Fields("txt").Value;
   РекордСет.Close();
   РекордСет=0;
   Возврат Стр;
КонецФункции

//*******************************************
Процедура Сформировать()
   Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
   Скрипт.language="javascript";
   //УРЛ="http://build.kaliningrad.net/";//build.kaliningrad.net
   //УРЛ="http://theatre.krasnoyarsk.ru/";
   УРЛ="http://www.maxbank.ru/";
   УРЛ="http://www.yandex.ru/";//build.kaliningrad.net
   ХТТПЗапрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
   Скрипт.AddObject("ХТТПЗапрос",ХТТПЗапрос);
   Скрипт.Eval("ХТТПЗапрос.Option(2)='windows-1251'");
   //Скрипт.Eval("ХТТПЗапрос.Option(2)='KOI8-R'");
   ХТТПЗапрос.Open("GET", УРЛ, 0);
   ХТТПЗапрос.SetRequestHeader("Accept-Language", "ru");
   ХТТПЗапрос.SetRequestHeader("Accept-Charset", "Windows-1251");
   //ХТТПЗапрос.SetRequestHeader("Accept-Charset", "KOI8-R");
   ХТТПЗапрос.setRequestHeader("Accept-Encoding", "gzip, deflate");
   ХТТПЗапрос.setRequestHeader("Content-Language", "ru");
   ХТТПЗапрос.setRequestHeader("Content-Charset", "Windows-1251");
   //ХТТПЗапрос.setRequestHeader("Content-Charset", "KOI8-R");
   ХТТПЗапрос.setRequestHeader("Content-Encoding", "gzip, deflate");
   ХТТПЗапрос.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=Windows-1251");
   ХТТПЗапрос.setRequestHeader("CACHE_CONTROL", "no-cache");
   ХТТПЗапрос.setRequestHeader("CONNECTION", "Keep-Alive");
   ХТТПЗапрос.setRequestHeader("USER_AGENT", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)");
   ХТТПЗапрос.Send();
   к=_GetPerformanceCounter();
   Пока ХТТПЗапрос.Status<>200 Цикл
       Если _GetPerformanceCounter()-к>=2000 Тогда
           Сообщить("Страница "+УРЛ+" неотвечает. Пипец!","!!!");
       КонецЕсли;
       Состояние("Ждем...");
   КонецЦикла;
   Стрим = СоздатьОбъект("ADODB.Stream");
   Стрим.Mode = 3;
   Стрим.Type = 1;
   Стрим.Open();
   Скрипт.AddObject("Стрим",Стрим);
   Скрипт.Eval("Стрим.Write(ХТТПЗапрос.responseBody)");
   Стр=ПреобразованиеБинаровВТекст(Стрим);
   //Предупреждение(Стр);
   Стрим.Close();
   ХТМЛ = СоздатьОбъект("htmlfile");
   ХТМЛ.Open("text/html");
   ХТМЛ.write(Стр);
   Док=ХТМЛ.documentElement.document;
   Кодировка="";
   //Заголовок=ХТМЛ.documentElement.childNodes.item(0).childNodes;
   Мета=ХТМЛ.getElementsByTagName("meta");
   Для к=0 По Мета.length-1 Цикл
           Атрибуты=Мета.item(к).attributes;
           Контент=0;
           Для ат=0 По Атрибуты.length-1 Цикл
               Если (Нрег(СокрЛП(Атрибуты.item(ат).nodeName))="http-equiv") И (Нрег(СокрЛП(Атрибуты.item(ат).nodeValue))="content-type") Тогда
                   Контент=1;
                   Прервать;
               КонецЕсли;
           КонецЦикла;
           Для ат=0 По Контент*Атрибуты.length-1 Цикл
               Если (Нрег(СокрЛП(Атрибуты.item(ат).nodeName))="content") И (ПустоеЗначение(Атрибуты.item(ат).nodeValue)=0) Тогда
                   Кодировка=СокрЛП(Атрибуты.item(ат).nodeValue);
               КонецЕсли;
           КонецЦикла;
   КонецЦикла;
   Кодировка=Нрег(СтрЗаменить(Кодировка," ",""));
   к=Найти(Кодировка,"charset=");
   Если к>0 Тогда
       Кодировка=Сред(Кодировка,к+8);
   КонецЕсли;
   //Предупреждение(Кодировка);
   Стрим.Mode = 3;
   Стрим.Type = 2;
   Стрим.charset = "windows-1251";
   Стрим.Open();
   Стрим.WriteText(Стр);
   Стрим.position=0;
   Попытка
       Стрим.charset = Кодировка;
   Исключение
       Стрим.charset = "windows-1251";
   КонецПопытки;
   ХТМЛ.Close();
   ХТМЛ.Open("text/html");
   ХТМЛ.write(Стрим.ReadText());
   Стрим.Close();
   Док=ХТМЛ.documentElement.document;
   Текст="";
   Для к=0 По Док.getElementsByTagName("a").length-1 Цикл
       Текст=Текст+Док.getElementsByTagName("a").item(к).href+РазделительСтрок;
   КонецЦикла;
   Сообщить(Текст);
   //Предупреждение(ХТМЛ.documentElement.innerHTML);
   ИЕ=СоздатьОбъект("InternetExplorer.Application");
   ИЕ.Navigate(УРЛ);
   Пока ИЕ.ReadyState<4 Цикл
       ВвестиСтроку("","",1,0,1);
   КонецЦикла;
   Док=ИЕ.document;
   Предупреждение(Док.body.innerHTML);
   Предупреждение(Док.body.Text);
   ///Стрим.SaveToFile("C:\index.html", 2);
КонецПроцедуры
25 recommend
 
05.11.08
14:06
(21) Это хорошо для txt
скажем для Zip-ников или др. бинарников
было бы не плохо что-то типа (19)
только без дополнительных вопросов
26 smaharbA
 
05.11.08
14:07
(25)

//*******************************************
Процедура Сформировать()
   Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
   Скрипт.language="javascript";
   //УРЛ="http://www.yandex.ru/";
   ХТТПЗапрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
   Скрипт.AddObject("ХТТПЗапрос",ХТТПЗапрос);
   ХТТПЗапрос.Open("GET", СокрЛП(УРЛ), 0);
   ХТТПЗапрос.Send();
   к=_GetPerformanceCounter();
   Пока ХТТПЗапрос.Status<>200 Цикл
       Если _GetPerformanceCounter()-к>=2000 Тогда
           Сообщить("Страница "+УРЛ+" неотвечает. Пипец!","!!!");
           Возврат;
       КонецЕсли;
       Состояние("Ждем...");
   КонецЦикла;
   Стрим = СоздатьОбъект("ADODB.Stream");
   Стрим.Mode = 3;
   Стрим.Type = 1;
   Стрим.Open();
   Скрипт.AddObject("Стрим",Стрим);
   Скрипт.Eval("Стрим.Write(ХТТПЗапрос.responseBody)");
   Стрим.SaveToFile("C:\download", 2);
   Стрим.Close();
КонецПроцедуры
27 NikVars
 
05.11.08
14:14
28 recommend
 
05.11.08
14:30
(27) здесь описана та же проблема что и в (19)

Некоторые мысли:
Запароленные страницы это серьезно. С точки зрения пользователя браузера ввел пароль и все. Реально же могут писаться Куки , отслеживаться сессии, последовательности страниц и разные др. параметры.

В свете этого использование объекта
objIE = СоздатьОбъект("InternetExplorer.Application");
казалось мне предпочтительней.
По крайней мере из соображения удобства настройки
в случае отказа в доступе сразу видно где проблема.

Посему хотелось бы закрыть вопрос по использованию InternetExplorer.Application
Для скачивания файлов.
Знает ли кто как там сохранить файл не нажимая СОХРАНИТЬ???
29 smaharbA
 
05.11.08
14:38
(28) и запароленые странички скачиваются, смотри внимательно приведенные коды, работает и метод POST
30 NikVars
 
05.11.08
14:40
(29) Меня интересуют вопросы интерграции 1С и всего другого, но я действительно удивлен, что так проблемно работать с Эксплорером!!! Воистину, чем чаще вижу прогу, тем сложнее должна быть с ней работа...
31 smaharbA
 
05.11.08
14:52
с эксплорера тоже можно сохранять, но там будут действовать ограничения на доступ к данным из другого домена, если начхать на это, то поправить в реестре либо флажочками, но тогда любой злодей будет писать на локальный и с локального диска
32 NikVars
 
05.11.08
14:54
Глупая идея! А что если установить эти флажки программно, записать и снять эти флажки?!
33 smaharbA
 
05.11.08
14:56
(32) а зачем ие мучать по этому поводу, есть ведь библиотеки для этого специально дядей Билли придуманные ?
34 NikVars
 
05.11.08
14:58
(33) Согласен. Может именно поэтому они и придуманы!
35 FN
 
05.11.08
19:09
smaharbA, спасибо огромное!
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн