|
|
|
| Уважаемые Господа!
Мне необходимо отслеживать состояние моих заказов с помощью сайта Поставщика через Internet Explorer в специальном поле– в ручную. Мне хотелось-бы автоматизировать этот процесс. Я предполагаю, что это возможно. Мои данные храняться в MS ACCESS. Для этого:
1. Из MS ACCESS я в автоматическом режиме (MS VISUAL BASIC) формирую HTML код во внешнем текстовом файле – этот код похож на код сайта Поставщика, но содержит номер моего конкретного заказа.
2. А как делать дальше я не знаю!
Хотелось бы запустить либо внутренний либо внешний модуль с параметром - созданного HTML файла.
Этот модуль должен запустить мой HTML файл, получить из Internet ответный HTML файл и сохранить его на диске в текстовом формате.
3. Затем я обработаю новый текстовый файл и внесу информацию в MS ACCESS.
Буду признателен за какую-либо информацию по 2 пункту. Вероятно задача сводится к написанию какого-то простейшего внешнего Internet Браузера, который просто сохраняет HTML код на жесткий диск. | |
|
|
|
|
|
|
|
для: VladimirL
(15.07.2009 в 11:48)
| |
<html>
<head>
<script>
function saveHTML(t) {
var fso, f1;
fso = new ActiveXObject("Scripting.FileSystemObject");
f1 = fso.CreateTextFile("C:\\html.html", true);
f1.Write(t);
f1.Close();
alert("File saved");
}
</script>
</head>
<body>
<iframe onload="saveHTML(as.document.body.innerHTML)" name="as" src="http://softtime.ru/forum/read.php?id_forum=4&id_theme=66587&page=1" width="0" height="0"></iframe>
</body>
</html>
|
Создайте эту страницу, но с расширением hta. Запустите, у вас на диске С появится файл с содержимым вашей темы. Соответственно, если вы будете запрашивать с сервера обычный текстовый файл, значит будет сохранен текст. Что дальше - кто и что должен открыть, что и чем обработать.... ничего не понял. | |
|
|
|
|
|
|
|
для: sim5
(15.07.2009 в 12:37)
| | Уважаемый sim5
Благодарю Вас за содействие в решен моего вопроса!
Если получится – с меня пузырь.
От меня требуется:
1. Зайти на сайт Поставщика
2. В специально отведенное поле ввести номер заказа
3. Нажать кнопку OK под этим полем
4. Дождаться обновления этого сайта – появится информация о этом заказе
5. Вручную перенести эту информацию в свою базу данных MS ACCESS.
И так весь день. Крышу сносит.
Но мне хотелось-бы поручить все эти операции компьютеру. Для этого я тупо скопировал сайт Поставщика на диск C:\ и написал модуль который автоматически его должен менять. В родном файле Поставщика есть строки:
<FORM name=PostItemSearchForm action=http://[ссылка] method=post>
<INPUT type=hidden value=search name=action>
<INPUT type=hidden value=Code name=searchType>
<INPUT type=hidden value=yes name=show_form>
Я предполагаю что эти строки должна как-то измениться - содержать конкретный Code и не требовать его ввода.
Таким образом измененный сайт Поставщика появится у меня на диске С:\, но при запуске в Internet Explorer он автоматически отправляет запрос в Internet и изображение в окне Internet Explorer меняется – содержит родной сайт Поставщика с информацией о моем заказе – его-то мне и надо сохранить. Дальше простой алгоритм, который позволяет из полного текстового файла HTML выбрать информацию о моем заказе и занести ее в MS ACCESS.
Т.е. необходим модуль, который автоматически запустить файл HTML с диска C:\ и сохранит файл который придет из Internet. | |
|
|
|
|
|
|
|
для: VladimirL
(15.07.2009 в 13:56)
| | Значит так. HTA-файл, это сообственно приложение, а не HTML-страница. Можете почитать для интереса о нем, например, тут. Из этого поймете, что вкупе с File System Object вы можете сохранять любые запрашиваемые из сети файлы, сохранять их, открывать для редактирования и т.п.. Но файлы, а не сайты, поэтому что значит "измененный сайт" на локале, мне не понятно. Можно и запускать приложения из HTA.
Что касается Code. Если это ваш код для авторизации, то никто вам не запрещает прописать его жестко в форме. К чему перекачивать весь сайт на локаль мне тоже не понятно, если трубуется одна страница с данными с него.
Ну и последнее, если вы написали модуль, который решает все вышеперечисленные проблемы, так какие проблемы? Послать запросом форму и получить ответ? | |
|
|
|
|
|
|
|
для: sim5
(15.07.2009 в 14:14)
| | Уважаемый sim5
Приношу свои извинения за то, что отнимаю Ваше время!
Возможно я коряво пишу…
Но буду очень признателен если Вы уделите мне еще немного!
В мои обязанности входит отследить состояние 1000 заказов в день. Code – это код заказа. Заказов – 1000.
Для этого я захожу на сайт Поставщика через Internet Explorer, в специальное поле вношу номер заказа, нажимаю ОК. При этом изображение в Internet Explorer меняется, т.е. дополняется информацией об этом конкретном заказе, а поле для ввода Кода заказа очищается. Я, вручную переношу информацию об этом заказе в свою базу. Затем я вбиваю Код следующего заказа … и так целый день.
Я умею создавать и читать текстовые файлы из MS ACCESS с помощью MS VISUAL BASIC и запускать приложения, а, вот с программированием в Internet у меня проблемы, надеюсь, что это не навсегда. Например, если в HTML есть <INPUT type=hidden value=Code name=searchType> то должно быть и чтот-то типа <LET Code=111111>
Сайт поставщика не позволяет мне создать нормальный внешний запрос и получить нормальный ответ! Все операции я могу выполнять только в интерактивном режиме. Ответ – состояние моих заказов я могу видеть только на его странице в Internet Explorer среди прочей рекламной …
Благодарю за ссылку по НТА
Предложение с пузырем в силе… | |
|
|
|
|
|
|
|
для: VladimirL
(15.07.2009 в 15:05)
| | приведите полный код страницы, на которой вы вводите номера заказов | |
|
|
|
|
|
|
|
для: VladimirL
(15.07.2009 в 15:05)
| | Я вам даю немного иной код. Опять его сохраните с расширением HTA. В форме пропишите реальный action, и введите необходиме значения в полях формы, с каким либо номером заказа. Выполните, и проверьте - сохранит ли страницу с требуемым заказом вашим на диске С:. Если да, то так понимаю, вам это нужно, значит достаточно дополнить скрипт необходимыми дополнительными методами и все будет работать.
<html>
<head>
<script>
function saveHTML(t) {
var fso, f1;
fso = new ActiveXObject("Scripting.FileSystemObject");
f1 = fso.CreateTextFile("C:\\html.html", true);
f1.Write(t);
f1.Close();
alert("File saved");
}
</script>
</head>
<body>
<form action="ваш url"
method="post" onsubmit="this.setAttribute('target','as');">
<INPUT type='hidden' value='search' name='action'>
<INPUT type='hidden' value='Code' name='searchType'>
<INPUT type='hidden' value='yes' name='show_form'>
<input type="submit" value="Send">
</form>
<iframe onload="saveHTML(as.document.body.innerHTML)" name="as" width="0" height="0"></iframe>
</body>
</html>
|
Жмете Send, сервер должен вернуть необходимое в iframe, а по окончании загрузки страницы запись в файл. Пробуйте. | |
|
|
|
|
|
|
|
для: sim5
(15.07.2009 в 15:24)
| | Уважаемый sim5 !
Благодарю за оказанное содействие!
Ваш код РАБОТАЕТ! (отправил благодарственное письмо)
Меня немного высадил (всего на 5 асов) Kaspersky Internet Security 7.0 с файлом mshta.exe (Как выяснилось: HTA файл – это пакет команд и операторов для приложения mshta.exe).
К сожалению, мне пока не удалось избавиться от нажатия кнопки Send. Предполагаю, что в дальнейшем, при внесения обработки принятого сайта и формировании чистого информационного текстового файла CSV в модуле НТА (алгоритм PAT он же CNT) этот вопрос снимется.
Если Вас не затруднит, прошу Вас рекомендовать тонкий справочник (список команд, краткое описание, короткие примеры) и способ его приобретения для реализации моих задач (интуитивно править чужие коды тяжело) | |
|
|
|
|
 598.3 Кб |
|
|
для: VladimirL
(16.07.2009 в 10:40)
| | Я получил письмо. Если бутылка, которую вы хотите отправить, в дюймах соответствует диаметру вашего ТФ-кабеля, можете ее переслать почтой на мой электронный адрес. :)
Конечно, кнопка SUBMIT в форме не обязательна, все можно сделать иначе, полная форма была приведена для проверки.
Чтобы знать как все можно устроить, это JavaScript, JScript, WSH. В приложении CHM файл описывающий все это, на русском, но примеры все на VB, JScript 5 с примерами на JScript (тот же JavaScript в основе), но описание английское. | |
|
|
|
|
|
|
|
для: VladimirL
(15.07.2009 в 15:05)
| | Если имеются следующие данные:
1) URL сайта Поставщика
2) Текстовой файл zakaz.txt, где построчно перечислены
номера (идентификаторы) вашей тысячи заказов
| то вполне реально сделать HTA-приложение,
которое можно запускать или вручную, или через планировщик задач
(в нужное для вас время суток и по дням недели), и которое, работая в автономном режиме,
создаст/обновит на вашем компьютере в выбранной вами папке текстовой файл,
который будет в нужном вам виде сохранять нужную вам информацию
об этой тысяче ваших заказов (или, если будет угодно,
ТЫСЯЧУ текстовых файлов - по одному на каждый заказ).
Работающий пример такого HTA-приложения см. здесь
(CNT - мой старый никнейм).
PS. Кроме того, данные из сформированного текстового файла/файлов вполне
можно в автоматическом режиме перегнать в Exel (делал это неоднократно).
Знаю, что аналогичным способом можно перегнать и в Access (но с этим приложением
я лично не работал). | |
|
|
|
|
|
|
|
для: PAT
(15.07.2009 в 15:30)
| | >(CNT - мой старый никнейм).
Извините, пожалуйста, за оффтопик и личный вопрос...
А зачем Вы сменили ник? | |
|
|
|
|
|
|
|
для: Trianon
(15.07.2009 в 23:50)
| | Пароль забыл, вот и пришлось сменить :-) | |
|
|
|
|
|
|
|
для: PAT
(15.07.2009 в 15:30)
| | Уважаемый PAT !
Благодарю за сотрудничество!
Собственно этого и очень хочется!
В выходные обязательно посмотрю Ваш код.
Радует, что в НТА файле можно как-то обрабатывать текст принятого сайта (файла) и формировать сводный чистый TXT (CSV). Но сколько и каких языков Internet программирования для этого нужно выучить? | |
|
|
|
|
|
|
|
для: PAT
(15.07.2009 в 15:30)
| | Уважаемые Господа!
Очень не хочу выглядеть тупым занудой, но я капитально застрял.
Пытаюсь реализовать алгоритм, описанный г-ном PAT, т.е есть файл zakaz.txt, пишу файл HTA, где прописан URL хочу файл CNT.TXT.
Но вот засада!
Для того, что-бы получить в iframe копию сайта поставщика с информацией о конкретном заказе я должен выполнить HTML код, описанный выше г-ном sim5:
<form action="ваш url" … </form>
Но как организовать цикл, который менял-бы в этом <form> код конкретного заказа
<INPUT type='hidden' value='1111111111' name='searchType'>
из файла zakaz.txt (прочитать построчно файл zakaz.txt с этими номерами у меня получилось благодаря справочников г-на sim5)
2. Как избавиться от ручного нажатия кнопки <input type="submit" value="Send"> и автоматически отправить этот <form> в Internet.
Т.е. не получается по алгоритму PAT:
document.all._ifr.src = document.all._url.value;
В iframe я пытаюсь получить не просто _url а ответ на целы тег <form>, да еще с конкретным значением номера заказа.
Я предполагаю, что этот <form> надо автоматически собирать в другом месте и как-то хитро засылать в Internet.
Уважаемый PAT!
Если Вас не затруднит, подскажите пожалуйста, а почему нет этой строки
onload = function () {document.all._ifr.attachEvent ('onload', f2)}
в нижнем примере?
Благодарю Вас за сотрудничество.
P.S. Буду очень признателен за подсказку: каким оператором построчно читать содержимое HTML файла в iframe в символьную переменную в <script>. | |
|
|
|
|
|
|
|
для: VladimirL
(21.07.2009 в 08:43)
| |
<html>
<head>
<script>
var fso = new ActiveXObject("Scripting.FileSystemObject"); //файловый объект
//папка для хранения, где User пользователь
var folder = "C:\\Documents and Settings\\User\\Мои документы\\Orders\\";
var ext = ".txt"; //расширение файлов
var orders = new Array(); //массив заказов
var n = 0; //счетчик
var flag = false; //флаг запроса
//создание папки, если не создана
if (!fso.FolderExists(folder)) fso.CreateFolder(folder);
function runSave() {
//получение массива заказов из строки
//формат записи NNNN,NNNN-NNNN,NNNN,NNNN,....NNNN
var ord = document.getElementById("order").value;
ord = ord.split(",");
for(i=0; i<ord.length; i++) {
if(ord[i].indexOf("-") != -1) {
var len = ord[i].split("-");
for(k=len[0]; k<=len[1]; k++) orders[orders.length] = k;
} else orders[orders.length] = ord[i];
}
flag = true; //разрешаем запрос
tm = setInterval("getOrders()",5000); //опрос состояния запроса
getOrders();
}
function getOrders() {
if (flag) {
if (n < orders.length) {
flag = false; //запрещаем запрос
//указываем номер заказа
document.getElementById("code").value = orders[n];
//отправляем форму
document.getElementById("frm").submit();
n++;
} else {
clearInterval(tm);
n = 0; flag = false; //запрещаем запрос
document.getElementById("info").innerHTML = "Запись заказов окончена!";
}
}
}
function saveHTML(t) {
if(t) {
var name = orders[n-1]+ext;
var f1;
f1 = fso.CreateTextFile(folder+name, true);
f1.Write(t);
f1.Close();
flag = true; //разрешаем очередной запрос
document.getElementById("info").innerHTML = "Заказ №"+orders[n-1]+" успешно сохранен!";
}
}
</script>
</head>
<body>
<form action="URL" target="frame" method="post" name="frm" id="frm" style="display: none;">
<INPUT type="hidden" value="search" name="action">
<INPUT type="hidden" id="code" name="searchType">
<INPUT type="hidden" value="yes" name="show_form">
</form>
<iframe onload="saveHTML(frame.document.body.innerHTML)" name="frame" width="0" height="0"></iframe>
Номера заказов: <input type="text" id="order"> <input type="button" value="Запись" onclick="runSave()">
<div id="info"></div>
</body>
</html>
|
Не надо никакой SUBMIT, в примере она была для проверки. Вот здесь, форма будет отправляться скриптом, через функцию. Я не знаю вашего сценария, которым вы хотите запускать все. Здесь, для примера, запуск происходит кнопкой "Запись", которая обращается к функции runSave(). В ней формируется массив номеров заказов и происходит запуск процесса.
В поле заказов номера вводятся через запятую (в конце последнего номера в строке, запятую не прописывать), можно и диапазон, если они упорядоченные, то есть, например, 11111-18006,18009,18015-18025 и т.д.. Далее запускается таймер проверяющий флаг запроса к серверу, и, если он установлен, то происходит запрос и запись ответа в файл.
Вся эта кухня работает типа Ajax, вы отправляете форму, и указывате куда поместить ответ сервера, в IFARME, он в свою очередь, после загрузки документа, отдает содержимое его на запись. Другими словами, хотя в HTA содержимое, это html-страница, ее остальные элементы не будет перезагружаться, так что можно выводить на экран и другую сопутствующую информацию.
PS. Вот только время повторения запросов к серверу нужно будет подобрать, чтобы вас не забанили за частые запросы. | |
|
|
|
|
|
|
|
для: sim5
(21.07.2009 в 09:46)
| | Уважаемый sim5
Благодарю Вас за сотрудничество!
Я Восхищен Вашим программным кодом! Я так не напишу никогда… Практически все понятно.
Если Вы можете уделить мне еще некоторое время, то я хотел-бы задать еще 3 вопроса.
1. Если я общаюсь с сайтом Поставщика по Договору (он меня не должен забанить за частые запросы) можно-ли установить tm = setInterval("getOrders()",5000); //опрос состояния запроса
не 5000, а 0.
2. Можно ли, особо не усложняя алгоритм, перенести t (function saveHTML(t)) в одномерный массив строковых значений, где в каждом элементе будет соответствующая текстовая строка кода ответного HTML. Сейчас я, используя Вашу программу записываю этот код во временный файл, тут-же его открываю для чтения в построчном режиме, строки обрабатываю, и стираю, а полученную информацию добавляю в конечный файл. Эту обработку я планирую вставить перед строкой n++; в function getOrders(), т.е. Пока грузится новый запрос обрабатывается предыдущий временный файл.
3. Я понимаю, что вопрос не корректный, но не могли-бы Вы подсказать мне правильное соответствие строковых функций: Длина (Len()), Право(Right()), Середина (substr(,)) и т.д.
Благодарю Вас за сотрудничество,
С уважением,
Владимир
PS. Подскажите пожалуйста, недорогой простой редактор для HTML кода, а то в Блокноте писать и искать свои ошибки трудновато. | |
|
|
|
|
|
|
|
для: VladimirL
(22.07.2009 в 11:39)
| | 1. Ноль ставить смысла нет, так как за такое время сделать запрос на сервер и получить ответ от него, вы не сможете. Да и за 5 сек, указаных в таймере, вы его не получите. Таймер просто постоянно проверяет флаг, а он устанавливается в true (разрешение очередного запроса) после приема документа с сервера. Грубо говоря, вы будете делать запросы на сервер с той переиодичностью, с которой он вам отвечает. Если это нормально, пусть так и останется. А ведь сервер может и задержать ответ, и преждевременно делать очередной запрос, значит не получить предыдущий документ.
2. Сперва нужно получить документ, а потом уже обрабатывать. Нет проблемы добавить обработку полученного документа, распарсить его как требуется, даже вставить в окно и пред. просмотр его, и записать готовый формат, если это Access .dbf, то проблем не будет. Но заниматься этим должны уже другие функции, не относящиеся к получению и записи страницы, а чтобы это сделать, нужно видеть исходник полученной страницы, знать, что из нее забирать и в какой формат записывать. То есть увидеть два документа - полученную страницу, и то, что из нее получается в Access.
3. Что значит соответствие строковых функций? Как это понимать?
Notepad++ - бесплатный расширенный Блокнот с подсветкой ситаксиса многих языков программирования. | |
|
|
|
|
|
|
|
для: sim5
(22.07.2009 в 12:27)
| | Уважаемый sim5
Сердечная благодарность за Вашу помощь! (правильнее сказать за Ваш программный код!)
Все СУПЕР.
Ответ сервера (а он приходит только на один заказ) я пишу во временный файл. Потом, построчно ищу что-то знакомое с помощь if (stroka.substring(0, ххх)=’hhhhhhhhhhhh’) – типа Left(ххх) и .substring(ххх,0)-типа Right(xxx). Если нашел – получаю данные и дописываю их в txt-файл. Затем следующий запрос к серверу. В итоге – один файл, в котором, каждая строка- информация об одном заказе. Это, может и не правильно, с точки зрения программирования и громоздко, но Работает.
Теперь начал изучать SQL-запросы, что-бы внести эту информацию в существующие таблицы в определенные поля, заменив при этом устаревшую информацию.
Еще раз огромное Спасибо,
С уважением,
Владимир
P.S. Жду Ваше письмо! | |
|
|
|
|
|
|
|
для: VladimirL
(27.07.2009 в 17:18)
| | Ну почему громоздко? Если вам все надо в одном файле строками, то пишите, почему это не правильно? Делайте так как удобно вам будет для работы с этим файлом.
В СНМ файлах есть описание метода записи строк и чтения строк из файла, и коли вам нужно работать именно со строками, то все вполне оправдано.
Письмо о чем? :) | |
|
|
|
|